kafka和mysql操作,如何确保先后顺序

问题描述

A项目中有一个方法,先将数据保存在mysql中,然后将mysql的插入操作返回数据的id作为消息体,通过kafka发送。(此方法已被@Transactional,所以插入数据和发送消息应该会)

B项目收到消息后,从MySQL中查询消息的详情,并进行后续操作。

线上部署时,mysql是远程的数据库服务器,而kafka,A项目,B项目部署在同一台服务器。出现一个问题就是,A发送的消息,B项目已经接收,并开始根据消息中的id查询数据库,但是此时,数据库的插入操作还未完成,导致查询结果为空。

这种情况下,如何对数据库插入操作和kafka发送消息进行控制,确保,B收到消息时,数据库插入操作已经完成,并且当kafka消息发送失败时,能够正确的回退操作。

目前,我的做法是进行手动控制,去掉@Transactional注解,当消息发送出现异常时,手动对之前的数据库插入操作新增的数据进行删除。

有没有更优雅的解决方案?


慕码人2483693
浏览 954回答 3
3回答

子衿沉夜

@TransactionalEventListener或者采取本地事件表的方式,将消息写入本地事件表,由轮询线程去处理投递的问题
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java