KANG's BLOG

Let's have some fun

RocketMQ如何实现事务

RocketMQ的事务 RocketMQ保证的是本地事务和发送消息这二者,要么都成功,要么都失败。 如何实现 producer端 producer发送一个“半消息”到broker 然后执行本地事务,调用endTransaction()方法,根据执行结果发送单向rpc请求通知broker完成事务提交或者回滚 broker端 接收到消息根据消息类型,如果是“半消息”,则存放在单独队列中,并定时轮询这些消息去反查producer的本地事务的结果 接收到事务提交或回滚的通知,或者完成反查后,把“半消息”标记为已处理 如果提交,则把消息复制到其真正的主题和队列中去;如果回滚则直接结束事务。

MQ中的消息复制方式

消息队列的主要问题 高性能 为了高可用,需要把数据写入多个节点后返回发送成功标识,才能保证某个节点挂掉后数据不丢失 写入节点数量和可靠性是成正比的,但是写入节点越多,性能越差。如果其中一个节点一直不返回,系统需要一直等待这个节点的返回,这是木桶的短板效应。 一致性 如果要确保数据一致性,必须采用主从的复制方式 RocketMQ消息复制方式 非Dledger的复制方式 分布式下一致性问题,体现在多个节点数据差异上,那么如果保证任意时刻集群都只有一个主节点,那么就可以保证数据一致性 RocketMQ的消息发送到主节点后,就认为发送成功,主从节点为固定配置,如果主节点宕机,并不会将其他从节点切换为主节点,而是等主节点恢复后,再将消息消费出去。所以一个topic下会有多个主从节点,来保证可用性。