rocketmq事务消息的理解
2017-09-26 19:58
656 查看
http://www.cnblogs.com/wxd0108/p/6038543.html
RocketMQ第一阶段发送
如果
再回到转账的例子,如果Bob的账户的余额已经减少,且消息已经发送成功,Smith端开始消费这条消息,这个时候就会出现消费失败和消费超时两个问题?解决超时问题的思路就是一直重试,直到消费端消费消息成功,整个过程中有可能会出现消息重复的问题,按照前面的思路解决即可。
本质上还是个二阶段提交
重复消费幂等性要自己做
问题
要是本地事务提交,然后挂了,然后确认消息没发送,然后又没法回查确认,导致分布式事务的失败?
RocketMQ第一阶段发送
Prepared消息时,会拿到消息的地址,第二阶段执行本地事物,第三阶段通过第一阶段拿到的地址去访问消息,并修改状态。细心的你可能又发现问题了,如果确认消息发送失败了怎么办?RocketMQ会定期扫描消息集群中的事物消息,这时候发现了
Prepared消息,它会向消息发送者确认,Bob的钱到底是减了还是没减呢?如果减了是回滚还是继续发送确认消息呢?RocketMQ会根据发送端设置的策略来决定是回滚还是继续发送确认消息。这样就保证了消息发送与本地事务同时成功或同时失败。
如果
endTransaction方法执行失败,导致数据没有发送到
broker,
broker会有回查线程定时(默认1分钟)扫描每个存储事务状态的表格文件,如果是已经提交或者回滚的消息直接跳过,如果是
prepared状态则会向
Producer发起
CheckTransaction请求,
Producer会调用
DefaultMQProducerImpl.checkTransactionState()方法来处理
broker的定时回调请求,而
checkTransactionState会调用我们的事务设置的决断方法,最后调用
endTransactionOneway让
broker来更新消息的最终状态。
再回到转账的例子,如果Bob的账户的余额已经减少,且消息已经发送成功,Smith端开始消费这条消息,这个时候就会出现消费失败和消费超时两个问题?解决超时问题的思路就是一直重试,直到消费端消费消息成功,整个过程中有可能会出现消息重复的问题,按照前面的思路解决即可。
本质上还是个二阶段提交
重复消费幂等性要自己做
问题
要是本地事务提交,然后挂了,然后确认消息没发送,然后又没法回查确认,导致分布式事务的失败?
相关文章推荐
- 消息顺序和消息事务 - RocketMQ及分布式消息系统的原理以及重要问题解读
- RocketMQ事务消息实现分析
- 消息中间件 RocketMQ源码解析:事务消息
- rocketmq事务消息入门介绍
- rocketmq事务消息入门介绍
- 分布式开放消息系统RocketMQ的原理与实践(消息的顺序问题、重复问题、可靠消息/事务消息)
- 消息中间件 RocketMQ源码解析:事务消息
- RocketMQ源码分析之Broker概述与同步消息发送原理与高可用设计及思考
- RocketMQ 拉取消息-通信模块
- 消息中间件 RocketMQ源码解析:Message顺序发送与消费
- rocketmq学习笔记 六 流程之取消息
- 关于消息队列的使用----ActiveMQ,RabbitMQ,ZeroMQ,Kafka,MetaMQ,RocketMQ
- RocketMQ原理解析-producer 5.消息在broker落地之普通消息
- 分布式消息队列RocketMQ源码分析之3 -- Consumer负载均衡机制 -- Rebalance
- 消息队列比较-rabbitmq/kafka/rocketmq/ONS
- 消息中间件 RocketMQ源码解析:Message发送&接收
- 分布式消息队列RocketMQ源码分析之1 -- Topic路由数据结构解析 -- topicRoute与topicPublishInfo与queueId
- RocketMQ源码:有序消息分析
- RocketMQ原理解析-broker 2.消息存储
- 分布式消息队列RocketMQ&Kafka -- 消息的“顺序消费”