消息队列

消息队列原理以及各种消息中间件
帅旋
关注
充电
IT宅站长,技术博主,共享单车手,全网id:arthinking。

如何实现消息可靠性投递?

发布于 2021-10-12 | 更新于 2024-02-27

持久化消息就意味着消息的可靠性吗?如何实现可靠性投递?

消息可靠性需要考虑生产端投递消息的可靠性以及保证消费端最终成功地消费消息。

虽然通过生产端的ACK机制,可以确保消息成功的投递到了RabbitMQ中,保证投递的消息不丢失。但是如果生产端不知道消费者究竟有没有成功的消费了消息,那也就无法实现可靠性投递了。

而生产端投递消息的过程中,通常会涉及到生产端的事务提交,要保证消息跟随事务提交而发送,也是需要考虑的问题。

如何实现可靠投递呢?这里留给大家思考,关键设计要点:

  • 是否要发消息跟随生产端事务一起保存到发送日志表,提交事务之后立刻向消息队列投递一次消息;
    • 生产端发送日志表消息状态:1 发送中,2 Broker签收成功,3 Broker签收失败,4 消费端签收成功,5 消费端签收失败
  • 使用消息队列模拟RPC调用,在消费者成功处理消息之后,向生产者投递成功消费的消息,以便让生产端知道消息已经处理成功了;
  • 定时任务定时扫描生产端发送日志表,对于超过固定时间之内,还未处理成功的消息,进行重试投递,重试可以使用指数退避策略,并设置投递上限次数。如果达到上限次数还未成功,则预警人工介入排查;
  • 消费端一定要做好幂等处理,避免重复消费导致业务异常。

提示的还不够具体?我再上一张图:

image-20211010222410703

有更好的方案的朋友,欢迎在评论区留言交流,也许你就是评论区最靓的仔。

References

本文作者: 帅旋

本文链接: https://www.itzhai.com/columns/mq/rabbitmq/message-delivery-reliability.html

版权声明: 版权归作者所有,未经许可不得转载,侵权必究!联系作者请加公众号。

×
IT宅

关注公众号及时获取网站内容更新。