一. RocketMQ发送消息的方式
有三种实现方式:可靠同步发送、可靠异步发送、单向发送
- 同步:调用发送消息API,同步等待,知道消息服务器返回发送结果
- 异步:调用消息发送API后马上返回,消息发送成功或失败后会在新线程中执行回调任务
- 单向:只管发,不在乎消息是否能成功存储在消息服务器上
二. 消息发送的基本流程
验证消息、查找路由、消息发送
- 消息默认以同步的方式发送,默认超时时间为3s
- 查找主题路由信息:如果生产者中缓存了topic的路由信息,如果该路由信息包含了消息队列,则直接返回该路由信息,如果没有缓存或没有包含消息队列,则向NameServer查询该topic的路由信息,并更新本地路由表。3. 消息生产者每隔30s会从NameServer更新路由表
三. 消息发送异常机制
- 重试与Broker规避
可以保证消息发送的高可用。Broker规避,在一次消息发送的过程中,如果发送过程中失败,那么在接下来的一段时间内不会选择该消息队列所在的Broker。
四. 存储
RocketMQ主要的存储文件包括:Comitlog文件、ConsumerQueue文件、IndexFile文件
RocketMQ将所有主题的消息存储在同一个文件中,确保消息发送时顺序写文件,尽最大的能力确保消息发送的高性能与高吞吐量。
- Comitlog:消息存储文件,所有消息主题的消息都存储在CommitLog文件中
- ConsumeQueue:消息消费队列,消息到达CommitLog文件后,将异步转发到消息消费队列,供消息消费者消费
- IndexFile:消息索引文件,主要存储消息Key与Offset的对应关系
- 事务状态服务:存储每条消息的事务状态
- 定时消息服务:每一个延迟级别对应一个消息消费队列,存储延迟队列的消息拉取进度