A项目中有一个方法,先将数据保存在mysql中,然后将mysql的插入操作返回数据的id作为消息体,通过kafka发送。(此方法已被@Transactional,所以插入数据和发送消息应该会)
B项目收到消息后,从MySQL中查询消息的详情,并进行后续操作。
线上部署时,mysql是远程的数据库服务器,而kafka,A项目,B项目部署在同一台服务器。出现一个问题就是,A发送的消息,B项目已经接收,并开始根据消息中的id查询数据库,但是此时,数据库的插入操作还未完成,导致查询结果为空。
这种情况下,如何对数据库插入操作和kafka发送消息进行控制,确保,B收到消息时,数据库插入操作已经完成,并且当kafka消息发送失败时,能够正确的回退操作。
目前,我的做法是进行手动控制,去掉@Transactional注解,当消息发送出现异常时,手动对之前的数据库插入操作新增的数据进行删除。
有没有更优雅的解决方案?
子衿沉夜
相关分类