常见面试题(七)消息中间件

https://www.cnblogs.com/kevingrace/p/9443270.html

1、消息队列的使用场景

解耦、异步、削峰

2、消息队列的重发、补偿策略

主要因为消费者从队列获取消息,未处理完成发生故障,恢复启动后可能会丢失刚才处理失败的消息。

activeMQ消息监听器一般为:MessageListener。而使用SessionAwareMessageListener可以在消费者处理失败的时候重发,默认6次仍然失败后放入死信队列

kafka:设置手动提交消息偏移,消费者在消息处理成功后手动异步或者同步提交偏移量offset

 

3、如何保证消息的有序性

kafka:只保证partition内的消息有序,针对多分区情况,需要根据实际的业务场景,应用代码需要实现,如:生产者通过算法将同一个业务ID的数据有序的发送到同一个partition,消费者采用多线程处理消息时,可以将fetch的消息放入内存队列

activemq:consumer.exclusive=true,如果有2个consumer都是这样配置的,broker只会把队列消息发送给其中一个consumer,如果这个consumer挂掉了,broker会把消息推送给另外的consumer,这样就保证了按顺序消费消息。在cusomer中如果是多线程处理消息,则需要对消息进行本地队列控制

4、如何保证消息不丢失

kafka:https://www.cnblogs.com/likehua/p/3999538.html

1)kafka集群保证不丢失:当leader副本宕机,无同步副本时,非同步副本会当选leader时会丢失消息,保证kafka系统中至少有两个同步副本。一个肯定是首领副本,另外一个是从的副本。此时需要kafka的另外一个参数 最小同步副本数 **min,insync.replicas**只有保证kafka收到生产者的消息之后,至少有 “最小同步副本数“ 的副本收到消息,才能保证在主宕机时消息不丢失。这个参数的意思是 kafka收到生产者消息之后,至少几个同步副本,同步之后,才给客户端消息确认。

2)生产者发送保证不丢失:

涉及到一个参数 acks ,有三个 0, 1, all

0 ,那么代表发送过去,不等待kafka消息确认,认为成功,一定会丢失消息,可能kafka集群正在选举,此时就无法收到任何异常。

如果是1,那么代表发送过去,等待首领副本确认消息,认为成功.首领肯定收到了消息,写入了分区文件(不一定落盘)。

如果是all, 那么代表发送过去之后,消息被写入所有同步副本之后 ,认为成功。

3)消费者处理时保证不丢失:

enable.auto.commit自动提交 ,如果开启了自动提交,那么系统会自动进行提交offset。可能会引起,并未消费掉,就提交了offset.引起数据的丢失。

activemq:消息确认机制 ack

5、如何保证消息不重复

MQ中间件都可能出现消息重复的情况,在系统设计的时候需要考虑重复消息的幂等性

kafka可关闭手动提交偏移量

消息被路由到哪个partition上,由producer客户端决定

一个分区只被一个消费者消费

 

6、activemq与kafka设计上的不同

1)amq消息时push推送给消费者,kafka则是消费者fetch主动获取

2)kafka被消费的消息不会被立即删除,被写入日志文件,定期删除

3)kafka中的broker和consumer都是轻量级的,不需要控制消息的状态,也没有复杂的消息确认机制,通过offset记录消费的位置

4)消息传送机制

传统mq消息传输担保非常直接:有且只有一次(exactly once),kafka则不同: 

a. at most once: 最多一次,这个和JMS中"非持久化"消息类似.发送一次,无论成败,将不会重发.

   b、 at least once: 消息至少发送一次,如果消息未能接受成功,可能会重发,直到接收成功.首选

   c、 exactly once: 消息只会发送一次.

 

activemq:虽然支持主从、集群,集群功能很弱,只有failover功能;支持广播和队列模式

7、kafka吞吐量高的原因

顺序读写、零拷贝、分区分段、批量发送、数据压缩

8、kafka 主从同步怎么实现

leader负责处理所有的接入。并广播这些,flowers向普通的consumer那样从leader那里拉取消息并保存在自己的日志文件中。

9、利用mq怎么实现最终一致性

订单服务,库存服务,在保存订单成功后,向队列中发送一条消息,库存服务进行处理,达到最后一致性

会有几种异常情况:消息未到达队列、消息未被消费、消费过程中出现异常等情况,需要应用有针对性的进行处理

10、kafka分区与消费者关系:https://www.cnblogs.com/cjsblog/p/9664536.html

常见面试题(七)消息中间件_第1张图片

 

你可能感兴趣的:(Java面试整理,JAVA面试题库)