架构
一个提供以订阅发布模式的消息中间件:
概念
topic:一级消息类型
tag:二级消息类型
NameServer
特点:无状态、集群部署、节点间通信(意味着其数据不一致)
作用:路由注册、发现、删除
心跳检测
各节点均持有broker全量信息
Broker
提供topic服务,启动后向nameServer注册
作用:
1、消息存储:刷盘机制
同步刷盘:producer向master发送消息后,master/slave均写入成功才返回
异步刷盘:即写入master后立刻返回,然后slaver从master进行pull消息进行同步
如何保证高性能?
效率上讲,文件系统高于KV存储,kv存储优于关系型数据库
1)commitLog文件,串行存储所有主题消息
2)consumeQueue,消息消费队列,由commitLog异步同步
3)IndexFile,消息索引,快速定位消息
2、消息转发
3、消息同步
高可用(HA):即从设计上减少系统不能提供服务的时间;
一般方式为:多主多从 同步/异步复制
master:负责消息的读写,不断发送commitlog给slave节点
slave:只负责读消息,上报commitlog偏移量,即已同步到的位置
生产者
特点:与NameServer长连接,读取topic信息
与Master broker长连接,发送心跳
消费者
集群模式:同一消息只允许被一个消费者消费;
广播模式:被所有消费者消费一次;
消息确认(ACK)
延迟级别:不支持定时消息调度,提供几个延迟级别(实现:为每个延迟级别创建一个调度任务):10s,20s……
事务消息:本质是进行commit、rollback、未知状态的处理,言而总之,基于二阶段提交和事务状态回查机制做最终一致性
概念:半消息:消息为“暂不投递”,成为半消息;
1)发送消息到MQ服务器,消息状态为SEND_OK
2)执行DB操作;DB执行成功Commit DB操作,DB执行失败Rollback DB操作。
3)如果DB执行成功,状态为COMMIT_MESSAGE;失败:ROLLBACK_MESSAGE;
4)MQ内部提供一个名为“事务状态服务”的服务,检查事务消息的状态,如果发现消息未COMMIT,则通过Producer启动时注册的TransactionCheckListener来回调业务系统,业务系统在checkLocalTransactionState方法中检查DB事务状态,如果成功,则回复COMMIT_MESSAGE,否则回复ROLLBACK_MESSAGE;