当前位置: 首页 > 图灵资讯 > 技术篇> Java基础学习之java队列面试题

Java基础学习之java队列面试题

来源:图灵教育
时间:2023-03-28 17:42:56

不同于其他行业和职位的面试,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消息队列的相关知识。