在公众号回复课程,免费获取JAVA全栈课程
做者 | 颜 群java
公众号 | 大数据和人工智能技术web
上篇文章介绍了使用MQ限流的基本思路,详情请戳 使用消息队列进行限流(上)。面试
而且在上篇文末,遗留了三个问题:在发送消息的过程当中,如何避免消息丢失、消息被重复消费,如何处理消息积压问题?数据库
本文主要解决第一个问题:如何避免消息丢失编程
在消息队列中,每条消息都会经生产者发送给MQ,最终再转发给消费者。所以每条消息在发送时都至少会被传递两次,而每次的消息传递都会因为网络异常等状况形成传递失败,所以消息在传递时就存在丢失的可能。那么该如何避免消息丢失呢?微信
消息在发送时至少会被传递两次,然而传输过程受网络环境、网络设备等外界因素影响,是咱们没法在代码层面进行干预的,所以咱们只能在两次传输所通过的三个端点采起措施,如图。网络
1.第一次消息传输阶段架构
主要经过“生产者”和“MQ”两端的反馈标记来保证正常的传输(相似TPC协议的三次握手机制)。目前主流的MQ都可以在接收到消息后,给生产者回传一个反馈标记,如图。并发
生产者在收到反馈标记后,就能够判断第一次消息传输是否成功。若是失败,就应该启动消息补偿机制从新再发一次。若是补偿了屡次后依旧传输失败,就能够考虑丢弃此消息,并给用户响应一个失败信息,表示这次传输失败,提示用户从新发起一次请求。app
提示:有些MQ在发送消息时支持事务机制,即只有发送成功的消息才会被提交,发送失败的消息会自动回滚。这样的确能够很轻松的API层面解决消息丢失的问题,可是这种将全部消息都归入事务管理的作法会下降MQ的吞吐量,所以在并发量很是大的秒杀系统中是不建议开启的。
MQ在接收消息后,除了给生产者回传反馈标记之外,还应该将接收到的消息以异步的方式持久化到硬盘或数据库中,防止MQ宕机形成的数据丢失。此外MQ还要注意执行的顺序问题,最好是先持久化消息,以后再回传反馈标记。这样一来,即便回传反馈标记后MQ马上宕机,MQ也能在恢复启动后从硬盘(或数据库)中从新读取消息。
2.第二次消息传输阶段
当MQ接收了消息,并将消息持久化了之后,剩下的就很是简单了。消费只须要在接收到消息后,用一样的方式给MQ回传一个反馈标记,就能确保整个消息传递过程的完整性。
提示:实际上例如本次MQ的消息确认机制,很是相似TCP协议的三次握手和四次握手。
- 完 -
推荐阅读
▲
在“大数据和人工智能技术”聊天对话框回复如下关键词,可得到相关信息哟
回复【资料】获取JAVA全栈视频的配套资料
回复【最新课程】获取一门还没有公开的高级课程(不按期更换)
回复【提问】获取免费答疑方式
回复【课程】获取JAVA全栈视频教程 + 配套资料
回复【软件】获取经常使用的开发软件(逐步完善)
回复【亿级源码】获取本号做者出版的《亿级流量Java高并发与网络编程实战》一书配套源码
回复【javase】获取JAVA视频教程
回复【数据库】获取数据库视频教程
更多课程,逐步开放...
本文分享自微信公众号 - 大数据和人工智能技术(Big_Data-AI)。
若有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一块儿分享。