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
-
Beta Was this translation helpful? Give feedback.
0 replies
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Uh oh!
There was an error while loading. Please reload this page.
Uh oh!
There was an error while loading. Please reload this page.
-
背景
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