02.消息中间件RocketMq之事务消息

消息中间件RocketMq之事务消息

分布式系统中的事务可以使用TCC(Try、Confirm、Cancel)、2pc来解决分布式系统中的消息原子性

RocketMQ 4.3+提供分布事务功能,通过 RocketMQ 事务消息能达到分布式事务的最终一致

RocketMQ实现方式

2PC

  • Half Message:

预处理消息,当broker收到此类消息后,会存储到RMQ_SYS_TRANS_HALF_TOPIC的消息消费队列中

  • 检查事务状态:

Broker会开启一个定时任务,消费RMQ_SYS_TRANS_HALF_TOPIC队列中的消息,每次执行任务会向消息发送者确认事务执行状态(提交、回滚、未知),因此需要定义check的接口。如果是未知,等待下一次回调。。
本地执行完了,就会commit,修改事务状态

  • 超时:

    如果超过回查次数,默认回滚消息

TransactionListener的两个方法
executeLocalTransaction

半消息发送成功触发此方法来执行本地事务

checkLocalTransaction

broker将发送检查消息来检查事务状态,并将调用此方法来获取本地事务状态

本地事务执行状态

LocalTransactionState.COMMIT_MESSAGE

执行事务成功,确认提交

LocalTransactionState.ROLLBACK_MESSAGE

回滚消息,broker端会删除半消息

LocalTransactionState.UNKNOW

暂时为未知状态,等待broker回查

使用

public static void main(String[] args) throws Exception {

        TransactionMQProducer producer = new TransactionMQProducer("transgroup");


        producer.setNamesrvAddr("127.0.0.1:9876");

        producer.setTransactionListener(new TransactionListener() {
            @Override
            public LocalTransactionState executeLocalTransaction(Message message, Object o) {
                // 执行本地事务
                System.out.println("执行事务");
                System.out.println("msg:" + new String(message.getBody()));
                System.out.println("msgid:" + message.getTransactionId());
                try {
                    TimeUnit.SECONDS.sleep(30);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                System.out.println("执行事务完成");
                return LocalTransactionState.COMMIT_MESSAGE;
            }

            @Override
            public LocalTransactionState checkLocalTransaction(MessageExt message) {
                // broker 端 回调检查事务
                System.out.println("回调检查事务");
                System.out.println("msg:" + new String(message.getBody()));
                System.out.println("msgid:" + message.getTransactionId());
                // 失败回滚,回滚half消息
                // return LocalTransactionState.ROLLBACK_MESSAGE;
                // 未知等待,下次继续
                // return LocalTransactionState.UNKNOW;
                // 成功
                return LocalTransactionState.UNKNOW;
            }
        });
        producer.start();

        // 发送消息
        Message message = new Message("myTrans001" ,"我是事务消息".getBytes());

        producer.sendMessageInTransaction(message,null);



        producer.shutdown();
        System.out.println("结束");

    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

多多洛码代码

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值