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

本文深入探讨消息队列如ActiveMQ和Kafka的核心技术,包括使用场景、消息重发策略、保证消息有序性和不丢失的方法、避免消息重复的措施、高吞吐量的原因及主从同步机制。同时对比了ActiveMQ与Kafka的设计差异,讨论如何利用消息队列实现最终一致性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值