bboyjing's blog

RocketMQ学习笔记二【了解RocketMQ概念】

在上一章中,我们跑通了Quick Start,也对RocketMQ有了一个大致的了解。先看下一张简单的RocketMQ部署图,有个全局的感官:
rocketmq_1
本章节的目的就是了解RocketMQ涉及到的概念以及整体架构介绍。

Producer 与 Producer Group

Producer表示消息队列的生产者,这没什么好解释的,重点了解下这里的Producer Group,先来看Producer中的一段代码,该实例代码位于example子项目的quickstart包中

1
2
DefaultMQProducer producer = new DefaultMQProducer("please_rename_unique_group_name");
producer.start();

功能就是初始化一个producer实例,并且启动。能体现出Group概念的,只是DefaultMQProducer构造函数的参数。查了一些文档,这个producer实例有些地方需要注意一下。一个应用创建一个Producer,由应用来维护此对象,可以设置为全局对象或者单例。ProducerGroupName需要由应用来保证唯一。这样的话,假设有两个项目Project_A和Project_B,每个项目部署两台机器,那么Producer的分布如下:
rocketmq_2

Consumer 与 Consumer Group

Consumer表示消息的消费者,Consumer被分为两类:Push Consumer和Pull Consumer:

  • 应用向Consumer对象注册一个Listener接口,一旦收到消息,Consumer对象立刻回调Listener接口方法
  • 应用通常主动调用Consumer的拉消息方法从Broker拉消息,主动权由应用控制

其实它们的本质都是拉模式(pull),因为RocketMQ的实际就是Consumer从Broker拉消息来消费,但是为了能做到实时收消息,使用了长轮询方式来保证消息实时性。两者的区别是,Push Consumer把轮询过程封装了,并注册MessageListener监听器,取到消息后,唤醒MessageListener的consumeMessage()来消费,对用户而言,感觉消息是被推送过来的。Pull Consumer取消息的过程需要用户自己写。‘
Consumer Group的概念和Producer Group类似,但是涉及到消息的消费方式:广播消费和集群消费。

  • 广播消费:一条消息被多个Consumer消费,即使这些Consumer属于同一个Consumer Group,消息也会被Consumer Group中的每个Consumer都消费一次。
  • 集群消费:一个Consumer Group中的Consumer实例平均分摊消费消息,也就是说排除网络等其他原因,一条消息只会被消费一次。大多数场景应该使用的是此种消费方式。

Broker

Broker是RocketMQ的核心,负责存储和转发消息,其实就是消息队列服务器,需要保证高可用。

NameServer

NameServer即名称服务,有两个功能:

  • 接收broker的请求,注册broker的路由信息
  • 接口client的请求,根据某个topic获取其到broker的路由信息

NameServer被设计成几乎无状态的,可以横向扩展,节点之间无任何信息同步。每个Broker在启动的时候会到NameServer注册,Producer在发送消息前会根据topic到NameServer获取路由(到broker)信息,Consumer也会定时获取topic路由信息。

消息相关解释

关于消息,有如下几点需要了解下:

  • Topic:表示消息的第一级类型,比如一个电商系统可以分为:交易消息、物流消息等,一条消息必须有一个Topic。RocketMQ最佳实践给出的建议是,一个应用尽可能用一个Topic。
  • Tag:表示消息的第二级类型,比如交易消息又可以分为:交易创建消息、交易完成消息等,一条消息可以没有Tag。
  • Queue:消息队列,一个Topic下我们可以设置多个Queue。当发送消息时,需要执行该消息的Topic,RocketMQ会轮询该Topic下的所有队列,将消息发出去。

那么单个Broker内的消息情况如下所示:
rocketmq_3

总结

再看一下本篇开头的网络部署图,最后做个总结。
Name Server是一个几乎无状态的节点,可集群部署,节点之间无任何信息同步。
Broker分为Master与Slave,具体线上应该怎么部署,后面再深究。每个Broker与Name Server集群中的所有节点建立长连接,定时注册Topic信息到所有Name Server。
Producer与Name Server集群中的其中一个节点(随机选择)建立长连接,定期从Name Server取Topic路由信息,并向提供Topic服务的Master建立长连接,且定时向Master发送心跳。Producer完全无状态,可集群部署。
Consumer与Name Server集群中的其中一个节点(随机选择)建立长连接,定期从Name Server取Topic路由信息,并向提供Topic服务的Master、Slave建立长连接,且定时向Master、Slave发送心跳。Consumer既可以从Master订阅消息,也可以从Slave订阅消息,订阅规则由Broker配置决定。