RocketMQ面试题合集

ops/2024/12/14 20:14:45/

消费者获取消息是从Master Broker还是Slave Broker获取?

Master Broker宕机,Slave Broker会自动切换为Master Broker吗?

这种Master-Slave模式不是彻底的高可用模式,他没法实现自动把Slave切换为Master。在RocketMQ 4.5之后,这种情况得到了改变,因为RocketMQ支持了一种新的机制,叫做Dledger(基于Raft协议)

老齐

当同一类消息被送入不同队列,且这些消息在处理上并不需要按时序消费时,可以考虑使用并发消费模式。并发消费模式生产者会将消息轮询发送到不同的队列当中,这些队列会和消费者实例建立多个连接(线程)将消息并发送入到不同的消费者。因为消费者处理速度有快慢,所以并不能保证物流数据会按0~9的顺序依次消费。并发消费模式处理效率很高,但无法保证有序性。
在这里插入图片描述

有序消费

有序消息是指生产者在产生数据的时候,根据Hash规则指定让消息放入哪个队列,在消费者消费时会保证不同消费者针对每一个队列只有唯一的连接(线程)用于消费指定队列。

有序消费模式可以保证消息按队列FIFO顺序依次被消费,但因此失去并发性能,有序消费模式只有在业务要求必须按顺序消费的场景下才允许使用。
在这里插入图片描述

RocketMQ如何实现有序消息

要实现RocketMQ有序消息需要两点调整:
生产者端要求按id等唯一标识分配消息队列消费者端采用专用的监听器保证对队列的单线程应用下面咱们来看一下代码:

生产者端

com.itlaogi.rocketmg.seqmsg.SequenceMessageProvider
核心代码是在向Broker发送消息时附加MessageQueueSelector对象,在实现select方法时指定存放到哪个队列中。

java">public class RocketMQProducerExample {public static void main(String[] args) throws MQClientException {// 创建生产者实例DefaultMQProducer producer = new DefaultMQProducer("producer_group_name");// 设置NameServer地址,这里需要替换为实际的地址producer.setNamesrvAddr("localhost:9876");producer.start();try {for (Integer orderId = 1; orderId <= 10; orderId++) {for (int i = 0; i < 3; i++) {String data = "";switch (i % 3) {case 0:data = orderId + "号创建订单";break;case 1:data = orderId + "号订单减库存";break;case 2:data = orderId + "号订单加积分";break;}// 创建消息对象 topic="order", tags="order", key=orderIdMessage message = new Message("order", "order", orderId.toString(), data.getBytes("UTF-8"));// 发送消息,实现MessageQueueSelector接口SendResult result = producer.send(message, new MessageQueueSelector() {// select方法决定向broker哪一个队列发送消息@Overridepublic MessageQueue select(List<MessageQueue> mqs, Message msg, Object arg) {int currentOrderId = Integer.parseInt(msg.getKeys());int index = currentOrderId % mqs.size();MessageQueue messageQueue = mqs.get(index);Logger.getLogger(RocketMQProducerExample.class.getName()).log(Level.INFO,"id:{0},data:{1},queue:{2}", new Object[]{currentOrderId, new String(msg.getBody()), messageQueue});return messageQueue;}}, null);}}} catch (Exception e) {e.printStackTrace();} finally {producer.shutdown();}}
}
java">public class RocketMQConsumerExample {public static void main(String[] args) throws Exception {// 创建消费者实例并指定消费者组名DefaultMQPushConsumer consumer = new DefaultMQPushConsumer("consumer_group_name");// 设置NameServer地址,需替换为实际地址consumer.setNamesrvAddr("localhost:9876");// 设置从哪里开始消费消息,比如从上次消费的位置开始consumer.setConsumeFromWhere(ConsumeFromWhere.CONSUME_FROM_LAST_OFFSET);// 订阅主题和标签consumer.subscribe("order", "*");// 注册顺序消费的监听器,用于实现有序队列consumer.registerMessageListener(new MessageListenerOrderly() {@Overridepublic ConsumeOrderlyStatus consumeMessage(List<MessageExt> msgs, ConsumeOrderlyContext context) {try {for (MessageExt msg : msgs) {// 在这里处理具体的消息,按照顺序来处理每个消息System.out.println(new String(msg.getBody()));}return ConsumeOrderlyStatus.SUCCESS;} catch (Exception e) {e.printStackTrace();return ConsumeOrderlyStatus.SUSPEND_CURRENT_QUEUE_A_MOMENT;}}});consumer.start();System.out.println("Consumer started.");}
}

运行结果
在这里插入图片描述

如何实现消息全局顺序消费?

只需要在生产者固定将所有消息发送到0号队列即可保证全局有序,这也意味着全局采用单线程消费,执行效率极差

java">@Override
public MessageQueue select(List<MessageQueue> mgs, Message msg, object arg){MessageQueue messageQueue = mgs.get(0);return messageQueue;
}

有序消费有什么使用限制吗?

有序消费模式只支持集群模式(CLUSTERING),不支持广播模式(BROADCASTING),:采用广播模式会无法接收到数据

java">//设置为集群模式
consumer.setMessageModel(MessageMode1.CLUSTERING)://支持有序消息,默认模式。
consumer.setMessageModel(MessageMode1.BROADCASTING)://不支持有序消息

http://www.ppmy.cn/ops/141899.html

相关文章

黑客基础之html

声明&#xff01; 学习视频来自B站up主 泷羽sec 有兴趣的师傅可以关注一下&#xff0c;如涉及侵权马上删除文章&#xff0c;笔记只是方便各位师傅的学习和探讨&#xff0c;文章所提到的网站以及内容&#xff0c;只做学习交流&#xff0c;其他均与本人以及泷羽sec团队无关&#…

深度学习训练参数之学习率介绍

学习率 1. 什么是学习率 学习率是训练神经网络的重要超参数之一&#xff0c;它代表在每一次迭代中梯度向损失函数最优解移动的步长&#xff0c;通常用 η \eta η 表示。它的大小决定网络学习速度的快慢。在网络训练过程中&#xff0c;模型通过样本数据给出预测值&#xff0…

Linux下SVN客户端保存账号密码

参考文章&#xff1a;解决&#xff1a;Linux上SVN 1.12版本以上无法直接存储明文密码_linux svn 保存密码-CSDN博客新版本svn使用gpg-agent存储密码-CSDN博客svn之无法让 SVN 存储密码&#xff0c;即使配置设置为允许_编程设计_ITGUEST 方法一&#xff1a;明文方式保存密码 首…

lc46全排列——回溯

46. 全排列 - 力扣&#xff08;LeetCode&#xff09; 法1&#xff1a;暴力枚举 总共n!种全排列&#xff0c;一一列举出来放入list就行&#xff0c;关键是怎么去枚举呢&#xff1f;那就每次随机取一个&#xff0c;然后删去这个&#xff0c;再从剩下的数组中继续去随机选一个&a…

Ubuntu本地快速搭建web小游戏网站,公网用户远程访问【内网穿透】

文章目录 前言1. 本地环境服务搭建2. 局域网测试访问3. 内网穿透3.1 ubuntu本地安装cpolar内网穿透3.2 创建隧道3.3 测试公网访问4. 配置固定二级子域名4.1 保留一个二级子域名4.2 配置二级子域名4.3 测试访问公网固定二级子域名前言 网:我们通常说的是互联网;站:可以理解成…

[C++]类的继承

一、什么是继承 1.定义&#xff1a; 在 C 中&#xff0c;继承是一种机制&#xff0c;允许一个类&#xff08;派生类&#xff09;继承另一个类&#xff08;基类&#xff09;的成员&#xff08;数据和函数&#xff09;。继承使得派生类能够直接访问基类的公有和保护成员&#xf…

CSS系列(12)-- 响应式设计详解

前端技术探索系列&#xff1a;CSS 响应式设计详解 &#x1f4f1; 致读者&#xff1a;掌握响应式设计的艺术 &#x1f44b; 前端开发者们&#xff0c; 今天我们将深入探讨 CSS 响应式设计&#xff0c;学习如何创建适应各种设备的网页布局。 响应式基础 &#x1f680; 视口设…

OpenAI直播发布第5天:ChatGPT+Siri=新Apple Intelligence!

大家好&#xff0c;我是木易&#xff0c;一个持续关注AI领域的互联网技术产品经理&#xff0c;国内Top2本科&#xff0c;美国Top10 CS研究生&#xff0c;MBA。我坚信AI是普通人变强的“外挂”&#xff0c;专注于分享AI全维度知识&#xff0c;包括但不限于AI科普&#xff0c;AI工…