一、简介

Apache RocketMQ是阿里开源的一款高性能、高吞吐量的分布式消息中间件,具有高性能、高可靠、高实时、分布式特点。

能够保证严格的消息顺序,提供丰富的消息拉取模式。

高效的订阅者水平扩展能力,实时的消息订阅机制,亿级消息堆积能力。

二、RocketMq如何保证高可用的?

consumer 高可用

master 支持读、写,slave 只读。当 master 不可用或者繁忙时,consumer 会被自动切换到 slave 读。 master 出现故障,consumer 仍然可以从 slave 读消息,不受影响。

producer 高可用

创建 topic 时,把 message queue 创建在多个 broker 组上(brokerName 一样,brokerId 不同),当一个 broker 组的 master 不可用后,其他组的 master 仍然可以用,producer 可以继续发消息。

三、RocketMq如何保证高吞吐的?

consumer 高可用

1)客户端发送消息有负载均衡,客户端内存中保存着当前所有的服务器列表,每次发送都切换一台服务器发送消息,使得每台服务器接收的消息量尽量均衡,避免热点问题。2)发送线程安全,当Producer实例就绪之后,完全可以死循环发送消息。一般业务方都会有N个数据源实例,所以从数据源方面就保证高并发写能力。3)消费者端负载均衡集群消费模式下,同一个ID的所有消费者实例平均消费该Topic的所有队列。

producer 高可用

服务端的高并发读写主要利用Linux操作系统的PageCache特性。

通过Java的MappedByteBuffer直接操作PageCache。MappedByteBuffer能直接将文件直接映射到内存,其实就是Map把文件的内容被映像到计算机虚拟内存的一块区域,这样就可以直接操作内存当中的数据而无需操作的时候每次都通过I/O去物理硬盘写文件的。

四、RocketMq的消息是有序的吗?

无序,但是可以保证局部有序

五、RocketMq的消息局部顺序是如何保证的?

根据 MessageQueueSelector 实现的算法来选择一个队列,根据特定id获取到的队列(获取队列数量然后根据数量对id取模)

六、RocketMq事务消息的实现机制?

RocketMQ支持事务消息,com.alibaba.rocketmq.example.transaction.TransactionProducer

第一阶段发送Prepared消息时,会拿到消息的地址

第二阶段执行本地事物

第三阶段通过第一阶段拿到的地址去访问消息,并修改消息的状态

如果最后一阶段执行失败,数据没有发送到broker,导致事务消息的状态更新失败,broker会有回查线程定时(默认1分钟)扫描每个存储事务状态的表格,如果是已经提交或者回滚的消息直接跳过,如果是prepared状态则会向Producer发起CheckTransaction请求,Producer会调用DefaultMQProducerImpl.checkTransactionState()方法来处理broker的定时回调请求,而checkTransactionState会调用我们的事务设置的决断方法来决定是回滚事务还是继续执行,最后调用endTransactionOneway让broker来更新消息的最终状态。

七、RocketMq会有重复消费的问题吗?如何解决?

造成消息重复的根本原因是网络不可达。只要通过网络交换数据,就无法避免这个问题。

消费端处理消息的业务逻辑保持幂等性,保证每条消息都有唯一编号。

八、RocketMq支持什么级别的延迟消息?

RocketMQ 支持定时消息,但是不支持任意时间精度,仅支持特定的 level,如下。其中,level=0 级表示不延时,level=1 表示 1 级延时,level=2 表示 2 级延时,以此类推。

在服务器端(rocketmq-broker端)的属性配置文件中加入以下行:messageDelayLevel=1s 5s 10s 30s 1m 2m 3m 4m 5m 6m 7m 8m 9m 10m 20m 30m 1h 2h

Message msg = new Message(topic, tags, keys, body);

msg.setDelayTimeLevel(1);

九、RocketMq是推模型还是拉模型?

RocketMQ消息订阅有两种模式,一种是Push模式,即MQServer主动向消费端推送。另外一种是Pull模式,即消费端在需要时,主动到MQServer拉取。但在具体实现时,Push和Pull模式都是采用消费端主动拉取的方式。

十、Consumer的负载均衡模式?

consumer负载均衡有6种模式:

1)分页模式(随机分配模式)

2)手动配置模式

3)指定机房模式

4)就近机房模式

5)统一哈希模式

6)环型模式

a379d6fc53af80cf4ae6d830588178fb.png
Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐