基础知识

1 RocketMQ物理部署结构

(1)Name Server是一个几乎无状态节点,可集群部署,节点之间无任何信息同步。

也就是说就是RocketMQ的注册中心,是专门为RocketMQ设计的轻量级命名服务,可集群横向扩展、无状态等特点。

NameServer这里知道topic相关的所有信息。

(2)Broker部署相对复杂,Broker分为Master与Slave,一个Master可以对应多个Slave,但是一个Slave只能对应一个Master,Master与Slave的对应关系通过指定相同的BrokerName和不同的BrokerId来定义,BrokerId为0 表示Master,非0表示Slave。Master也可以部署多个。每个Broker与Name Server集群中的所有节点建立长连接,定时注册Topic信息到所有Name Server。

(3)Producer与Name Server集群中的其中一个节点(随机选择)建立长连接,定期从Name Server获取Topic路由信息,并向提供Topic服务的Master建立长连接,且定时向Master发送心跳。Producer完全无状态,可集群部署。

(4)Consumer与Name Server集群中的其中一个节点(随机选择)建立长连接,定期从Name Server获取Topic路由信息,并向提供Topic服务的Master、Slave建立长连接,且定时向Master、Slave发送心跳。

2 RocketMQ术语

(1)Producer:消息生产者,负责生产消息。

(2)Consumer:消息消费者,负责消费消息。

(3)Push Consumer:Consumer的一种,业务方通常为Consumer对象注册一个Listener,一旦收到消息,Consumer立即回调Listener接口方法。

(4)Pull Consumer:Consumer的一种,业务方主动调用Consumer拉消息。

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

(5)Producer Group:一类Producer的集合名称,通常为一个业务系统的标识。ProducerGroup这个概念发送普通的消息时,作用不大,但是发送分布式事务消息时,比较关键,因为服务器会回查这个Group下的任意一个Producer。

(6)Consumer Group:一类Consumer的集合名称,通常为一个业务系统的标识。

涉及到消息的消费方式:广播消费和集群消费。

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

(7)Broker:负责消息的存储与转发。

(8)广播消费:一条消息可以被多个Consumer消费,即使这些Consumer属于同一个Consumer Group,消息也会被Consumer Group中的每个Consumer都消费一次。

(9)集群消费:一个Consumer Group中的每个Consumer实例平均分摊消费消息。

(10)顺序消息:消息的消费顺序同发送顺序保持一致,在RocketMQ中,为满足顺序性,Producer必须单线程顺序发送,且发送到同一个队列,Consumer就可以按照Producer发送的顺序去消费消息。

(11)普通顺序消息:即正常情况下可以保证消息的顺序性,但在Broker重启等情况下,由于队列数目发生变化,可能就会在某段时间里不能保持消息的顺序性。

(12)严格顺序消息:完全保证顺序性会牺牲分布式的Failover特性,即只要有一台Broker不可用,整个集群都不可用。可以在Master Broker重启时自动将Slave切换为Master,即可在一定程度上避免顺序性被破坏,但也不能完全保证顺序性。

(13)队列:在RocketMQ中,所有消息队列都是持久化,长度无限的数据结构,所谓长度无限是指队列中的每个存储单元都是定长,访问其中的存储单元使用Offset来访问,offset为java long类型,64位,理论上在100年内不会溢出,所以认为是长度无限,另外队列中只保存最近几天的数据,之前的数据会按照过期时间来删除。

3 总结

最后做个总结。 Name Server是一个几乎无状态的节点,可集群部署,节点之间无任何信息同步。

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

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配置决定。

results matching ""

    No results matching ""