当我们实际项目开发中,引入一个中间件都要考虑为什么要引进他,引进它会遇到哪些问题。
首先
为什么要引入消息队列
- 解耦:分布式系统中涉及到的数据交互
- 削峰:高并发场景下,为了更快的作出相应,会考虑引入消息队列
- 异步:减少响应时间
会遇到哪些问题呢
- 系统的可用性降低:如果消息队列挂掉了,服务之间通讯就会受限
- 复杂性提高
- 数据丢失
本文主要对「数据丢失」做一些分享
华丽的分割线
———————————————————————————————————————————————
1. 会产生数据丢失的场景 如下图
如上图所属,这是一个完整的消息从生产到消费的大体流程,黄色标签的步骤都可能会引起消息丢失。
解决方案
- 第一步:生产者生产消息,由于网络等原因并没有发送到borker中,但是本地事物已经提交了。造成数据的不一致性,消息丢失。(采用消息的事务性)
- 第二三步:默认的borker持久化磁盘机制采用的是异步(可以修改borker文件 默认flushDiskType=ASYNC_FLUSH。SYNC_FLUSH同步刷盘)
- 第三步:手动确认。(如rabbitmq开启手动ack rocketmq默认开启如果返回失败或消费中异常,会多次重发消息可以设置消费次数)
以上都是针对中间件本身进行的处理
简单的方案可以采取本地消息表对消息进行补偿