MQ 发消息的4种姿势

发布时间:2024年01月05日
  • 微服务开发中经常会使用消息队列进行跨服务通信。在一个典型场景中,服务A执行一个业务逻辑,需要保存数据库,然后通知服务B执行相应的业务逻辑。在这种场景下,我们需要考虑如何发送消息。

    图片

    1. 基础版

    首先,我们可能会考虑将数据库操作和消息发送放在同一个事务中,以下是伪代码示例:

    @Transactional  
    public void saveWithMessage(BusinessDO businessDO){ 
     String id = IdUtils.nextId();
     businessDO.setId(id);
        xxxRepository.save(businessDO);  
        
        BusinessMessage businessMessage = new BusinessMessage();  
        businessMessage.setKey(id);  
        SendResult send = rocketMQTemplate.syncSend("test-topic", sendMessage);
    }
    

    在这段代码里通过@Transactional注解将数据库的操作以及发送消息放到一个事务中,如果数据库的保存或者消息发送失败,则回滚事务。

    乍一看似乎没什么问题,但稍微推敲一下就会发现此方式有如下两个缺陷:

    1.1 数据不一致

    首先最容易想到的是,这种消息发送方式无法保证数据的最终一致性。

文章来源:https://blog.csdn.net/mmmmm44444/article/details/135409701
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。