MQ中的消息复制方式

Posted by KANG's BLOG on Tuesday, March 15, 2022

消息队列的主要问题

  • 高性能

    为了高可用,需要把数据写入多个节点后返回发送成功标识,才能保证某个节点挂掉后数据不丢失

    写入节点数量和可靠性是成正比的,但是写入节点越多,性能越差。如果其中一个节点一直不返回,系统需要一直等待这个节点的返回,这是木桶的短板效应。

  • 一致性

    如果要确保数据一致性,必须采用主从的复制方式

RocketMQ消息复制方式

非Dledger的复制方式

分布式下一致性问题,体现在多个节点数据差异上,那么如果保证任意时刻集群都只有一个主节点,那么就可以保证数据一致性

RocketMQ的消息发送到主节点后,就认为发送成功,主从节点为固定配置,如果主节点宕机,并不会将其他从节点切换为主节点,而是等主节点恢复后,再将消息消费出去。所以一个topic下会有多个主从节点,来保证可用性。

这样做的好处是,由于消息发送成功并不依赖于主从复制结果,所以写入性能较高,且保证了一致性、可用性。

Dledger的复制方式

Dledger写入消息的时候,需要至少复制到半数以上节点才返回写入成功,由于多个写入,那么在主节点宕机时,至少有一个节点与主节点数据保持一致,Dledger就会从数据与主节点一致的从节点中选举出一个当做主节点,这样即保证了数据一致性,又保证了严格顺序。

Dledger缺点:

  • 选举过程不能提供服务

  • 资源利用率较低

    由于需要写入成功需要满足“半数以上”的条件,所以至少需要三个节点以上才能保证数据一致性

  • 写入至少半数以上节点,性能比主从复制方式较差