MQ 消息丢失问题

  • 引入 MQ 消息中间件实现系统解耦,会影响系统之间数据传输的一致性
    • 在分布式系统中,如果两个节点之间存在数据同步,就会带来数据一致性的问题。
    • 要解决的就是:消息生产端和消息消费端的消息数据一致性问题(也就是如何确保消息不丢失)。
  • 如何知道有消息丢失?

  • 哪些环节可能丢消息?

  • 如何确保消息不丢失?

  • 先让面试官知道你的分析思路,然后再提供解决方案 :

    • 网络中的数据传输不可靠,想要解决如何不丢消息的问题,首先要知道哪些环节可能丢消息,以及我们如何知道消息是否丢失了,最后才是解决方案(而不是上来就直接说自己的解决方案)。
    • 就好比“ 架构设计” “架构”体现了架构师的思考过程,而 “设计” 才是最后的解决方案,两者缺一不可。

消息丢失的环节

消息丢失的环节,一条消息从生产到消费完成这个过程,可以划分三个阶段,分别为

  1. 消息生产阶段
  • 消息生产阶段
    • 从消息被生产出来,然后提交给 MQ 的过程中,只要能正常收到 MQ Broker 的 ack 确认响应,就表示发送成功,所以只要处理好返回值和异常,这个阶段是不会出现消息丢失的。
  1. 消息存储阶段
  • 消息存储阶段
    • 这个阶段一般会直接交给 MQ 消息中间件来保证,但是你要了解它的原理,比如 Broker 会做副本,保证一条消息至少同步两个节点再返回 ack。
  1. 消息消费阶段
  • 消息消费阶段
    • 消费端从 Broker 上拉取消息,只要消费端在收到消息后,不立即发送消费确认给 Broker,而是等到执行完业务逻辑后,再发送消费确认,也能保证消息的不丢失。

MQ 消息重复问题

  • 换一种说法,就是如何解决消费端幂等性问题(幂等性,就是一条命令,任意多次执行所产生的影响均与一次执行的影响相同),
  • 只要消费端具备了幂等性,那么重复消费消息的问题也就解决了

MQ 消息积压问题

  • 引入 MQ 消息中间件解决流量控制 , 会使消费端处理能力不足从而导致消息积压

这道题的考点就是如何通过 MQ 实现真正的高性能,回答的思路是,本着解决线上异常为最高优先级,然后通过监控和日志进行排查并优化业务逻辑,最后是扩容消费端和分片的数量。

总结

  • 在回答问题的时候,你需要特别注意的是,让面试官了解到你的思维过程,这种解决问题的能力是面试官更为看中的,比你直接回答一道面试题更有价值。