Spring Kafka 事务提交顺序
Spring Kafka transaction commit sequence
我有两个服务。用户调用 Service-A 的 REST 端点,该端点进行处理,在数据库中创建 record/entry,然后发送 Kafka 事件以便可以使用 Service-B。
我已经用@Transactional 注释了,这样数据库提交和Kafka 提交是同时发生的。
Service-B 将接收 Kafka 事件,处理并将更新后的事件发送回 Service-A。
在这种情况下,我看到某些更新在 Service-A 中失败,表明未找到 record/entry。这是竞争条件吗?
由于 ChainedKafkaTransactionManager 已弃用,我如何确保先提交数据库然后再提交 Kafka?
“对于producer发起的事务,有了事务同步,Kafka commit也会发生在DB之后。”来自加里·罗素
在我的场景中,由于事务不是由 Kafka 发起的,我该如何撤消提交?
@Transactional("dstm")
public void someMethod(String in) {
Employee employee = this.repository.save(new Employee(in));
if(employee.isSomeCondition()) {
sendToKafka(employee);
}
}
实际上,这里有一个很好的示例,说明如何在多个数据源上配置事务处理:https://docs.spring.io/spring-kafka/docs/current/reference/html/#ex-jdbc-sync
另一个可能导致该问题的问题是您的使用者的隔离级别。你把它改成read_committed了吗?
我有两个服务。用户调用 Service-A 的 REST 端点,该端点进行处理,在数据库中创建 record/entry,然后发送 Kafka 事件以便可以使用 Service-B。
我已经用@Transactional 注释了,这样数据库提交和Kafka 提交是同时发生的。
Service-B 将接收 Kafka 事件,处理并将更新后的事件发送回 Service-A。
在这种情况下,我看到某些更新在 Service-A 中失败,表明未找到 record/entry。这是竞争条件吗?
由于 ChainedKafkaTransactionManager 已弃用,我如何确保先提交数据库然后再提交 Kafka?
“对于producer发起的事务,有了事务同步,Kafka commit也会发生在DB之后。”来自加里·罗素
在我的场景中,由于事务不是由 Kafka 发起的,我该如何撤消提交?
@Transactional("dstm")
public void someMethod(String in) {
Employee employee = this.repository.save(new Employee(in));
if(employee.isSomeCondition()) {
sendToKafka(employee);
}
}
实际上,这里有一个很好的示例,说明如何在多个数据源上配置事务处理:https://docs.spring.io/spring-kafka/docs/current/reference/html/#ex-jdbc-sync
另一个可能导致该问题的问题是您的使用者的隔离级别。你把它改成read_committed了吗?