不同于其他行业和职位的面试,java程序员职位面试是利用面试问题来调查候选人java的基本功更注重java的基本知识。面试涉及广泛的知识。今天,本文将总结10个常规考试java队列面试题,因为java队列的知识也属于基本内容,希望有面试需要的朋友能学习以下内容。
1、如何保证消息的有序性??
答:RabbitMQ:拆分多个queue,每个queue都有更多的consumer 只是queue,真的很麻烦;或者只是一个queue,但对应于一个consumer,然后这个consumer用内存队列排队,然后分发给底层不同的worker 来处理。
Kafka:比如我们建了一个topic,有三个partition。制作人在写作时,其实可以指定一个key,比如我们指定一个订单id作为key,那么这个订单相关的数据,一定会分发到同一个partition中,而且这个partition中的数据一定是有序的。然后写n个内存queue,有相同的key 数据到同一内存queueue;然后对于N个线程,每个线程可以消耗一个内存queue,以确保顺序。
2、为什么要使用消息队列?
答:消息队列可以剥离系统的异步功能,减少功能耦合,提供开发效率;
消息队列可以削峰限流,保证下游消费者的稳定运行。总而言之,它是解耦、异步和削峰。
3、消息队列的缺点是什么?
答:(1)系统可靠性降低。解耦后,多个系统通过消息中间件交互,整个系统挂在消息中间件上;
(2)系统开发的复杂性需要考虑新闻的处理,包括新闻权力(重复消费问题)、新闻秩序保护(一个订单多个新闻问题)、新闻中间件本身的持久性和稳定性可靠性;
(3)消息一致性问题,如果一个功能发送到多个系统,所有系统都成功实施,需要确保多个功能消息的完整性一致性。
4、消息队列推拉模式有什么区别?
答:(1)push模式:推送模式是指客户端与服务端建立网络长连接,服务方有相关数据,通过长连接渠道直接推送到客户端。其优点是及时,一旦数据发生变化,客户端可以立即感知;此外,对于客户端来说,逻辑很简单,不需要关心是否有数据。缺点是不知道客户端的数据消费能力,可能会导致客户端数据积压,没有时间处理。此外,服务端保持push状态(哪些客户端发送成功,哪些发送不成功)。push状态集中在服务端,负载平衡由服务端统一处理。
(2)pull模式:客户端主动从服务端轮询提取数据。其优点是推送模式中没有数据积压问题。因此,缺点是可能不够及时。对于客户端,需要考虑数据提取的相关逻辑,这就要求客户端保持pull状态(以便在故障重启时恢复)。pull状态分散在客户端,负载平衡由客户端部署(如使用)zookeeper)。
5、如何保证MQ系统的数据不丢失?
答:生产阶段:消息队列通常使用确认机制,以确保消息的可靠传输:当您的代码调用发送消息的方法时,消息队列的客户端将发送消息Broker,Broker接到消息后会返回客户端进行确认。只要Producer收到Broker的确认响应,就能保证消息在生产阶段不会丢失。在长时间没有收到发送的确认响应后,一些消息队列将自动重新测试。如果重新测试失败,将返回值或以异常方式返回给客户端。因此,在编写发送消息的代码时,需要正确处理发送消息的返回值或异常,以确保消息在此阶段不会丢失。
存储阶段:如果对消息可靠性有很高的要求,可以通过配置Broker参数避免因停机而丢失消息。对于单个节点Broker,需要配置Broker参数。收到消息后,将消息写入磁盘,然后将确认响应返回Producer。如果是Broker集群,则需要将Broker集群配置为:至少两个节点收到消息,然后向客户发送确认响应。
消费阶段:消费阶段采用与生产阶段相似的确认机制,确保消息的可靠传递。Consumer收到消息后,需要在执行消费逻辑后发送确认消息。
6、ArrayBlockingQueue和LinkedBlockingQueue有什么区别?
答:ArrayBlockingQueue和LinkedBlockingQueue都实现了自阻塞队列 BlockingQueue,它们的区别主要体现在以下几个方面:
(1)ArrayBlockingQueue 使用时必须指定容量值,LinkedBlockingQueue 不需要指定;
(2)ArrayBlockingQueue 使用时指定最大容量值,指定后不得修改;而且 LinkedBlockingQueue Integer最大容量.MAX_VALUE;
(3)ArrayBlockingQueue 数据存储容器采用数组存储; LinkedBlockingQueue Node节点用于存储。
7、Queue和Deque 有什么区别?
答:Queue属于一般队列,Deque属于双端队列。一般队列先进先出,即只有先进才能先出;双端队列可以在两端插入和删除元素。
8、Java 常见的阻塞队列有哪些?
答:Java常见的阻塞队列如下:
(1)ArrayBlockingQueue,由数组结构组成的有界阻塞队列;
(2)PriorityBlockingQueue,无限阻塞队列支持优先级排名;
(3)SynchronousQueue,它是一个不存储元素的阻塞队列,将直接将任务交给消费者,必须等到队列中的添加元素被消耗后才能继续添加新元素;
(4)LinkedBlockingQueue,由链表结构组成的阻塞队列;
(5)DelayQueue,无限阻塞队列支持延迟获取元素。
9、有界队列和无界队列有什么区别?
答:有界队列和无界队列的区别如下:
有界队列:有固定大小的队列称为有界队列,例如:new ArrayBlockingQueue(6),6是队列的大小。
无界队列:指没有固定大小的队列,可以直接列入,直到溢出。它们并不是真的无界,它们的最大值通常是 Integer.MAXVALUE,只是很少使用这么大的容量(超过 Integer.MAXVALUE),因此,从用户体验来看,相当于 “无界”。
10、LinkedList属于一般队列还是双端队列?
答:LinkedList实现了Deque属于双端队列,因此拥有addfirstt(E)、addLast(E)、getFirst()、getLast() 等方法。
以上的10道题是今天为大家整理的java队列面试题,涉及到比较基础的内容。java零基础的小白也可以从这些题目中学习,为以后打下基础。
消息队列中间件是分布式系统的重要组成部分,主要解决方案了应用耦合、异步消息和流量削锋等问题,是大型分布式系统中不可缺少的中间部件,所以面试官还是比较重视的我希望你能学习java队列的知识java培训课程在这个过程中,多加注意java消息队列的相关知识。