首页 > 解决方案 > 微服务中的事务发件箱模式与 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;
    }

标签: spring-bootapache-kafkamicroservicesspring-kafkachange-data-capture

解决方案


我认为它不会给你同样的安全水平。如果 Kafka 提交和 DB 提交之间出现问题怎么办。

https://medium.com/dev-genius/transactional-integration-kafka-with-database-7eb5fc270bdc


推荐阅读