动力节点旗下在线教育品牌  |  咨询热线:400-8080-105 学Java全栈,上蛙课网
首页 > 文章

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

08-18 17:01 160浏览
举报 T字号
  • 大字
  • 中字
  • 小字

与其他行业和职位的面试不同,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 的数据都到同一个内存queue;然后对于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属于双端队列,因此拥有addFirst(E)、addLast(E)、getFirst()、getLast() 等方法。

以上的10道题就是今天为大家整理的java队列面试题,涉及的都是比较基础的内容,java零基础的小白们同样可以从这些题目中学习,为以后奠定基础。

消息队列中间件是分布式系统中重要的组件,主要解决应用耦合异步消息流量削锋等问题是大型分布式系统不可缺少的中间件,因此,面试官还是比较注重java队列方面知识的考察的,希望大家在学习java培训课程过程中,多多留意java消息队列的相关知识。

0人推荐
共同学习,写下你的评论
0条评论
硬汉宝宝
程序员硬汉宝宝

6篇文章贡献21407字

作者相关文章更多>

推荐相关文章更多>

Java数据结构

HelloWorld10-31 08:24

浅谈MySQL中SQL优化的常用方法

军哥08-12 23:29

五分钟读懂UML类图

江湖人称小李白12-10 10:41

MyBatis开发框架的四大核心

IT逐梦者08-17 21:43

一次搞定continue,break和return

HelloWorld11-06 11:19

发评论

举报

0/150

取消