spring-boot - 微服务中的事务发件箱模式与 ChainedKafkaTransactionManager
问题描述
使用 Spring-Kafkas ChainedKafkaTransactionManager 我看不到在 Spring Boot 微服务上下文中实现事务发件箱模式的任何意义。
将消息生产者(即 KafkaTemplate 的 send 方法)和 DB 操作放在同一个事务块中,正好解决了发件箱模式应该解决的问题:如果事务代码中出现任何异常,则既不提交 db op,也不读取消息在消费者端(配置了 read_committed)
这样我就不需要额外的表格,也不需要任何类型的 CDC 代码。总之,Spring Kafka 的事务同步方式对我来说似乎比事务发件箱模式的任何实现更容易使用和实现。
我错过了什么吗?
public ChainedKafkaTransactionManager chainedTransactionManager(
JpaTransactionManager transactionManager,
KafkaTransactionManager kafkaTransactionManager) {
ChainedKafkaTransactionManager chainedKafkaTransactionManager =
new ChainedKafkaTransactionManager<>(transactionManager,
kafkaTransactionManager);
return chainedKafkaTransactionManager;
}
@Bean
@Primary
public JpaTransactionManager transactionManager(EntityManagerFactory
entityManagerFactory) {
JpaTransactionManager jpaTransactionManager =
new JpaTransactionManager(entityManagerFactory);
return jpaTransactionManager;
}
@Bean
public KafkaTransactionManager<Object, Object>
kafkaTransactionManager(ProducerFactory producerFactory) {
KafkaTransactionManager kafkaTransactionManager =
new KafkaTransactionManager<>(producerFactory);
return kafkaTransactionManager;
}
@Transactional(value = "chainedTransactionManager")
public Customer createCustomer(Customer customer) {
customer = customerRepository.save(customer);
kafkaTemplate.send("customer-created-topic","Customer created");
return customer;
}
解决方案
我认为它不会给你同样的安全水平。如果 Kafka 提交和 DB 提交之间出现问题怎么办。
https://medium.com/dev-genius/transactional-integration-kafka-with-database-7eb5fc270bdc
推荐阅读
- spring-boot - RefreshScopeRefreshedEvent 与 EnvironmentChangeEvent 之间的区别
- logging - 使用 SNMP 将日志重定向到 syslog 服务器
- angular-dart - 我无法从 Angular dart 中的任何列表元素方法(无效参数(索引):“2”)访问它
- javascript - React - 如何在渲染之外的函数内渲染组件并在渲染之外执行相同的函数?
- azure-cosmosdb - 限制用户访问 Azure CosmosDB MongoDB 数据库
- vba - 根据 A 列中的值锁定和解锁单元格的宏脚本
- mongodb - Mongo 区域分片实施问题
- github - 是否可以“禁用” GitHub 存储库?
- http - HTTP 比 MQTT 更高效吗
- ios - 在 UICollectionViewFlowLayoutBreakForInvalidSizes 处创建一个符号断点以在调试器中捕获它