消息队列与数据库事务的冲突

###事件背景:
###dubbo+zookeeper架构下的微服务项目,用户最近一次产生的设备(血压计、血糖仪、手环心率)数据
保存于data服务中的data库data_latest_summary表中,后为了适应健管角色(基础服务)分页获取同样的数据,
需要将data服务的data_latest_summary表中数据通过查询后,复制到基础服务的同样的data_latest_summary表中。
步骤:首先使用MQ消息队列,监听数据上传(只要data服务有对应的数据上传(此处,data服务对上传的数据进行
了一系列的处理,为了保持各表数据的一致性,方法上使用了注解@Transactional事务),则发送数据上传的消息,
基础服务监听消费该消息,消费的过程通过查询data库data_latest_summary后,将同样的数据,存入基础服务
data_latest_summary中,此时出现了一个问题:经常会出现基础服务在消费查data服务的data_latest_summary表时,
查询到的数据并不是此次存储的最新数据,而是上一次的历史数据,数据出现了偏差,经过排查发现,这是由于,
方法在发送MQ异步消息(发送MQ在方法的最后一步)后才提交数据库事务,有时候数据库事务提交的时间长于MQ执行
的时间,从而导致上述问题,由于项目急着上线,目前的处理方法是MQ延时10s发送消息,虽解决问题,但不够优雅,
后续抽时间优雅的优化该问题,谨以此记。)

image.png
image.png

你可能感兴趣的:(消息队列与数据库事务的冲突)