目录
一、RocketMQ的构成
RocketMQ的几个角色:
Nameserver
:
- nameserver是服务发现者,集群中各个角色(producer、broker、consumer等)都需要定时(30s)向nameserver上报自己的状态,以便互相发现彼此,超时不上报的话(90s),nameserver会把它从列表中剔除。
- 底层由netty实现,提供了路由管理、服务注册、服务发现的功能,是一个
无状态节点
- NameServer集群间
互不通信
,没有主备的概念 - 内存式存储,broker、topic等信息默认不会持久化
Broker
:
- 每个Broker节点,在启动时,都会遍历NameServer列表,与每个NameServer建立长连接,注册自己的信息,之后定时上报。
Producer
:
- 随机选择
其中一个NameServer节点建立长连接
,获得Topic路由信息 - 与提供topic服务的
master建立长连接
,且定时向master发送心跳
Consumer
:
- 通过NameServer集群获得Topic的路由信息,连接到对应的Broker上消费消息
- 与Master和Slave都建立连接进行消费消息,Master和Slave都可以读取消息。
二、消息的类型
RocketMQ支持普通消息、分区有序消息、全局有序消息、延迟消息和事务消息:
普通消息
:称为并发消息,和传统的队列相比,并发消息没有顺序,生产消费都是并行进行的,单机性能可达十万级别的TPS。分区有序消息
:与Kafka中的分区类似,把一个Topic消息在多个队列“保存”和消费,在每个队列中遵循FIFO(先进先出)原则全局有序消息
:如果把一个 Topic 的分区数设置为 1,那么该 Topic 中的消息就是单队列,所有消息都遵循FIFO(先进先出)的原则。延迟消息
:消息发送后,消费者要在一定时间后,或者指定某个时间点才可以消费。在没有延迟消息时,基本的做法是基于定时计划任务调度,定时发送消息。在 RocketMQ中只需要在发送消息时设置延迟级别即可实现事务消息
:主要涉及分布式事务,即需要保证在多个操作同时成功或者同时失败时,消费者才能消费消息。RocketMQ通过发送Half消息、处理本地事务、提交(Commit)消息或者回滚&