导图社区 RocketMQ总结
RocketMQ基础总结,会实时更新最新的知识点,继续努力。
编辑于2021-01-26 13:58:12RocketMQ-Bili黑马(1)
问题
master跟master之前有数据同步吗?
1个消息会不会被多个consumer消费?
由consumer的消费方式来决定
集群消费模式
只会被一个consumer消费
广播消费模式
多个consumer消费
producer, nameserver,broker,consumer连接方式
consumer与nameserver
某台保持长连接
没有心跳
consumer与broker
单个消费者和该消费者关联的所有broker保持长连接
producer与nameserver
某台保持长连接
没有心跳
单个 Broker 和所有 NameServer 保持长连接
producer与broker
单个生产者和该生产者关联的所有broker保持长连接
多个nameserver时,broker是如何配置的?
在broker配置文件中会把所有的nameserver都配置上
同一个topic在多个master中是否都有?
发送到多个master
topic的某条消息只会发给一个master
broker,topic和队列的关系
Broker与Topic是多对多的关系
不同的master的queue没有关系
消息被消费者group1消费了,是否还可以被group2的消费者消费?
可以
broker配置文件中的刷盘策略的含义?
刷盘就是消息的持久化
同步刷盘
异步刷盘
master宕机,消息是否会写到slave中?
测试。。
顺序消息
保证一个语义的消息发送在同一个队列,来保证消息的顺序性
实现
生产者在生产消息时指定队列即可
MessageQueueSelector
消费者
MessageListenerOrderly
如何解决重复消费消息的问题
幂等
多次执行所产生的影响均与一次执行的影响相同
实现
需要结合具体的业务
方式
方1:写入 Redis 来保证,因为 Redis 的 key 和 value 就是天然支持幂等的
方2:数据库插入法,基于数据库的唯一键来保证重复数据不会被插入多条
消息堆积问题
生产者限流降级
增加消费者实例
增加每个主题的队列数量
如何增加队列数量?
一个 Broker 可以配置多个 Topic
broker如何配置topic?
消息消费后会被删除吗?
刷盘和主从复制的步骤(谁前谁后?)
心跳的实现,借鉴
其他参考资料
https://www.cnblogs.com/qdhxhz/p/11094624.html
http://www.dockone.io/article/9726
一个队列只会被一个消费者消费
每个队列为每个消费者组维护一个消费位移(offset)
回溯消费
消费过的消息重新来消费
如:系统回滚,消息需要重新消费(我)
https://juejin.cn/post/6844904018322391054
概念
NameServer
无状态
NameServer中的Broker、Topic等状态信息不会持久存储,都是由各个角色定时上报并存储到内存中
维持心跳和提供Topic-Broker的关系数据
Broker 管理和路由信息管理
心跳机制
单个Broker跟所有Namesrv保持心跳请求
Consumer跟Broker是长连接
Producer 再跟Topic涉及的所有Broker建立长连接
概念
NameServer
broker
作用
接收消息,处理消息,消息持久,消息的HA,以及服务端过滤
三。作用
1. 解耦应用
2. 流量萧峰
异步
3. 数据分发
解耦
易于增加,减少消费者
五
六。安装
下载,解压
修改配置文件 -- 内存
启动nameserver
启动broker
十。集群模式
1.单master
2. 多master
3. 多master 多slave (异步)
4.多master多slave(同步)
十二。集群搭建1
2主2从, 服务器1(设置master1,slave2), 服务器2(设置master2, slave1)
host修改
nameserver
broker
环境变量修改
类似windows path
etc/profile
source etc/profile
修改消息存储路径
关闭防火墙
十二集群搭建2.
broker配置文件修改
十三.集群搭建3
十九.发布同步消息
步1。创建producer
步2。配置nameserver
步3. 启动producer
步4.组装消息
步5。发送消息
步6。关闭producer
二十。发送异步消息
步1。创建producer
步2。配置nameserver
步3. 启动producer
步4.组装消息
步5。发送消息,跟同步不用的是需要提供回调
producer.send(msg, 回调函数)
步6。关闭producer
二一 。发送单向消息
不在乎返回,例如写日志
步骤
步1。创建producer
步2。配置nameserver
步3. 启动producer
步4.组装消息
步5。发送消息,跟同步不用的是需要提供回调
producer.sendOneway(msg)
步6。关闭producer
二二。消息消费流程
步1.创建consumer
步2。配置nameserver
步3. 设置topic和tag
步4. 设置处理函数
consumer.registerMessageListener
步5.启动consumer
二三。消费者的接收模式
消息的消费方式由消费者决定(我)
模式1:集群消费模式
同一消费group的默认方式
模式2:广播消费模式
二四。顺序消息
解决方案
producer:同一消息放入同一队列
如同一业务,如同一订单的创建,付款,推送,完成
consumer:一个线程来消费
二五。顺序消息发送
同一类消息方到同一个队列中
send(msg, 队列选择器 MessageQueueSelector)
二六。顺序消息消费
步1.创建consumer
步2。配置nameserver
步3. 设置topic和tag
consumer.subscribe(topic, tag)
步4. 设置处理函数
consumer.registerMessageListener
使用MessageListenerOrderly
步5.启动consumer
二七。延迟消息
消息到队列后,延迟一段时间才会被消费者消费
固定的18个级别
二八。消息的批量发送
send时传递list
二九。消息过滤
方1:tag
方2:SQL语法过滤方式
三十。tag过滤
producer
new Message(topic , tag, body)
send时指定tag,消费时指定tag
consumer
consumer.subscribe("TopicTest", "TagA || TagC || TagD")
消费者tag语法
tag
tag1 || tag2 || ...
*
三一。sql过滤
producer:msg.putUserMessage(..)
consumer: consumer.subcribe(topic, messageSelector.bysql(....))
三二。事务消息
状态
中间状态
补偿状态
回滚状态
事务消息是针对发送者来说的(我)
三三。事务消息的实现
new TransactionMQProducer
setTransactionListener
sendMessageIntransaction
九十。消息存储方式
方1:DB
ActiveMQ
方2:文件系统
主流:rocketMQ,kafka, rabitMQ
九一。消息存储和发送性能
消息存储
顺序存储。比随机存储快9000倍
消息消费
零拷贝
九二。存储结构
commitlog
消息存储
consumerQueue的所有消息
最大1G
consumerQueue
commitlog的索引
topic有几个queue就几个consumerQueue文件
indexfile
通过key或其他条件来查询消息
九三。刷盘
类型
同步刷盘
producer 》内存 》disk 》返回producer成功
异步刷盘
producer 》 内存 》返回producer成功 》disk
broker的配置文件中配置
九四。高可用
九五。主从复制
类型
同步复制
异步复制
跟刷盘的策略
主从同步,刷盘异步
九六。生产者负载均衡
消息发送到不同的message queue
topic1:n queue
同一topic会落在不同的broker上
九七。消费者负载均衡
集群模式-负载均衡模式
不同的消费者消费不同的queue
最优方式:queue的数量要大约consumer的数量
九八。消息重试
顺序消息
可能导致堵塞
无序消息
负载均衡模式
默认重试16次,可修改
子主题
广播模式
无重试
九九。死信队列
产生:消息消费超过重试次数
特点
不会被继续消费
3天后被删除
处理
方1:后台管理系统手动重发
方2:写消费者消费
一百。 消息重复
产生原因
发送时重复
投递时重复
重复消费
处理
发送时业务key,消费时比对业务key