其实就是保证数据库和mq的事务性,这个特别难保证,也无法完全保证。只能通过层层兜底都降低概率。一种是通过分布式事务,例如rocketmq中的事务消息。具体做法是 mq 先发一个 pre,mysql事务完成,mq commit。其中如果 mysql 事务失败,mq回滚。如果mysql完成事务后宕机,mq在一定时间未commit,会回调检查,必须额外提供一个供mq回调检测mysql是否写入的接口。另一种是兜底做法。就是mysql 写事务的同时记录下mq的状态为未发送,事务提交。发mq, 成功则修改mysql中mq状态为已发送。如果中途宕机,则mysql 中的mq状态不会更新。所以需要一个定时任务扫描mysql库中mq状态,进行补充发mq。注意:可能会有消息重复,所以在消费消息时注意幂等性。两种方法说实话都没有实践过,都是看了杂七杂八的博客来的,纸上谈兵罢了