RocketMq-事务消息原理
2020-12-18 本文已影响0人
麦大大吃不胖
事务消息原理
by shihang.mai
rocketMq用的是2pc
rocketMq事务消息原理
- producer发送消息前,先开启事务,并设置回调方法
- 发送一个半消息(实际是完全的msg,这里只是一个概念),broker将msg保存到Topic:half-messgae,即保存到磁盘上,然后返回ack给producer
- producer收到确认后,执行本地的n个方法
- 如果事务执行成功,通知broker清除half-messgae队列消息和磁盘的消息,并将msg放到真正的Topic中。
如果事务执行失败,通知broker清除那么broker清除half-messgae队列消息和磁盘的消息。 - 如果事务执行时间较长,那么broker会有一个定时任务,回调producer设置的回调方法,
如果回调方法返回成功,那么和上面执行成功一样的逻辑。
如果回调方法返回失败,清除half-messgae队列消息和磁盘的消息。
如果返回unknow,那么定时任务之后再回调一次
1. 当定时任务回调时,连接不上producer,重试几次后,还是不行那么直接撤销 2.连上 producer ,但是每次都是返回unknow,多次后,也会自动撤销
使用时核心代码:
producer.setTransactionListener(new TransactionListener() {
@Override
public LocalTransactionState executeLocalTransaction(Message message, Object o) {
//执行本地事务
/**
* 回滚 LocalTransactionState.ROLLBACK_MESSAGE;
* broker定时检查producer事务状态 LocalTransactionState.UNKNOW;
* 成功 LocalTransactionState.COMMIT_MESSAGE
*/
//
// LocalTransactionState.ROLLBACK_MESSAGE;
//LocalTransactionState.UNKNOW;
return LocalTransactionState.COMMIT_MESSAGE;
}
@Override
public LocalTransactionState checkLocalTransaction(MessageExt messageExt) {
//broker端回调监测本地事务
return LocalTransactionState.COMMIT_MESSAGE;
}
});
rocketMq顺序消费
rocketMq顺序消费场景