如何确保消息不会丢失
消息从生产到消费的过程,可以划分为三个阶段:
生产阶段:在这个阶段,从消息在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没有收到消费 确认响应,下次拉消息的时候还会返回同一条消息,确保消息不会在网络传输过程中丢失,也不 会因为客户端在执行消费逻辑中出错导致丢失。
在编写消费代码时需要注意的是,不要在收到消息后就立即发送消费确认,而是应该在执行完所有消费业务逻辑之后,再发送消费确认。
如何确保消息不会丢失相关推荐
- 使用MQ的时候,怎么确保消息100%不丢失?
面试官在面试候选人时,如果发现候选人的简历中写了在项目中使用了 MQ 技术(如 Kafka.RabbitMQ.RocketMQ),基本都会抛出一个问题:在使用 MQ 的时候,怎么确保消息 100% 不 ...
- RabbitMq如何确保消息不丢失
上篇写了掌握Rabbitmq几个重要概念,从一条消息说起,这篇来总结关于消息丢失让人头痛的事情.网络故障.服务器重启.硬盘损坏等都会导致消息的丢失.消息从生产到消费主要结果以下几个阶段如下图. ①生产 ...
- RabbitMQ 如何确保消息的成功投递?幂等性?顺序性?
RabbitMQ 如何确保消息的成功投递?RabbitMQ 如何保证不重复消费,保证数据不丢失?分布式系统里,如何保证数据的一致性?一串连环炮你是否顶得住? 其实这几个问题的原理大同小异,都可以在统一 ...
- mq日志怎么看_RocketMQ的消息是怎么丢失的
前言 通过之前文章的阅读,有关RocketMQ的底层原理相信小伙伴们已经有了一个比较清晰的认识. 那么接下来王子想跟大家讨论一个话题,如果我们的项目中引入了MQ,势必要面对的一个问题,就是消息丢失问题 ...
- RabbitMQ消息100%不丢失?
消息消费流程: 1.生产端发送消息到RabbitMQ; 2.RabbitMQ发送消息到消费端: 3.消费端消费消息: 以上3个步骤每个步骤都可能导致消息丢失,消息丢失并不可怕,可怕的是丢失了我们还不知 ...
- RabbitMQ(mq) 如何处理高并发、负载均衡、消息幂等性、丢失、消息顺序错乱问题?
目录 介绍: 1.连接器(connection): 2.信道.通道(channel): 3.交换机(exchange): 4.队列(queue): 以下通过两个例子,让我们先来对rabbitmq 有个 ...
- RocketMQ 消息队列中丢失消息的场景举例及解决办法
既然使用在项目中使用了MQ,那么就不可避免的需要考虑消息丢失问题.在一些涉及到了金钱交易的场景下,消息丢失还是很致命的.那么在RocketMQ中存在哪几种消息丢失的场景呢? 先来一张最简单的消费流程图 ...
- kafka数据不丢失不重复_如何配置 KAFKA 使其消息不会丢失
不可靠的KAFKA 这里的不可靠是指代KAFKA其设计之初就为高性能而设计,其是允许消息丢失的,但经过多个版本的升级之后,通过KAFKA的相关配置,我们可以将其作为可靠的队列(不丢消息的队列). 在本 ...
- RabbitMQ 高可用之如何确保消息成功消费
https://blog.csdn.net/weixin_60227714/article/details/120905262
最新文章
- vue项目结构php写哪里,Vue-cli搭建项目后目录结构的分析(图文)
- Appium自动化测试-配置待测Android应用
- 分布式数据库基础:分布式事务相关概念介绍
- hello world_建立无服务器的“ Hello World”功能
- 直播 | 循序渐进 - DM8 数据存储管理
- 如何使用CORS解决跨域问题
- k8s架构以及相关概念普及
- linux 在字符界面中如何查看超出屏幕显示范围的内容
- 【译】30 分钟入门 Typescript
- 深入浅出Linux操作系统虚拟机环境下载安装(一)
- VMware Tools 支持 Windows 2000、Windows XP 和 Windows Server 2003 (81466)
- 设计图纸管理系统办公系统实现无纸化
- 项管:配置管理、变更管理、文档管理、知识管理及其他
- 腾讯测试发型的那个软件,全栈发型设计软件
- 2020年计算机学什么语言,最受企业认可的十大编程语言,2020年学习不后悔
- 微信小程序 错误代码 列表
- 【C语言】深度剖析数据在内存中的存储
- Java 算法题目 走楼梯
- 南京工业大学计算机学院考研真题,南京工业大学考研真题汇总
- web.xml放在哪个目录下_美术资源标准(文件夹目录篇)
热门文章
- 我是如何打造出自己私有云存储的
- 发现了更好的 MSIL编辑器,看来我的MSIL STUDIO来晚了~~
- dev c++如何恢复默认设置_C编程从入门到实践:C语言开发工具详解(2)
- 个人述职岗位竞聘报告PPT模板
- scratch项目/mblock项目:打地鼠(事件类之消息广播、控制类之克隆体、数据类之新建模块指令综合应用)
- 基于tensorflow2.0+CNN实现手势识别(全)
- Java按字节数截取字符串
- 自动排课系统的设计与实现 开题报告 java_学校排课系统设计与实现(附源程序)...
- cisco虚拟服务器,Cisco路由器端口映射(虚拟服务器)
- 广东建设年鉴2018(2017年数据)