RocketMQ(七)——消息的消费

本文探讨了消息消费的两种主要方式——Pull(拉取)和Push(推送),分析了各自的优缺点,并详细介绍了广播消费和集群消费模式,以及消费进度在不同模式下的保存策略。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

消息的消费

消费的类型

  • 消费者从Broker中获取消息的方式有两种:Pull(拉取)方式和Push(推送)方式
Pull方式
  • Consumer主动从Broker中获取消息,主动权在Consumer。一旦获取了批量消息,就会启动消费过程
缺点:
  • 实时性较弱,Broker中有了新的消息时,消费者不能及时发现并消费
优点:
  • 便于应用控制消息的拉取
Push方式
  • Broker 收到消息后会主动推送给Consumer,该方式获取实时性较高

  • 该方式是典型的发布-订阅模式,即Consumer向其关联的Queue注册监听器,一旦发现有新的消息到来就会触发回调,回调方法时Consumer去Queue中拉去消息。这些都是基于Consumer与Broker之间的长连接。而长连接是需要消耗资源的

缺点
  • 会占用较多的系统资源
优点:
  • 封装了对关联Queue的遍历,实时性强

消费的模式

广播消费

广播消费模式下,相同Consumer Group的每个Consumer实例都接收同一个Topic的全量消息。即:每条消息都会被发送到Consumer Group中的每个Consumer。

集群消费

集群消费模式下,相同Consumer Group的每个Consumer实例平均分摊同一个Topic的消息。即每条消息只会被发送到Consumer Group中的某个Consumer

消费进度的保存
  • 广播模式:消费进度保存在Consumer端,广播模式下consumer group中每个consumer都会消费所有消息,但它们的消费进度是不同。所以consumer各自保存各自的消费进度
  • 集群模式:消费进度保存在broker中。consumer group中的所有consumer共同消费一个Topic中的消息,同一条消息只会被消费一次。消费进度会参与到消费的负载均衡中,所以消费进度需要共享。
### 使用RocketMQ进行消息的发送和消费 #### 发送消息RocketMQ中,可以采用不同的方式来发送消息,包括单向发送、同步发送以及异步发送。 对于**单向发送**而言,这种方式不等待服务器端响应,适用于对可靠性要求不高但是性能要求高的场景[^1]。下面是一个简单的Java代码示例展示如何实现单向发送: ```java // 单向发送消息的例子 public class Producer { public static void main(String[] args) throws MQClientException { DefaultMQProducer producer = new DefaultMQProducer("please_rename_unique_group_name"); producer.start(); Message msg = new Message("TopicTest", "TagA", ("Hello RocketMQ").getBytes(RemotingHelper.DEFAULT_CHARSET)); try { producer.sendOneway(msg); } catch (Exception e) { // Handle exception here. } producer.shutdown(); } } ``` 针对**同步发送**的情况,则会阻塞直到收到服务端确认或发生超时错误。此方法适合于需要确保每条消息都被成功投递的应用程序。以下是同步发送的一个实例: ```java // 同步发送消息例子 Message msg = new Message("TopicTest", "TagA", ("Hello RocketMQ Sync").getBytes(RemotingHelper.DEFAULT_CHARSET)); SendResult sendResult = producer.send(msg); System.out.printf("%s%n", sendResult); ``` 而**异步发送**允许应用程序继续执行而不必等待发送完成的结果报告;这对于高吞吐量应用非常有用。这里给出一段用于异步发送的代码片段: ```java // 异步发送消息例子 producer.send(message, new SendCallback() { @Override public void onSuccess(SendResult sendResult) { System.out.printf("%s%n", sendResult); } @Override public void onException(Throwable throwable) { // Handle exception here. } }); ``` #### 消费消息 RocketMQ支持两种主要的消息消费模式——推送(Push)模式与拉取(Pull)模式。 当使用**推模式**时,Broker主动将到达的消息推送给Consumer客户端。这种机制简化了消费者的逻辑设计并提高了处理效率。下面是创建一个简单消费者类来进行消息监听的方法: ```java DefaultLitePullConsumer consumer = new DefaultLitePullConsumer("example_group_name"); consumer.setNamesrvAddr("localhost:9876"); consumer.subscribe("TopicTest", "*"); consumer.registerMessageListener(new MessageListenerConcurrently() { @Override public ConsumeConcurrentlyStatus consumeMessage(List<MessageExt> msgs, ConsumeConcurrentlyContext context) { for (MessageExt msg : msgs) { // Process message here... System.out.println(new String(msg.getBody())); } return ConsumeConcurrentlyStatus.CONSUME_SUCCESS; } }); consumer.start(); ``` 另一方面,在**拉模式**下,Consumer周期性地请求获取一批的未读取消息。这给予开发者更多控制权去管理资源分配及优化网络流量消耗。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

稷下学员

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值