基于消息的最终一致性实现方案
在mq处理消息的时候,通常会出现db已经操作完成,但是mq消息没有被消费的情况,这时候如果不采取方案会出现消息不一致的请款。下面是解决这种问题的方案:
可以使用支持事物的mq:
生产者:
使用可以支持事物的消息队列,具体流程如下:
1.在执行业务的时候,未提交事物之前,先发送一条mq消息。状态为 ·待确认·。
2.mq发送ack确认给本地业务
3.本地业务执行事物操作,然后发送执行结果。
4.根据执行结果,如果事物执行成功,状态更新为 ·可发送·,否则事务执行失败,删除消息
(这期间可能因为网络原因产生超时,可以通过定时轮循机制进行确认)
消费者:
使用消息重试机制
基于本地消息最终一致性
这适用于不支持事务操作的mq
生产者端:
在执行业务操作的时候,记录一条消息到DB,并且消息记录与业务数据在同一个事务之内完成。
然后通过一个定时任务去DB中定时轮循待发送的消息,然后将消息投递给MQ。直到收到mq的确认之前一直投递。
当收到确认信息之后,再更新数据库当中的状态
消费者:
消息重试机制
采用这种方式有个弊端,每个业务系统需要单独创建一张表去存储消息
独立消息服务保证最终一致性
就是将本地消息做成服务,支持水平扩容。
生产者:
1.在执行业务的时候,需要向消息服务发送预发送消息 ,消息服务将这个预发送消息存储到数据库
2.执行业务操作,然后发送业务执行结果到消息服务中心
3. 业务方需要又一个消息确认接口,用户判断服务中心没有被更新为可发送状态的内容是否需要更新状态或者删除
4.服务中心定时轮训状态为可发送的,进行消息发送
消费者
消息重试机制