rocketMq的高可用和高可靠机制

一、什么是高可用和高可靠

  • 高可用:描述一个系统经过专门的设计,从而减少停工时间,而保持其服务的高度可用性
  • 高可靠:运行时间能够满足预计时间的一个系统或组件

二、rocketMq的高可用性

rocketMq的分布式集群是通过主从的配合来达到高可用性的,在broker的配置文件中:
在这里插入图片描述
在这里插入图片描述
brokerId为0表示这个broker是master,大于0表示这个broker是slave,同时brokerRole参数也会说明这个broker是master还是slave,master角色的broker支持读和写,而slave角色的broker仅支持读
消费端,当master不可用或者繁忙时,就会主动切换到slave进行消息的读取,这就达到了消费端的高可用。
发送端,在创建topic的时候,将topic对应的多个message queue创建在多个broker组上,当一个broker组的master不可用,其他组的master仍然可以用,producer仍然可以继续发送消息,这就保证了发送端的高可用。

三、rocketMq的高可靠性

mq的高可靠性主要包含消息的顺序消费问题和消息的重复消费问题

  • 消息的顺序消费问题:message queue是一个先进先出的队列,其性质本身就已经满足顺序了。而我们要做的是保证发送端发送消息的顺序和消费端消费消息的顺序。
    在发送端,我们只需要将需要顺序消费的消息(同一业务ID的消息)发送到同一个message queue中即可,producer一般用messageQueueSelector类来控制把消息发往某一个message queue。
    在消费端,我们需要保证从message queue读取到的消息不被并发消费,消费端通过使用MessageListenerOrderly来解决message queue中的消息不被并发处理的问题,messageListenerOrderly并不是简单的禁止并发处理,而是采用了锁的机制,为每个message queue都加上了一把锁,要想消费到某一个message queue的消息,则必须获取到这把锁才行,从而保证了消费端消费消息的顺序。
  • 消息的重复消费问题:解决重复消费主要有两种办法:
    (1)保证消费逻辑的幂等性:例如消费端消费消息的逻辑只是为了修改数据表的值,那就无所谓重复消费的问题了,因为一次调用和多次调用结果相同。
    (2)维护一个已经消费消息的记录:消费前查询这个消息是否被消费过

版权声明:本文为qq_40820235原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。