消息从生产到消费的过程,可以划分为三个阶段:

生产阶段:在这个阶段,从消息在Producer创建出来,经过网络传输发送到Broker端。

存储阶段:在这个阶段,消息在Broker端存储,如果是集群,消息会在这个阶段被复制到其他副本上。

消费阶段:在这个阶段,Consumer从Broker上拉取消息,经过网络传输发送到Consumer上。

1. 生产阶段

在生产阶段,消息队列通过最常用的请求确认机制,来保证消息的可靠传递:当你的代码调用发 消息方法时,消息队列的客户端会把消息发送到Broker,Broker收到消息后,会给客户端返回一 个确认响应,表明消息已经收到了。客户端收到响应后,完成了一次正常消息的发送。

只要Producer收到了Broker的确认响应,就可以保证消息在生产阶段不会丢失。有些消息队列在 长时间没收到发送确认响应后,会自动重试,如果重试再失败,就会以返回值或者异常的方式告 知用户。

2. 存储阶段

在存储阶段正常情况下,只要Broker在正常运行,就不会出现丢失消息的问题,但是如果Broker出现了故障,比如进程死掉了或者服务器宕机了,还是会丢失消息的。

如果对消息的可靠性要求非常高,可以通过配置Broker参数来避免因为宕机丢失消息。

对于单个节点的Broker,需要配置Broker参数,在收到消息后,将消息写入磁盘后再给Producer 返回确认响应,这样即使发生宕机,由于消息已经被写入磁盘,就不会丢失消息,恢复后还可以 继续消费。例如,在RocketMQ中,需要将刷盘方式flushDiskType配置为SYNC_FLUSH同步刷 盘。

如果是Broker是由多个节点组成的集群,需要将Broker集群配置成:至少将消息发送到2个以上 的节点,再给客户端回复发送确认响应。这样当某个Broker宕机时,其他的Broker可以替代宕机 的Broker,也不会发生消息丢失。

3. 消费阶段

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

在编写消费代码时需要注意的是,不要在收到消息后就立即发送消费确认,而是应该在执行完所有消费业务逻辑之后,再发送消费确认

如何确保消息不会丢失相关推荐

  1. 使用MQ的时候,怎么确保消息100%不丢失?

    面试官在面试候选人时,如果发现候选人的简历中写了在项目中使用了 MQ 技术(如 Kafka.RabbitMQ.RocketMQ),基本都会抛出一个问题:在使用 MQ 的时候,怎么确保消息 100% 不 ...

  2. RabbitMq如何确保消息不丢失

    上篇写了掌握Rabbitmq几个重要概念,从一条消息说起,这篇来总结关于消息丢失让人头痛的事情.网络故障.服务器重启.硬盘损坏等都会导致消息的丢失.消息从生产到消费主要结果以下几个阶段如下图. ①生产 ...

  3. RabbitMQ 如何确保消息的成功投递?幂等性?顺序性?

    RabbitMQ 如何确保消息的成功投递?RabbitMQ 如何保证不重复消费,保证数据不丢失?分布式系统里,如何保证数据的一致性?一串连环炮你是否顶得住? 其实这几个问题的原理大同小异,都可以在统一 ...

  4. mq日志怎么看_RocketMQ的消息是怎么丢失的

    前言 通过之前文章的阅读,有关RocketMQ的底层原理相信小伙伴们已经有了一个比较清晰的认识. 那么接下来王子想跟大家讨论一个话题,如果我们的项目中引入了MQ,势必要面对的一个问题,就是消息丢失问题 ...

  5. RabbitMQ消息100%不丢失?

    消息消费流程: 1.生产端发送消息到RabbitMQ; 2.RabbitMQ发送消息到消费端: 3.消费端消费消息: 以上3个步骤每个步骤都可能导致消息丢失,消息丢失并不可怕,可怕的是丢失了我们还不知 ...

  6. RabbitMQ(mq) 如何处理高并发、负载均衡、消息幂等性、丢失、消息顺序错乱问题?

    目录 介绍: 1.连接器(connection): 2.信道.通道(channel): 3.交换机(exchange): 4.队列(queue): 以下通过两个例子,让我们先来对rabbitmq 有个 ...

  7. RocketMQ 消息队列中丢失消息的场景举例及解决办法

    既然使用在项目中使用了MQ,那么就不可避免的需要考虑消息丢失问题.在一些涉及到了金钱交易的场景下,消息丢失还是很致命的.那么在RocketMQ中存在哪几种消息丢失的场景呢? 先来一张最简单的消费流程图 ...

  8. kafka数据不丢失不重复_如何配置 KAFKA 使其消息不会丢失

    不可靠的KAFKA 这里的不可靠是指代KAFKA其设计之初就为高性能而设计,其是允许消息丢失的,但经过多个版本的升级之后,通过KAFKA的相关配置,我们可以将其作为可靠的队列(不丢消息的队列). 在本 ...

  9. RabbitMQ 高可用之如何确保消息成功消费

    https://blog.csdn.net/weixin_60227714/article/details/120905262

最新文章

  1. vue项目结构php写哪里,Vue-cli搭建项目后目录结构的分析(图文)
  2. Appium自动化测试-配置待测Android应用
  3. 分布式数据库基础:分布式事务相关概念介绍
  4. hello world_建立无服务器的“ Hello World”功能
  5. 直播 | 循序渐进 - DM8 数据存储管理
  6. 如何使用CORS解决跨域问题
  7. k8s架构以及相关概念普及
  8. linux 在字符界面中如何查看超出屏幕显示范围的内容
  9. 【译】30 分钟入门 Typescript
  10. 深入浅出Linux操作系统虚拟机环境下载安装(一)
  11. VMware Tools 支持 Windows 2000、Windows XP 和 Windows Server 2003 (81466)
  12. 设计图纸管理系统办公系统实现无纸化
  13. 项管:配置管理、变更管理、文档管理、知识管理及其他
  14. 腾讯测试发型的那个软件,全栈发型设计软件
  15. 2020年计算机学什么语言,最受企业认可的十大编程语言,2020年学习不后悔
  16. 微信小程序 错误代码 列表
  17. 【C语言】深度剖析数据在内存中的存储
  18. Java 算法题目 走楼梯
  19. 南京工业大学计算机学院考研真题,南京工业大学考研真题汇总
  20. web.xml放在哪个目录下_美术资源标准(文件夹目录篇)

热门文章

  1. 我是如何打造出自己私有云存储的
  2. 发现了更好的 MSIL编辑器,看来我的MSIL STUDIO来晚了~~
  3. dev c++如何恢复默认设置_C编程从入门到实践:C语言开发工具详解(2)
  4. 个人述职岗位竞聘报告PPT模板
  5. scratch项目/mblock项目:打地鼠(事件类之消息广播、控制类之克隆体、数据类之新建模块指令综合应用)
  6. 基于tensorflow2.0+CNN实现手势识别(全)
  7. Java按字节数截取字符串
  8. 自动排课系统的设计与实现 开题报告 java_学校排课系统设计与实现(附源程序)...
  9. cisco虚拟服务器,Cisco路由器端口映射(虚拟服务器)
  10. 广东建设年鉴2018(2017年数据)