RocketMQ(五)——消费模式

10 篇文章 1 订阅
10 篇文章 17 订阅

一、集群消费

之前的博客中,启动的都是单个Consumer,如果启动多个呢?

RocketMQ-集群消费
RocketMQ-集群消费

其实,对于RocketMQ而言,通过ConsumeGroup的机制,实现了天然的消息负载均衡!通俗点来说,RocketMQ中的消息通过ConsumeGroup实现了将消息分发到C1/C2/C3/…的机制,这意味着我们将非常方便的通过加机器来实现水平扩展!

我们考虑一下这种情况:比如C2发生了重启,一条消息发往C3进行消费,但是这条消息的处理需要0.1S,而此时C2刚好完成重启,那么C2是否可能会收到这条消息呢?答案是肯定的,也就是consume broker的重启,或者水平扩容,或者不遵守先订阅后生产消息,都可能导致消息的重复消费!关于去重的话题会在后续中予以介绍!

至于消息分发到C1/C2/C3,其实也是可以设置策略的:
RocketMQ-消息负载策略
RocketMQ-消息负载策略

使用哪种策略,只需要实例化对应的对象即可,如:

AllocateMessageQueueStrategy aqs = new AllocateMessageQueueAveragelyByCircle();
consumer.setAllocateMessageQueueStrategy(aqs);

上面内容,其实是一种消费模式——集群消费。
RocketMQ的消费模式有2种,查看一下源码:

public enum MessageModel {
    /**
     * broadcast
     */
    BROADCASTING,
    /**
     * clustering
     */
    CLUSTERING;
}

在默认情况下,就是集群消费(CLUSTERING),也就是上面提及的消息的负载均衡消费。另一种消费模式,是广播消费(BROADCASTING)。


二、广播消费

广播消费,类似于ActiveMQ中的发布订阅模式,消息会发给Consume Group中的每一个消费者进行消费。
RocketMQ-广播消费模式设置
RocketMQ-广播消费模式设置

/**
 * Consumer,订阅消息
 */
public class Consumer2 {
	public static void main(String[] args) throws InterruptedException, MQClientException {
		DefaultMQPushConsumer consumer = new DefaultMQPushConsumer("group_name");
		consumer.setNamesrvAddr("192.168.2.222:9876;192.168.2.223:9876");
		consumer.setConsumeMessageBatchMaxSize(10);
		
		// 设置为广播消费模式
		consumer.setMessageModel(MessageModel.BROADCASTING);
		
		consumer.setConsumeFromWhere(ConsumeFromWhere.CONSUME_FROM_FIRST_OFFSET);
		consumer.subscribe("TopicTest", "*");

		consumer.registerMessageListener(new MessageListenerConcurrently() {
			public ConsumeConcurrentlyStatus consumeMessage(List<MessageExt> msgs, ConsumeConcurrentlyContext context) {
				try {
					for (MessageExt msg : msgs) {
						System.out.println(" Receive New Messages: " + msg);
					}
				} catch (Exception e) {
					e.printStackTrace();
					return ConsumeConcurrentlyStatus.RECONSUME_LATER;	// 重试
				}
				return ConsumeConcurrentlyStatus.CONSUME_SUCCESS;		// 成功
			}
		});

		consumer.start();
		System.out.println("Consumer Started.");
	}
}

内容补充

《RocketMQ(三)——HelloWorld》那篇博客的最后提到了单批次消息消费数量 ,本文既然提到了集群消费,那就针对这两个内容再进行一次补充吧。
如果我们有2台节点,Producerw往MQ上写入20条数据 其中Consumer1中拉取了12条 。Consumer2中拉取了8 条,这种情况下,假如Consumer1宕机,那么我们消费数据的时候,只能消费到Consumer2中的8条,Consumer1中的12条已经持久化了。需要Consumer1恢复之后这12条数据才能继续被消费。其实这种先启动producer往MQ上写数据,然后再启动Consumer的情况本来就是违规操作,正确的情况应该是先启动Consumer后再启动producer。

  • 4
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值