微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

微服务中的事务发件箱模式与 ChainedKafkaTransactionManager

如何解决微服务中的事务发件箱模式与 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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。