Replies: 2 comments 1 reply
-
rocketmq 目前sdk 有两个大版本,协议上不同 一个是remoting的版本。https://github.com/apache/rocketmq/blob/develop/example/src/main/java/org/apache/rocketmq/example/transaction/TransactionProducer.java 本次主要是先支持第一个对吧 |
Beta Was this translation helpful? Give feedback.
1 reply
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
-
背景
https://github.com/apache/incubator-seata/issues/3752
设计
前提
seata的全局事务
seata目前全局事务是有两种方式的,一种是saga,另一种是二阶段。我们现在希望做的是把rocketmq的事务作为一个分支加入到二阶段全局事务里,事务里同时可以和AT TCC等分支。
rocketmq的事务消息
rocketmq支持发送一个半消息(broker收到后暂不投递),然后执行本地事务,完成后通知broker是提交还是回滚这条消息(所以只涉及发送阶段一致性,消费阶段的一致性由重试和其他手动保证)
总体设计思路
本次集成的能力重点在全局事务的一阶段,我们会提供一个SeataMQProducer,在里面将以下两个方法自动加入到全局事务中。其他方法会调用到原生父类进行,不会加入到全局事务。(原因是request/oneway/批量发送/指定selector的send等很多方法在原生里也不支持事务消息)
方案流程
时序图(commit&rollback两种情况)
一致性问题
参考上面的时序图,考虑以下的正常流程,发现有一致性问题难需要关注:
如果在[3]宕机了,有以下两种情况
seata分支已产生,半消息未发送
消息未发送抛出异常,seata的分支一阶段也会失败,这种情况下TC有可能发起回滚,这种情况下可以直接回滚成功(类似空回滚)
seata分支已产生,半消息已发送,但发送结果和message没有放入context中,消息将永远不可见
TC会发起回滚,同样的context里也没有messageid,以至于对broker的回查处理,TransactionListener会一直返回unknown,那消息将永远不可见,不commit也不rollback。为此我们需要让TransactionListener可以根据xid查询全局事务状态,并根据它来返回正确的LocalTransactionState
Beta Was this translation helpful? Give feedback.
All reactions