自学内容网 自学内容网

消息队列MQ

常用MQ

        kafka rabbitMQ roketMQ

如何保证消息不丢失

        一、生产者发送消息不丢失

kafka:

        消息发送+回调

RocketMQ:

        消息发送+回调、事务消息

        Rocket事务消息流程

        先由生产者发送half消息到MQ,MQ响应half消息(确认MQ状态正常),生产者执行本地事务,再发送具体消息和本地事务状态到MQ。如果状态是成功,MQ向消费者推送消息,如果本地事务状态是失败的,MQ直接丢弃本次消息。如果生产者向MQ发送的本地事务状态为未知状态,MQ对未知状态的消息发起回查,此时生产者检查本地事务状态,再将状态发送给MQ,如果再次为未知,会重试,MQ的回查默认会查15次,如果15次都失败,则丢弃消息。

RabbitMQ:

        1、消息发送+回调

        2、手动事务,提供一组API让用户自己进行事务处理,channel.txSelect()开启事务、channel.txCommit()提交事务,channel.txRollback()回滚事务。channel会产生阻塞,所以会造成吞吐量下降。

        3、Publisher Comfirm整个处理流程跟RocketMQ的事务消息,基本是一致的,但相对来讲没有RocketMQ处理的细致。

二、MQ主从消息同步不丢失:

RocketMQ:

1、普通集群中,同步同步、异步同步,异步同步效率更高,但会产生消息丢失的风险。同步同步不会丢失消息,但效率较低。

2、Dledger集群:两阶段提交

RocketMQ:

1、普通集群:消息是分散存储的,节点之间不会主动进行消息同步,是有可能丢失消息的。

2、镜像集群:镜像集群会在节点之间主动进行数据同步,这样数据安全性得到提高。

Kafka:通常都是允许少量消息丢失的场景。可以通过配置参数acks的值来减少丢失,对应的值分别为0、1、-1(all)‌acks=0‌:生产者在发送消息后并不等待任何来自服务器的响应,直接认定消息发送成功并继续发送下一条数据。这种模式具有最低的延迟,但数据丢失的风险最高,适用于对延迟要求极高且可以容忍一定数据丢失的场景,例如日志收集‌。‌acks=1‌:只有当分区的leader副本接收到消息并将其写入本地磁盘时,生产者才会收到一个成功响应。这是Kafka默认的设置,提供了一定程度的数据保证,但如果leader副本在follower副本同步之前宕机,依然存在数据丢失的风险‌。‌acks=all‌(acks=-1):生产者会等待所有与leader副本同步的副本(ISR)都成功接收并写入消息后才能收到一个成功响应。这种模式提供了最高级别的数据保证,确保了多个副本间的数据一致性,但也因副本间的同步增加了延迟‌

三、MQ消息存盘不丢失    

RocketMQ:同步刷盘、异步刷盘;异步刷盘效率更高。同步刷盘消息安全性更高,但效率会降低。

RabbitMQ:将队列配置成持久化队列,新增的Quorum类型的队列,会采用Raft协议来进行消息同步,使用的两阶段提交的方式。

四、MQ消费者消费消息不丢失

RocketMQ:使用默认的方式消费就行,不要采用异步方式。

RabbitMQ:autoCommit的方式改为手动提交offset

kafka:使用手动提交


原文地址:https://blog.csdn.net/yudilan6/article/details/144010729

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!