0
点赞
收藏
分享

微信扫一扫

消息队列RocketMQ入门实践--关键特性(四)

鲤鱼打个滚 2022-04-21 阅读 193
javarocketmq

系列文章目录

消息队列RocketMQ入门实践(一)
消息队列RocketMQ入门实践(二)
消息队列RocketMQ入门实践–关键特性(三)


文章目录


前言

嗨,大家好,我是希留。

上篇文章介绍了RocketMQ的关键特性之顺序消息、事务消息。这两个特性算是producer生产者端的特性,那consumer消费者端也有几个关键的特性。
接下来就跟着我一起来了解一下吧。


一、push模式和pull模式

在RocketMQ中,消费者有两种通信模式,一种是(推)push模式,另一种是(拉)pull模式。

  • push模式:客户端与服务端建立连接后,当服务端有消息时,将消息推送到客户端。
  • pull模式:客户端不断的轮询请求服务端,来获取新的消息。

但是RocketMQ在具体实现时,严格意义上来说,并没有push方式,Push和Pull模式都是采用消费端主动拉取的方式,即consumer轮询从broker拉取消息。区别在于:

  • Push方式里,consumer把轮询过程封装了,并注册MessageListener监听器,取到消息后,唤醒MessageListener的consumeMessage()来消费,对用户而言,感觉消息是被推送过来的。
  • Pull方式里,取消息的过程需要用户自己写,首先通过打算消费的Topic拿到MessageQueue的集合,遍历MessageQueue集合,然后针对每个MessageQueue批量取消息,一次取完后,记录该队列下一次要取的开
    始offset,直到取完了,再换另一个MessageQueue。

那这就产生了一个疑问:既然都是采用的pull方式,那如何保证消息的实时性呢?

二、长轮询

RocketMQ中采用了长轮询的方式来实现,那什么又是长轮询呢?可以用一张图来表示:
在这里插入图片描述

长轮询即是在请求的过程中,若是服务器端数据并没有更新,那么则将这个连接挂起,直到服务器推送新的数据,再返回,然后进入循环周期。

客户端像传统轮询一样从服务端请求数据,服务端会阻塞请求(默认阻塞15秒)不会立刻返回,直到有数据或超时才返回给客户端,然后关闭连接,客户端处理完响应信息后再向服务器发送新的请求。

三、消费模式

在实际工作当中,几乎都是使用的push模式来消费消息,采用DefaultMQPushConsumer创建消费者组,DefaultMQPushConsumer实现了自动保存offset值以及实现多个consumer的负载均衡。

代码如下(示例):

DefaultMQPushConsumer consumer = new DefaultMQPushConsumer("xiliu_consumer_group");

通过groupname将多个consumer组合在一起,那么就会存在一个问题,消息发送到这个组后,消息怎么分配呢?

这个时候,就需要指定消息模式,分别有集群和广播模式。

  • 集群模式: 同一个 ConsumerGroup(GroupName相同) 里的每个Consumer 只消费所订阅消息的一部分内容, 同一个 ConsumerGroup 里所有的 Consumer消费的内容合起来才是所订阅 Topic 内容的整体, 从而达到负载均衡的目的 。
  • 广播模式:同一个 ConsumerGroup里的每个 Consumer都能消费到所订阅 Topic 的全部消息,也就是一个消息会被多次分发,被多个Consumer消费。

代码如下(示例):

// 集群模式
consumer.setMessageModel(MessageModel.CLUSTERING);
// 广播模式
consumer.setMessageModel(MessageModel.BROADCASTING);

若没有指定,默认是集群模式消费。


总结

好了,以上就是今天要讲的内容,本文介绍了RocketMQ中consumer端的一些消费特性, 再结合上文说的生产消息的特性,算是RocketMQ比较具有代表性的关键特性了。

若觉得本文对你有帮助的话,帮忙点赞评论关注,支持一波哟~

举报

相关推荐

0 条评论