我有两个微服务A和b。
一个服务正在发送消息给Kafka主题"A- topic"。B服务正在消费该消息。
在B服务中,kafka监听器将执行以下步骤1. Persist the data in the database (repo.save(entity))
2. Publish the response message to "B-Topic". (kafkatemplte.send("B-Topic",message))
我在两个服务的服务级别使用Spring @Transactional注释。
在成功场景中,数据被持久化,成功消息只发布到主题一次
,
在Failure场景中,由于完整性约束违反问题,数据库保存失败。在这种情况下,失败消息被连续发布到Kafka 10次。
如果我从服务类中删除事务性注释,那么消息也只在失败场景中发布一次。
我不明白,为什么事务性注释会导致消息被发布10次到kafka。
请让我知道你的意见。
提前感谢。
默认错误处理程序将尝试传递10次;你需要在侦听器容器中启用Kafka事务,这样Kafka的发送将被回滚(并且B-Topic
上的消费者需要isolation.level=read_committed
)。
https://docs.spring.io/spring-kafka/docs/current/reference/html/事务