消息丢失场景&解决方案
2022-11-19 23:25:57 0 举报
消息丢失场景&解决方案
作者其他创作
大纲/内容
2
RocketMQ事务消息
3、执行本地事物
P
消息丢失的场景 & 如何防止丢失消息1、生产者向MQ发送消息 a、kafka:发送消息+回调 b、RocketMQ:1、发送消息+回调。 2、事务消息 c、RabbitMQ: 1、发送消息+回调。 2、事务消息(用api的方式来实现) channel.txSelect()开启事务 channel.txCommit()提交事务 channel.txRollBack()回滚事务 这种方式的缺点:会对channel产生阻塞、造成吞吐量下降 3、Publisher confirm (RabbitMQ3.0开始提供) 整个处理流程跟RocketMQ事务消息基本一样2、MQ主从同步 a、RocketMQ:同步同步(不会丢消息但效率低)、异步同步(效率更高但有消息丢失的风险) Dledger集群-两阶段提交 b、RabbitMQ: 普通集群:数据分散存储在不同节点,节点之间不会主动进行消息同步,是有可能消息丢失 镜像集群:节点之间主动进行消息同步,提高数据安全性 c、kafka是允许消息丢失的,通常用在允许少量消息丢失的场景。acks:0,1,all3、消息刷盘 a、RocketMQ:(通过配置来修改) 同步刷盘:消息安全性高,但效率会降低 异步刷盘:效率会很高,但消息可能会丢失 b、RabbitMQ:将队列配置成持久化队列、新增Quorom类型队列,会采用raft协议来进行消息同步(两阶段提交) 4、消费者消费消息 由于消费确认和消息消费是异步处理,并且消息消费过程中出现错误导致消息丢失,所以需要同步进行,先处理消息的消费,再提交消息的确认 a、RocketMQ:使用默认的方式消费就行,不要采用异步方式 b、RabbitMQ:autoCommit -> 手动提交offset c、kafka:手动提交offset
1、发送half消息
MQ
分布式事务
4、发送本地事物状态
内存
4-2执行本地事物
本地事物
4-1、P本地事物成功就投递给消费者
4
3
RocketMQ的事物消息
当P向MQ发送本地事物状态为未知的情况下 4-3-1、4-3-2、4-3-3 这三个步骤一直在循环,直到本地事物成功为止,或者循环15次本地事物还是未知就会丢弃消息
2、发送half消息响应
4-3-2、查询本地事物状态
1
S
C
4-3-3、返回本地事物状态
M
4-2、P本地事物失败
4-3-1、P事物为未知则发起回查本地事物状态
硬盘
消息丢失
分布式事务就是需要保证1 和 3 同时成功 或者同时失败RocketMQ 通过保证 1、2 一起成功一起失败的方式确保本地事物一起成功或者一起失败,对于3是补偿的方式确保一定消费,最终达到 1、3 同时成功或同时失败的目的
收藏
0 条评论
下一页