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

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

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
问题一:RabbitMQ 中的 broker 是指什么?cluster 又是指什么? 问题二:什么是元数据?元数据分为哪些类型?包括哪些内容?与 cluster 相关的元数据 有哪些?元数据是如何保存的?元数据在 cluster 中是如何分布的? 问题三:RAM node 和 disk node 的区别? 问题四:RabbitMQ 上的一个 queue 中存放的 message 是否有数量限制? 问题五:RabbitMQ 概念里的 channel、exchange 和 queue 这些东东是逻辑概念,还是对应着进程实体?这些东东分别起什么作用? 问题六:vhost 是什么?起什么作用? 问题:在单 node 系统和多 node 构成的 cluster 系统中声明 queue、exchange ,以及 进行 binding 会有什么不同? 问题八:客户端连接到 cluster 中的任意 node 上是否都能正常工作? 问题九:若 cluster 中拥有某个 queue 的 owner node 失效了,且该 queue 被声明具有 durable 属性,是否能够成功从其他 node 上重新声明该 queue ? 问题十:cluster 中 node 的失效会对 consumer 产生什么影响?若是在 cluster 中创建了 mirrored queue ,这时 node 失效会对 consumer 产生什么影响? 问题十一:能够在地理上分开的不同数据中心使用 RabbitMQ cluster 么? 问题十二:为什么 heavy RPC 的使用场景下不建议采用 disk node ? 问题十三:向不存在的 exchange 发 publish 消息会发生什么?向不存在的 queue 执行 consume 动作会发生什么? 问题十四:routing_key 和 binding_key 的最大长度是多少? 问题十五:RabbitMQ 允许发送的 message 最大可达多大? 问题十六:什么情况下 producer 不主动创建 queue 是安全的? 问题十:“dead letter”queue 的用途? 问题十八:为什么说保证 message 被可靠持久化的条件是 queue 和 exchange 具有 durable 属性,同时 message 具有 persistent 属性才行? 问题十九:什么情况下会出现 blackholed 问题? 问题二十:如何防止出现 blackholed 问题? 问题二十一:Consumer Cancellation Notification 机制用于什么场景? 问题二十二:Basic.Reject 的用法是什么? 问题二十三:为什么不应该对所有的 message 都使用持久化机制? 问题二十四:RabbitMQ 中的 cluster、mirrored queue,以及 warrens 机制分别用于解决 什么问题?存在哪些问题?

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值