如何保证消息的可用性/可靠性/不丢失呢 ?

消息可能在哪些阶段丢失呢?可能会在这三个阶段发生丢失:生产阶段、存储阶段、消费阶段

生产阶段

在生产阶段,主要通过请求确认机制,来保证消息的可靠传递

1、同步发送的时候,要注意处理响应结果和异常。如果返回响应OK,表示消息成功发送到了Broker,如果响应失败,或者发生其它异常,都应该重试

2、异步发送的时候,应该在回调方法里检查,如果发送失败或者异常,都应该进行重试,并可以设置重试次数

3、如果发生超时的情况,也可以通过查询日志的API,来检查是否在Broker存储成功

存储阶段

存储阶段,可以通过配置可靠性优先的 Broker 参数来避免因为宕机丢消息,简单说就是可靠性优先的场景都应该使用同步

1、消息只要持久化到 CommitLog(日志文件)中,即使Broker宕机,未消费的消息也能重新恢复再消费。

2、Broker的刷盘机制:同步刷盘和异步刷盘,不管哪种刷盘都可以保证消息一定存储在pagecache中(内存中),但是同步刷盘更可靠,它是Producer发送消息后等数据持久化到磁盘之后再返回响应给Producer

同步刷盘

只有在消息真正持久化至磁盘后RocketMQ的Broker端才会真正返回给Producer端一个成功的ACK响应。同步刷盘对MQ消息可靠性来说是一种不错的保障,但是性能上会有较大影响,一般适用于金融业务应用该模式较多

异步刷盘(默认)

能够充分利用OS的PageCache的优势,只要消息写入PageCache即可将成功的ACK返回给Producer端。消息刷盘采用后台异步线程提交的方式进行,降低了读写延迟,提高了MQ的性能和吞吐量

3、Broker通过主从模式来保证高可用,Broker支持 Master 和 Slave同步复制、Master 和 Slave异步复制模式,生产者的消息都是发送给Master,但是消费既可以从Master消费,也可以从Slave消费。

同步复制模式可以保证即使Master宕机,消息肯定在Slave中有备份,保证了消息不会丢失。

Broker支持Master 和 Slave 复制,如果一个 Broker 组有 Master 和 Slave,消息需要从 Master 复制到 Slave 上,有同步和异步两种复制方式:

a、同步复制方式:Master 和 Slave 均写成功后才反馈给客户端写成功状态。在同步复制方式下,如果 Master 出故障, Slave 上有全部的备份数据,容易恢复,但是同步复制会增大数据写入延迟,降低系统吞吐量

b、异步复制方式:只要 Master 写成功,即可反馈给客户端写成功状态,系统拥有较低的延迟和较高的吞吐量,但是如果 Master 出了故障,有些数据因为没有被写入 Slave,有可能会丢失

消费阶段

a、手动提交消息应答

使用手动提交可以确保消息被正确处理后再提交应答

b、幂等性消费

在消费端实现幂等性处理,确保重复消费不会导致业务问题

总结

RocketMQ通过以下方式保证消息不丢失:

1、生产端:同步发送、异步发送 + 重试、事务消息

2、Broker端:同步刷盘、搭建Broker集群实现主从复制

3、消费端:手动提交应答、消息重试、幂等性消费

Rocketmq 如何保证消息的可用性/可靠性/不丢失呢 ?的更多相关文章

  1. RocketMQ 如何保证消息不丢失,重复消费

    RocketMQ 如何保证消息不丢失 Producer 提供SYNC的发送消息方式,等待broker处理结果. 发送消息如果失败或者超时,则重新发送. // 同步发送消息,如果5秒内没有发送成功,则重 ...

  2. 转:TCP为什么要3次握手和4次挥手时等待2MSL、 TCP如何保证消息顺序以及可靠性到达

    关于tcp三次握手.四次挥手可以看这里:TCP与UDP的差别以及TCP三次握手.四次挥手 1.TCP为甚要3次握手? 在谢希仁著<计算机网络>第四版中讲“三次握手”的目的是“为了防止已失效 ...

  3. RabbitMQ使用教程(四)如何通过持久化保证消息99.99%不丢失?

    1. 前情回顾 RabbitMQ使用教程(一)RabbitMQ环境安装配置及Hello World示例 RabbitMQ使用教程(二)RabbitMQ用户管理,角色管理及权限设置 RabbitMQ使用 ...

  4. rabbitmq如何保证消息可靠性不丢失

    目录 生产者丢失消息 代码模拟 事务 confirm模式确实 数据退回监听 MQ事务相关软文推荐 MQ丢失信息 消费者丢失信息 之前我们简单介绍了rabbitmq的功能.他的作用就是方便我们的消息解耦 ...

  5. Kafka如何保证消息不丢失不重复

    首先需要思考下边几个问题: 消息丢失是什么造成的,从生产端和消费端两个角度来考虑 消息重复是什么造成的,从生产端和消费端两个角度来考虑 如何保证消息有序 如果保证消息不重不漏,损失的是什么 大概总结下 ...

  6. RabbitMQ 如何保证消息不丢失?

    RabbitMQ一般情况很少丢失,但是不能排除意外,为了保证我们自己系统高可用,我们必须作出更好完善措施,保证系统的稳定性. 下面来介绍下,如何保证消息的绝对不丢失的问题,下面分享的绝对干货,都是在知 ...

  7. Pulsar の 保证消息的顺序性、幂等性和可靠性

    原文链接:Pulsar の 保证消息的顺序性.幂等性和可靠性 一.背景 前面两篇文章,已经介绍了关于Pulsar消费者的详细使用和自研的Pulsar组件. 接下来,将简单分析如何保证消息的顺序性.幂等 ...

  8. RabbitMq(6) 如何保证消息不丢包

    RabbitMQ一般情况很少丢失,但是不能排除意外,为了保证我们自己系统高可用,我们必须作出更好完善措施,保证系统的稳定性. 下面来介绍下,如何保证消息的绝对不丢失的问题,下面分享的绝对干货,都是在知 ...

  9. RabbitMQ使用教程(三)如何保证消息99.99%被发送成功?

    1. 前情回顾 RabbitMQ使用教程(一)RabbitMQ环境安装配置及Hello World示例 RabbitMQ使用教程(二)RabbitMQ用户管理,角色管理及权限设置 在以上两篇博客发布后 ...

  10. RabbitMQ消息丢失问题和保证消息可靠性-消费端不丢消息和HA(二)

    继续上篇文章解决RabbitMQ消息丢失问题和保证消息可靠性(一) 未完成部分,我们聊聊MQ Server端的高可用和消费端如何保证消息不丢的问题? 回归上篇的内容,我们知道消息从生产端到服务端,为了 ...

随机推荐

  1. DICOM-SCP,可以直接使用的SCP(.net framework 4.5)控制台接收端

    此程序引用的是Dicom.Core 4.0.8.0,也是最后一版支持部署在.net framework 4.5 或以下环境的.如需要部署在.net4.6.1以上的需要查看另一个文档. 1 using ...

  2. linux下自建NAS教程

    NAS,英文全名Network Attached Storage,翻译过来是:网络附接存储. 引用维基百科定义 网络附接存储(英语:Network Attached Storage,缩写:NAS)[1 ...

  3. npm run的时候报错: this[kHandle] = new _Hash(algorithm, xofLen);

    在前面加入以下配置信息 set NODE_OPTIONS=--openssl-legacy-provider && 后面跟原来的启动配置信息 另外一种方式,可以避免修改package. ...

  4. redis 过期监听配置

    package org.jeecg.config; import java.lang.reflect.Method; import java.time.Duration; import java.ut ...

  5. Layer子域名挖掘机

    Layer子域名挖掘机 Layer子域名挖掘机是一款功能强大的域名查询工具,主要用于提供网站子域名的查询服务. 域名与子域名 域名 域名,又称网域,是互联网上用于标识特定计算机或计算机组的一串由点分隔 ...

  6. 调研报告-基于 Iceberg 构建湖仓一体平台调研

    一.背景 我们使用 Iceberg 构建湖仓一体平台的初衷是希望解决业务方在使用 Hive 数仓时的一些痛点.主要包括以下几大方面: (1)现有的数据同步只支持全量同步,同步大表速度慢. (2)Hiv ...

  7. Vue3 基础概念与环境搭建

    前言 首先需要提醒大家的是,Vue2 已经在2023年停止维护,为了能更好地适应前端开发的发展趋势以及获得更好的性能和功能,我们将从这篇文章开始进入Vue3的阶段.如果对Vue2有想了解的小伙伴可以自 ...

  8. docker - [01] docker入门

    弱小和无知不是生存的障碍,傲慢才是. -- <三体> 一.相关链接 Docker官网:https://www.docker.com/ 文档地址:https://docs.docker.co ...

  9. Kubernetes - [01] 概述

    容器编排工具 一.什么是Kubernetes   K8s,即Kubernetes,是一个开源的容器管理和自动化部署平台,设计用于简化容器化应用程序的部署.扩展和管理过程.它是Google在2014年基 ...

  10. Flink - [02] 安装部署(Standalone)

    一.准备 1.角色规划 Flink Standalone 角色规划 节点名称 node01 node02 node03 master ○     worker   ○ ○ zookeeper ○ ○ ...