请问各位大佬关于Java的一个问题

在一个单体项目中,用MQ做MySQL和ES之间的数据同步,如果在一个事务方法中有写数据库的操作,写完数据库之后,还要在方法中将数据id发送给MQ,然后异步的更新到ES中,假如系统在写完数据库之后消息id还没写入MQ之前宕机了,此时会不会有数据一致性的问题,该怎么解决
#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。注意:可能会有消息重复,所以在消费消息时注意幂等性。两种方法说实话都没有实践过,都是看了杂七杂八的博客来的,纸上谈兵罢了
1 回复 分享
发布于 2023-11-26 23:50 上海
能不能学mysql日志里的二阶段提交,消息成功写入mq前都为阶段一。
点赞 回复 分享
发布于 2023-10-20 17:07 广东

相关推荐

昨天 08:49
已编辑
武汉大学 Web前端
野猪不是猪🐗:36k和36k之间亦有差距,ms的36k和pdd的36k不是一个概念
点赞 评论 收藏
分享
评论
2
1
分享

创作者周榜

更多
牛客网
牛客企业服务