分布式消息系统常见问题讨论

dailidong 1年前
354次浏览 1人关注 复制链接 所属标签: 分布式消息系统常见问题讨论

Q1:分布式消息系统中,如何避免消息重复?

造成消息重复的根本原因是:网络不可靠。只要通过网络交换数据,就无法避免这个问题。所以解决这个问题的办法就是绕过这个问题。那么问题就变成了:如果消费端收到两条一样的消息,应该怎样处理?

  • a. 消费端处理消息的业务逻辑保持幂等性;
  • b. 保证每条消息都有唯一编号且保证消息处理成功与去重表的日志同时出现。

    通过幂等性,不管来多少条重复消息,可以实现处理的结果都一样。再利用一张日志表来记录已经处理成功的消息的ID,如果新到的消息ID已经在日志表中,那么就可以不再处理这条消息,避免消息的重复处理。

Q2:顺序消息扩容的过程中,如何在不停写的情况下保证消息顺序?

  • a. 成倍扩容,实现扩容前后,同样的key,hash到原队列,或者hash到新扩容的队列;

  • b. 扩容前,记录旧队列中的最大位点;

  • c. 对于每个Consumer Group,保证旧队列中的数据消费完,再消费新队列,也即:先对新队列进行禁读即可;

节选自 Apache RocketMQ PMC 刘振东

暂无回答