mq——如何保证消息不会丢失(代码片段)

shog808 shog808     2023-01-12     784

关键词:

一条消息从生产到消费完成这个过程,可以划分三个阶段,为了方便描述,我给每个阶段分别起了个名字。

生产阶段: 在这个阶段,从消息在 Producer 创建出来,经过网络传输发送到 Broker 端。存储阶段: 在这个阶段,消息在 Broker 端存储,如果是集群,消息会在这个阶段被复制到其他的副本上。消费阶段: 在这个阶段,Consumer 从 Broker 上拉取消息,经过网络传输发送到 Consumer 上。

 

1、生产阶段

在生产阶段,消息队列通过最常用的请求确认机制,来保证消息的可靠传递:当你的代码调用发消息方法时,消息队列的客户端会把消息发送到 Broker,Broker 收到消息后,会给客户端返回一个确认响应,表明消息已经收到了。客户端收到响应后,完成了一次正常消息的发送。只要 Producer 收到了 Broker 的确认响应,就可以保证消息在生产阶段不会丢失。有些消息队列在长时间没收到发送确认响应后,会自动重试,如果重试再失败,就会以返回值或者异常的方式告知用户。你在编写发送消息代码时,需要注意,正确处理返回值或者捕获异常,就可以保证这个阶段的消息不会丢失。以 Kafka 为例,我们看一下如何可靠地发送消息:同步发送时,只要注意捕获异常即可。

try    
    RecordMetadata metadata = producer.send(record).get();    
    System.out.println("消息发送成功。");
 catch (Throwable e)     
    System.out.println("消息发送失败!");    
    System.out.println(e);

异步发送时,则需要在回调方法里进行检查。这个地方是需要特别注意的,很多丢消息的原因就是,我们使用了异步发送,却没有在回调中检查发送结果。

producer.send(record, (metadata, exception) -> 
    if (metadata != null) 
        System.out.println("消息发送成功。");
     else 
        System.out.println("消息发送失败!");
        System.out.println(exception);
    
);

2、存储阶段

在存储阶段正常情况下,只要 Broker 在正常运行,就不会出现丢失消息的问题,但是如果 Broker 出现了故障,比如进程死掉了或者服务器宕机了,还是可能会丢失消息的。如果对消息的可靠性要求非常高,可以通过配置 Broker 参数来避免因为宕机丢消息。对于单个节点的 Broker,需要配置 Broker 参数,在收到消息后,将消息写入磁盘后再给 Producer 返回确认响应,这样即使发生宕机,由于消息已经被写入磁盘,就不会丢失消息,恢复后还可以继续消费。例如,在 RocketMQ 中,需要将刷盘方式 flushDiskType 配置为 SYNC_FLUSH 同步刷盘。如果是 Broker 是由多个节点组成的集群,需要将 Broker 集群配置成:至少将消息发送到 2 个以上的节点,再给客户端回复发送确认响应。这样当某个 Broker 宕机时,其他的 Broker 可以替代宕机的 Broker,也不会发生消息丢失。

3、消费阶段

消费阶段采用和生产阶段类似的确认机制来保证消息的可靠传递,客户端从 Broker 拉取消息后,执行用户的消费业务逻辑,成功后,才会给 Broker 发送消费确认响应。如果 Broker 没有收到消费确认响应,下次拉消息的时候还会返回同一条消息,确保消息不会在网络传输过程中丢失,也不会因为客户端在执行消费逻辑中出错导致丢失。你在编写消费代码时需要注意的是,不要在收到消息后就立即发送消费确认,而是应该在执行完所有消费业务逻辑之后,再发送消费确认。

 

浅谈rocketmq如何保证消息不丢失(代码片段)

RocketMQ如何保证消息不丢失?一、明确丢失消息场景二、RocketMQ避免消息丢失解决方案1、消息生产者使用事务消息2、配置同步刷盘+Dledger主从架构3、消息消费者端使用同步消费机制4、设计降级方案MQ如何避免消息不丢失&#x... 查看详情

浅谈rocketmq如何保证消息不丢失(代码片段)

RocketMQ如何保证消息不丢失?一、明确丢失消息场景二、RocketMQ避免消息丢失解决方案1、消息生产者使用事务消息2、配置同步刷盘+Dledger主从架构3、消息消费者端使用同步消费机制4、设计降级方案MQ如何避免消息不丢失&#x... 查看详情

互联网面试必杀:如何保证消息中间件全链路数据100%不丢失(代码片段)

...环境使用消息中间件技术的时候,从前到后的全链路到底如何保证数据不能丢失。这个问题,在互联网公司面试的时候高频出现,而且也是非常现实的生产环境问题。如果你的简历中写了自己熟悉MQ技术(RabbitMQ、RocketMQ、Kafka)... 查看详情

互联网面试必杀:如何保证消息中间件全链路数据100%不丢失:第二篇(代码片段)

前情提示上一篇文章《互联网面试必杀:如何保证消息中间件全链路数据100%不丢失:第一篇》,我们初步介绍了之前制定的那些消息中间件数据不丢失的技术方案遗留的问题。一个最大的问题,就是生产者投递出去的消息,可能... 查看详情

mq消息队列(代码片段)

...点1.3消息队列的缺点1.4消息队列比对2、RabbitMQ2.1、RabbitMQ如何保证消息不被重复消费2.2、RabbitMQ如何保证消息不丢失2.2.1生产者丢数据2.2.2消息队列丢数据2.2.3消费者丢数据2.3、RabbitMQ如何保证消息有序2.4、RabbitMQ如何处理消息堆积... 查看详情

rabbitmq如何保证消息可靠性不丢失(代码片段)

...0c;所以我们从这个三个角色开始讨论丢失数据的情况。并如何解决生产者丢失消息在生产数据程序中,消息已经处理好还未发送给MQ这个阶段,生产者因为意外情况中断了。这个时候生产者这条消息就会丢失。因为程序重... 查看详情

rabbitmq如何保证消息可靠性(代码片段)

个人博客请访问 http://www.x0100.top               如何保证消息的可靠性?消息队列如何进行限流?如何设置延时队列进行延时消费?1.📖如何保证消息的可靠性?先来看看我们的万年老图,从图上... 查看详情

互联网面试必杀:如何保证消息中间件全链路数据100%不丢失:第四篇(代码片段)

前情提示上篇文章:《互联网面试必杀:如何保证消息中间件全链路数据100%不丢失:第三篇》,我们分析了RabbitMQ开启手动ack机制保证消费端数据不丢失的时候,prefetch机制对消费者的吞吐量以及内存消耗的影响。通过分析,我... 查看详情

mqkafka——如何保证消息不丢失?如何解决?(代码片段)

一、前言前一篇博客我们介绍了生产者为什么发送消息的吞吐量这么大,其实就是因为,生产者提供了内存缓冲区,把消息打包再发送,从而提高了吞吐量。那么,消息发送过去,到了broker就算是成功了吗... 查看详情

mqkafka——如何保证消息不丢失?如何解决?(代码片段)

一、前言前一篇博客我们介绍了生产者为什么发送消息的吞吐量这么大,其实就是因为,生产者提供了内存缓冲区,把消息打包再发送,从而提高了吞吐量。那么,消息发送过去,到了broker就算是成功了吗... 查看详情

mq相关问题

...MQ优缺点优点缺点各种MQ的适用场景activemqrabbitmqrocketmqkafka如何保证MQ高可用?rabbitmq高可用kafka高可用如何保证消息不被重复消费发送的消息丢失rabbitmq的消息丢失kafka的消息丢失如何保证消息的顺序性?MQ相关问题为什么使用MQ解... 查看详情

分布式消息队列--rabbitmq(代码片段)

...高系统稳定性2.劣势引入MQ提高了系统复杂度,需考虑如何保证消息不被丢失的情况引入MQ降低了系统可用性,需考虑如何保证MQ的高可用常见MQ对比RabbitMQRabbitMQ是一款基于AMQP协议(高级消息 查看详情

如何保证mq消息必达

此文章属于笔记,原属58沈剑一、MQ消息必达,架构上的两个核心设计点:消息落地消息超时、重传、确认四大部件:发送端接收端服务端固化存储组成二、上半场消息必达以及消息重复问题上半场的流程发送端MQ-client将消息发送给... 查看详情

rabbitmq面试问题(代码片段)

1、MQ如何避免消息堆积,使MQ提高消费者的速度?  提高消费者速率(集群)、消费者批量获取消息。2、MQ如何避免消费者重复消费(幂等问题)    基于Redis的setNx命令。    基于数据库表字段... 查看详情

面试官:kafka为什么会丢消息?(代码片段)

1、如何知道有消息丢失?2、哪些环节可能丢消息?3、如何确保消息不丢失?引入MQ消息中间件最直接的目的:系统解耦以及流量控制(削峰填谷)系统解耦:上下游系统之间的通信相互依赖,利用... 查看详情

面试官问:如何保证mq消息是有序的?(代码片段)

为了系统间解耦,我们通常会引入MQ框架,大家各司其职共同完成上下游的业务流程。大致过程:生产端,创建一条消息,通过网络发送到MQServerMQ将消息存储在topic的一个分区里消费端,从分区中拉取消息&... 查看详情

面试rabbitmq面试题(代码片段)

...abbitMQ、RocketMQ有什么优缺点?MQ有哪些常见问题?如何解决这些问题?什么是RabbitMQ?rabbitmq的使用场景RabbitMQ基本概念RabbitMQ的工作模式如何保证RabbitMQ消息的顺序性?消息如何分发?常用的交换器主要分为... 查看详情

面试官再问我如何保证rocketmq不丢失消息,这回我笑了!(代码片段)

最近看了@JavaGuide发布的一篇『面试官问我如何保证Kafka不丢失消息?我哭了!』,这篇文章承接这个主题,来聊聊如何保证RocketMQ不丢失消息。0x00.消息的发送流程一条消息从生产到被消费,将会经历三个阶段:生产阶段,Producer... 查看详情