一、RocketMQ各组件介绍

NameServer

NameServer作为RocketMQ的注册中心,类似于kafka中的Zookeeper角色。

维护着broker的基本信息、topic和broker之间的路由信息。

Producer连接NameServer,发送信息时由NameServer分配将消息发送到哪个Broker上。

NameServer高可用

NameServer之间不进行消息的传输,Broker会将自己的基本信息发送给所有的NameServer。
因此一个NameServer会保存完整的Broker信息,当NameServer挂掉之后,只要还有NameServer,Producer和Consumer扔然可以发送和消费消息

Broker

broker是用来RocketMQ主要工作组件,包含以下功能:

  1. **Remoting Module:**整个Broker的实体,负责处理来自clients端的请求。

  2. **Client Manager:**负责管理客户端(Producer/Consumer)和维护Consumer的Topic订阅信息

  3. **Store Service:**提供方便简单的API接口处理消息存储到物理硬盘和查询功能。

  4. **HA Service:**高可用服务,提供Master Broker 和 Slave Broker之间的数据同步功能。

  5. **Index Service:**根据特定的Message key对投递到Broker的消息进行索引服务,以提供消息的快速查询。

broker有两种角色:master和slave

Master

Master提供消息的读写服务,实现消息的落盘操作。

Slave

Slave提供消息的读服务,主要是将master中的消息进行备份。

Producer

生产消息的模块,根据RocketMQ的分配策略,将消息投递到合适的broker中

主要的消息投递方式:

  • 同步发送:消息发送后,等待broker返回发送结果
  • **异步发送:**消息发送后,立即返回,但是当broker接收到消息后会回调方法
  • **单向发送:**只发送,没有后续操作

Consumer

消费broker消息的模块,支持push和poll模式对消息进行消费

  • **poll:**消费者主要向broker请求消息
  • **push:**broker向消费者推送消息

订阅关系

Tag

Tag可以认为是一个二级分类,Topic是一个一级分类

例:topic是商品。tag是手机、衣服…

Topic下多个tag

消费者组

消费者必须归属于一个消费者组,消费者主要与topic中的队列绑定消费关系。

在一个消费者组中一个消费者可以消费多个队列,但是一个队列只对应一个消费者

消费者组中消费者的订阅关系最好一致,否则会产生丢失消息的现象

丢失消息的现象说明
一、RocketMQ各组件介绍_第1张图片

其问题的核心关键是,同一个tag会分布在不同的队列中,但消费者C1分配到的队列为q0,q1,q0,q1中有taga和tagb的消息,

但tagb的消息会被消费者C1过滤,但这部分消息却不会被C2消费,造成了消息丢失。

消费方式

  • 根据tag的类别进行消费消息
  • 使用SQL92过滤:按照SQL语法对消息属性进行过滤匹配。

你可能感兴趣的:(rocketmq,运维)