RocketMQ
基础概念
生产者(Produce)
Producer负责生产消息
消费者(Consumer)
Consumer负责消费消息
命名服务(Naming Server)
NamingServer类似于注册中心,Broker,Producer,Consuer均会与所有NamingServer进行连接,并定时同步,定时上报心跳。
代理服务(Broker)
Broker负责投递消息,Producer与Consumer都是在Broker上发送和消费消息,Broker上会有多个topic的多个MessageQueue
主题(Topic)
主题可以分布在多个broker的多个messagequeue上面。生产者往指定的topic生产消息,consumer从指定的topic消费消息。
消息模式
同步消息
同步消息是指:生产者将消息发送到broker后,broker会将消息刷盘(如果是同步刷盘模式,取决于flushDiskMode配置)并且同步到其slave(取决于节点类型配置,如果该broker是sync_master)后再返回。
SEND_OK 发送成功,FLUSH_DISK_TIMEOUT 刷盘超时, SYNC_SLAVE_TIMEOUT 同步到slave超时,SLAVE_NOT_AVAILABLE 无可用的slave节点
异步消息
异步消息是指:producer将消息发送到broker后就立即返回。
这种情况下刷盘模式,主从同步模式均感知不到。
消息存储
CommitLog
Broker将消息存储到commitlog中,并刷到磁盘(取决于刷盘模式),消息是变长的,顺序写入
ConsumeQueue
ConsumeQueue相当于commitlog的索引文件,其中存储了消息的在commitlog中的offset,min offset(存在消息的最小offset),maxoffset(所有消息的最大offset),消息大小,tag 的hashcode等。
消费模式
顺序消费(orderly)
顺序消费模式下会严格按照消息的发送顺序进行消费,性能偏低,在对消息顺序有严格要求时,可以采用这种模式
并行消费 (concurrently)
消息顺序性得不到保证,性能更好
故障处理
消息积压
consumer
-
批量拉取
一次性拉取多条消息,比一次拉一条速度快
-
先缓存到其他queue
可以是其他队列,或者内存队列
多线程或多实例并行消费
消息重试
同步模式下,Produce会自动尝试重投消息(2次)
重复消费
幂等:幂等通常由消费者的业务来保证,发送时采用唯一的业务id,比如uuid,消费前先到redis或者db等中去比较,没有消费过再消费。
部署
集群
RocketMQ天然支持name server、producer、consumer、broker集群部署。默认是AP模式,当nameserver不可用时,broker,producer,consumer能通过本地缓存的节点信息继续提供服务。