RocketMq:消息中间件
分组(Group):标识一类消息的生产者(事务消息)、消费者(负载均衡)
主题(Topic):一类主题、消息,理解为物理管理单元,一个主题可存在多个消息队列
消息队列(Message Queue):由生产者(Producer)生产的消息推送给消费者(Consumer)消费的消息队列
偏移量(offset):用于记录上次消费者消费消费消息的条数,比如当producer产生1000条消息,消费者只对其中500条消息进行消费,则会记录当前消息队列(q)的消费记录到第500条,下次消费会从501条开始消费
配置环境变量:
新建ROCKETMQ_HOME
概念:
Broker Cluster:主机,消息存储者,削峰填谷
Producer集群:服务生产者
NameSever:可以理解为RocketMQ的大脑,完成服务的注册和发现(类似Zookeeper)以及消息的路由
Consumer集群:服务消费者
心跳:Broker Cluster会定时每隔10秒向Name Sever发送心跳,若超过120秒未发送心跳,则被Name Sever判断为宕机状态,宕机的Broker主机则会从Name Sever的路由表进行移除,并且会在下次消息重发的时候会往下一台服务器进行消息发送;并且在下一轮消息重发的时候如果下一台服务器还是无法成功则会重新往当前服务器进行消息发送
启动流程:启动NameSever,启动Broker,Broker向NameSever注册,生产者(Producer)从NameSever获取需要发送的对象/主机(Broker)的列表,根据负载均衡算法进行数据分发
消费服务:向Name Sever获取对象/主机(Broker)的列表
RocketMQ的幂等性:保证事务的一致性,不可重复性
负载均衡
领域模型:
Message:消息
Message是RocketMQ中作为一个主体
Equals hashCode:
判断消息只做一次处理以确保消息一致性
Topic:主题
对消息进行分类
tagssubTopics:子分类,相当于当前Topic(主题)下的二级子分类
Queue:
消息的物理管理单元
涉及业务消费的时候,都会产生Queue的偏移量;且一定会产生Queue
Offset:偏移量
Group:
一堆生产者和一堆消费者
Topic和Message是一对多关系,一条Topic可对应多条Message和Queue,
Queue和Offset是一对一关系
欲提高并发度,重点在于提高Queue,Topic划分更多Queue进行消费存储
MQ无法确保消息不重复
产生消息重复因素复杂(比如网络问题可能会造成重复请求)需要业务端处理消息重复问题
消息存储:
文件存储形式
消息可存储于RocketMQ当中,实现消息持久化的效果,宕机不丢数据
消息存放:RocketMQ-->Store-->commitlog目录下
文件默认大小为1G
生产者发送消息,会将消息写入到CommiLog下的文件中,如果写入消息数量没超过1G则只保留一个文件,若超出1G会产生多个文件(存储文件记录单位为Bytes,遵循1024进制)
一个存储文件可以存储多个Topic的文件(文件单一的好处:存储速度快,存储完一个文件自动生成新的文件)
存储格式:
存储:
消息总长度:TOTALSIZE
IndexFile:
根据Key的值进行索引查找
消息消费:
消息消费文件在consumequeue目录下,根据不同的Topic创建不同的文件夹,对应主体会根据消息队列创建0,1,2,3......的文件夹,同时在对应文件夹下自动创建一个文件
consumequeue下的文件并不会存储消息本体,而是存储消息偏移量
消息删除策略:
定时删除多余数据,围绕commitlog和consumequeue的文件删除为主,共享删除机制
过期判断:非写文件(可理解为已经写满1G的文件导致无法进行数据写入的commitlog下的文件)一段时间没有被再次更新将会被RocketMQ判断为过期文件,默认为48小时(fileReservedTime),满足条件将会被判定为可删除文件
删除条件:删除时间点(deleteWhen),默认时间为凌晨4点;且磁盘空间不足(默认为磁盘空间占用不超过85%)
相比较RabbitMQ:
消息存储在内存当中,优点是存储速度快
半消息存储机制:
确认提交(commit)后,写入存储文件
主从调用机制:
默认状态下,主服务器运行内存占用(RocketMQ占用)超过服务器的总内存的40%,主服务器会被RocketMQ判断法为繁忙状态,此时消费端自动从从服务器获取消息。
源码分析:getMessage
高可用:
生产的高可用依赖于集群的高可用
消费者的重试机制:
判断是否需要进行重试是根据是否抛出异常,若抛出异常
消费者进行消息消费时,重试次数默认为16次,超出重试次数被判定为死信消息;
重试次数设置对相同组群下的所有consumer实例有效
注:死信消息触发文件删除条件将会被自动删除
RocketMQ的权限配置:
broker.conf
aclEnable=true为开启
配置路径:
Linux的conf路径地下加载plain_acl.yml文件
配置方式:
globalWhiteRemoteAddresses:按照地址进行配置,设置全局地址白名单
accounts:按照用户名设置白名单
accessKey:用户名
secretKey:用户密码
admin:是否属于管理员账号(false为不属于,true为属于)
defaultTopicPerm:控制Topic权限,默认DENY(拒绝)
defaultGroupPerm:控制Group状态/权限,SUB为订阅,PUB为发送
topicPerms:Topic权限状态
性能调优:
1、暂停监控组件
2、将RocketMQ单独部署服务器
3、消除偏向锁
UseBiasedLocking关闭
4、使用G1垃圾回收器
在Linux环境下调低堆内存的占用率,以增加回收次数保证RocketMQ的流畅度
-XX:InitiatingHeapOccupacyPercent = 百分比(默认为45%)
如果在Linux服务器当中将此参数百分比进行调低会进行更高频率的垃圾回收以释放资源
ulimit -n 1000:Linux服务器里允许最大运行程序数量为1000
5、调整Ring Buffer大小(网卡相关缓冲区大小调试)
6、中断聚合
7、网卡队列的CPU绑定