Producer
消息生产者,负责生产消息,一般由业务系统负责生产消息。一个消息生产者会把业务应用系统里产生的消息发送到Broker
服务器。RocketMQ 提供多种发送方式,同步发送、异步发送、顺序发送、单向发送。同步和异步方式均需要 Broker
返回确认信息,单向发送不需要。
Consumer
负责消费消息,一般是后台系统负责异步消费。一个消息消费者会从 Broker
服务器拉取消息、并将其提供给应用程序。从用户应用的角度而言提供了两种消费形式:拉取式消费、推动式消费。
NameServer
名称服务充当路由消息的提供者。生产者或消费者能够通过名字服务查找各主题相应的 Broker IP 列表。多个 Namesrver 实例组成集群,但相互独立,没有信息交换。
BrokerServer
消息中转角色,负责存储消息、转发消息。 代理服务器在 RocketMQ 系统中负责接收从生产者发送来的消息并存储、同时为消费者的拉取请求作准备。代理服务器也存储消息相关的元数据,包括消费者组、消费进度偏移和主题和队列消息等。
Message
消息系统所传输信息的物理载体,生产和消费数据的最小单位,每条消息必须属于一个主题。RocketMQ 中每个消息拥有唯一的Message ID
,且可以携带具有业务标识的Key
。系统提供了通过Message ID
和Key
查询消息的功能。
Topic
表示一类消息的集合,每个主题包含若干条消息,每条消息只能属于一个主题,是 RocketMQ 进行消息订阅的基本单位。
Tag
为消息设置的标志,用于同一主题下区分不同类型的消息。可以理解为 Topic
的二级分类。来自同一业务单元的消息,可以根据不同业务目的在同一主题下设置不同标签。标签能够有效地保持代码的清晰度和连贯性,并优化 RocketMQ 提供的查询系统。消费者可以根据 Tag
实现对不同子主题的不同消费逻辑,实现更好的扩展性。
- Broker在启动的时候去向所有的NameServer注册,并保持长连接,每30s发送一次心跳
- Producer在发送消息的时候从NameServer获取Broker服务器地址,根据负载均衡算法选择一台服务器来发送消息
- Conusmer消费消息的时候同样从NameServer获取Broker地址,然后主动拉取消息来消费
整个流程总结:
- 首先先将BrokerServer注册至NameServer中,其中包含的信息有我这个BrokerServer上存放的有哪些topic,我的IP是什么
- NameServer上存放的是各个BrokerServer的IP及所存放的对应topic
- Producer生产者发送信息,会定义对应的IP及存放在哪个topic上,这时Producer发送到NameServer查看,该topic需要放置在哪个BrokerServer上,分析到放置的位置,就直接存放到对应BrokerServer上
- Consumer消费者进行拉取消息时,会指定拉取哪个topic下的消息;这时也是反馈到NameServer确定该topic是存放在哪个BrokerServer中,再到BrokerServer中某台中进行拉取消息
其实是可以把NameServer与BrokerServer看成EurekaServer与 Eureka Client ,需要将客户端注册到服务端上,后面才可以了解到对应的topic是在哪台BrokerServer上进行查看