一、RocketMQ结构
1、NameServer
- 简介
- 作用
在RocketMQ中提供命名服务,更新和发现Broker服务
接收Borker的请求,注册Broker的路由信息
接收client(producer/consumer)的请求,根据某个topic获取到Broker的路由信息
2、Borker
- 简介
消息中转角色。每个Broker与NameServer集群中所有节点建立长连接,定时注册Topic信息到所有NameServer。
- 作用
负责消息转发、存储消息。Broker启动之后需要完成一次将自己注册是NameServer的操作。随后每隔30秒定期向NameServer上报Topic路由信息
3、Producer
- 简介
消息的生产者
- 作用
与NameServer的某一个节点建立长连接(Keep-alive),定期从NameServer读取Topic路由信息,并向提供Topic服务的Broker建立长连接,且定期向Broker发送心跳
4、Consumer
- 简介
消息的消费者
- 作用
与NameServer的某一个节点建立长连接(Keep-alive),定期从NameServer读取Topic路由信息,并向提供Topic服务的Broker建立长连接,且定期向Broker发送心跳。Consumer既可以从Master节点订阅消息,也可以从Slave节点订阅消息,消费者在向Master拉去消息时,Master服务器会根据拉取偏移量与最大偏移量的距离(判断是否读取老消息,产生读I/O),以及从服务器是否可读等因素判断建议下一次是从Master还是Slave拉取
5、结构图
二、生产者发送消息的三种方式
1、单向发送
生产者将消息发出,但是不知道消息有没有发送成功。消息有丢失风险,吞吐量非常高。
2、同步发送
生产者将消息发出,等待服务器返回结果,可以确保消息发送成功。吞吐量低。
3、异步发送
生产者将消息发出,通过服务器回调的方式得到发送结果。可以设置发送失败重试次数。消息有丢失风险,吞吐量高
三、消费者消费消息的两种方式
1、拉取模式
消费者主动去Broker拉取消息。
2、推送模式
由Broker收到消息后,主动推给消费者。
四、消息类型
1、普通消息
normal
2、顺序消息
消息局部有序,整体无序。发送时将消息推送到同一个队列,消费时横向消费保证消息局部有序。要保证最终消费到的消息是有序的,需要从Producer、Broker、Consumer三个步骤都保证消息有序才行。
3、广播消息
把消息发给了所有订阅了对应主题的消费者,而不管消费者是不是同一个消费者组。
4、延迟消息
消息并不会立即发送出去,而是会等一段时间再发送出去。开源部分消息延迟时间分为18个等级,1到18分别对应messageDelayLevel=1s 5s 10s 30s 1m 2m 3m 4m 5m 6m 7m 8m 9m 10m 20m 30m 1h 2h。商业版可自定义延迟时间。
5、批量消息
多条消息合并成一个批量消息,一次发送出去。这样的好处是可以减少网络IO,提升吞吐量。建议消息不要超过1M,最大长度4M。超过4M拆分消息再发送。
6、过滤消息
消费者通过tag或者sql过滤消息。直接在Broker通过过滤条件过滤减少IO耗时。
7、事务消息
生产者先发送一个half消息给Broker,Broker收到消息之后给予反馈。生产者收到反馈之后开始执行本地事务逻辑,执行完之后会再给Broker发送一条消息告诉Broker是该commit还是rollback。