请问各位大佬关于Java的一个问题
在一个单体项目中,用MQ做MySQL和ES之间的数据同步,如果在一个事务方法中有写数据库的操作,写完数据库之后,还要在方法中将数据id发送给MQ,然后异步的更新到ES中,假如系统在写完数据库之后消息id还没写入MQ之前宕机了,此时会不会有数据一致性的问题,该怎么解决
#Java# #面试#
#Java# #面试#
全部评论
其实就是保证数据库和mq的事务性,这个特别难保证,也无法完全保证。只能通过层层兜底都降低概率。一种是通过分布式事务,例如rocketmq中的事务消息。具体做法是 mq 先发一个 pre,mysql事务完成,mq commit。其中如果 mysql 事务失败,mq回滚。如果mysql完成事务后宕机,mq在一定时间未commit,会回调检查,必须额外提供一个供mq回调检测mysql是否写入的接口。另一种是兜底做法。就是mysql 写事务的同时记录下mq的状态为未发送,事务提交。发mq, 成功则修改mysql中mq状态为已发送。如果中途宕机,则mysql 中的mq状态不会更新。所以需要一个定时任务扫描mysql库中mq状态,进行补充发mq。注意:可能会有消息重复,所以在消费消息时注意幂等性。两种方法说实话都没有实践过,都是看了杂七杂八的博客来的,纸上谈兵罢了
能不能学mysql日志里的二阶段提交,消息成功写入mq前都为阶段一。
相关推荐
点赞 评论 收藏
分享