当前位置: 首页 > news >正文

怎么做才能不丢消息?

现在主流的消息队列产品都提供了非常完善的消息可靠性保证机制,可以做到在消息传递的过程中,即使发生网络中断或者硬件故障,也能确保消息的可靠传递、不丢消息。

绝大部分丢消息的原因都是由于开发者不熟悉消息队列,没有正确使用和配置消息队列导致的。

检测消息丢失的方法

用消息队列最尴尬的情况不是丢消息,而是丢了消息还不知道。因此,我们需要设计一套机制来监控消息是否有丢失。

根据项目的成熟程度,一般有两种方式来检测:

  1. 如果项目基础设施比较完善,那么可以使用分布式链路追踪系统来追踪每一条消息。
  2. 如果项目初期,系统刚上线,那么可以利用消息队列的有序性来检测是否有消息丢失。

我们可以在Producer端发出的每一条消息附加一个连续递增的序号,然后在Consumer端检测这个序号的连续性。如果没有消息丢失,Consumer收到的消息的序号必然是连续递增的,如果检测到序号不连续,那么就是丢消息了,还可以通过缺失的序号来确定丢失的是哪一条消息。

针对这种检测方法,有3条建议:

  1. 像Kafka和RocketMQ这样的消息队列,它不保证消息在Topic上的严格顺序,只能保证消息在分区(队列)上是有序的,所以我们在发消息的时候必须要指定分区,并且每个分区单独检测消息序号的连续性。
  2. 如果系统中有多个Producer实例,并且不好协调多个Producer之间的发送顺序,那么也需要针对每个Producer分别生成各自的消息序号,并且需要附加上Producer标识,在Consumer端按照每个Producer分别来检测序号的连续性。
  3. Consumer实例的数量最好和分区数量一致,做到Consumer和分区一一对应,这样比较方便在Consumer内检测消息序号的连续性。

消息可靠传递

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

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

消息生产阶段

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

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

消息存储阶段

在存储阶段正常情况下,只要Broker在正常运行,就不会出现丢失消息的问题,但是如果Broker出现了故障,还是有可能会丢消息。

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

如果Broker是由多个节点组成的集群,那么需要将Broker集群配置成:至少将消息发送到2个以上的节点后,再给客户端回复发送确认响应。

消息消费阶段

消费阶段采用和生产阶段类似的请求-确认机制来保证消息的可靠传递,客户端从Broker拉取消息后,执行用户的消费业务逻辑,成功后,才会给Broker发送消费确认响应。

如果Borker没有收到消费确认响应,下次拉消息时还会返回同一条消息,确保消息不回在网络传输过程中丢失,也不会因为客户端在执行消费逻辑中出错导致丢失。

我们需要注意,不要在收到消息后就立即发送消费确认,而是应该在执行完所有消费业务逻辑之后,再发送消费确认。

相关文章:

怎么做才能不丢消息?

现在主流的消息队列产品都提供了非常完善的消息可靠性保证机制,可以做到在消息传递的过程中,即使发生网络中断或者硬件故障,也能确保消息的可靠传递、不丢消息。 绝大部分丢消息的原因都是由于开发者不熟悉消息队列,没有正确使用…...

前端基础(十六)_数组对象

数组对象 1、创建数组 // 字面量创建const arr [1, 2, 3, 4, 5, 6]// 构造函数创建const arr2 new Array(1, 2, 3, 4, 5, 6)const arr3 Array(1, 2, 3, 4, 5, 6)2.push (从数组末尾添加元素) a.数组.push(要添加进数组的数组项) b.作用:将要添加的数组项 添加到…...

数据结构-带头双向循环链表

前言: 链表有很多种,上一章结,我复盘了单链表,这一章节,主要针对双链表的知识点进行,整理复盘,如果将链表分类的话,有很多种,我就学习的方向考察的重点,主要…...

3 问 6 步,极狐GitLab 帮助企业构建高效、安全、合规的 DevSecOps 文化

本文来源:about.gitlab.com 作者:Vanessa Wegner 译者:极狐(GitLab) 市场部内容团队 🔒 安全为何重要?此前,我们分享了: 1. 2023年DevOps发展趋势👉重磅!GitLab 提出五大…...

SPA(单页应用)知多少

单页面应用程序将所有的活动局限于一个Web页面中,在该Web页面初始化时加载相应的HTML、JavaScript 和 CSS。一旦页面加载完成,单页面应用不会因为用户的操作而进行页面的重新加载或跳转。取而代之的是利用 JavaScript 动态的变换HTML的内容,从…...

Selenium实战【远程控制】【JAVA爬虫】

简介 Selenium RemoteWebDriver是Selenium WebDriver的一个扩展,它可以将测试运行在远程机器上的浏览器中。 使用RemoteWebDriver,可以在本地机器上编写测试脚本,然后将测试请求发送到远程机器上的浏览器中执行。这使得测试可以在多个不同的机器上并行运行,从而加快测试的…...

图片动画化应用中的动作分解方法

作者 | FesianXu 前言 最近基于AI的换脸应用非常的火爆,同时也引起了新一轮的网络伦理大讨论。如果光从技术的角度看,对于视频中的人体动作信息,通常可以通过泰勒展开分解成零阶运动信息与一阶运动信息,如文献[1,2]中提到的&…...

我又和redis超时杠上了

背景 经过上次redis超时排查,并联系云服务商解决之后,redis超时的现象好了一阵子,但是最近又有超时现象报出,但与上次不同的是,这次超时的现象发生在业务高峰期,在简单看过服务器的各项指标以后&#xff0…...

一文带你吃透MySQL数据库!

文章目录1. 索引2. 事务3. 存储引擎4. 锁机制5. MySQL其他知识点文章字数大约1.27万字,阅读大概需要42分钟,建议收藏后慢慢阅读!!!1. 索引 为什么使用索引 通过创建唯一性索引,可以保证数据库表中每一行数据…...

[学习笔记] 2. 数据结构

数据结构视频地址:https://www.bilibili.com/video/BV1uA411N7c5 数据结构是指相互之间存在着一种或多种关系的数据元素的集合和该集合中数据元素之间的关系组成。简单来说,数据结构就是设计数据以何种方式组织并存储在计算机中。 比如:列表、集合与字…...

[学习笔记] 3. 算法进阶

算法进阶视频地址:https://www.bilibili.com/video/BV1uA411N7c5 1. 贪心算法 贪心算法(又称贪婪算法),是指在对问题求解时,总是做出在当前看来是最好的选择。也就是说,不从整体最优上加以考虑 —— 所做…...

做自媒体真的能赚到钱吗?真的能赚到几十万吗?

自媒体在当今社会已经成为一个热门话题,越来越多的人开始尝试做自媒体,希望能够通过自媒体赚到钱。但是,做自媒体真的能赚到钱吗?能赚到几十万吗?下面我们来一一解答。 首先,做自媒体确实可以赚到钱。随着互…...

QT使用QListWidget显示多张图片

Qt系列文章目录 文章目录Qt系列文章目录前言一、QListWidget 和 QListView 的差异二、显示效果1.操作工作区界面1.主界面头文件2. 主界面实现界面2.左边图片目录展示界面1.图片目录头文件2.图片目录实现文件2.属性窗口区1.属性窗口头文件2.属性窗口实现文件3 源码下载前言 QLi…...

python 打印进度条

import time recv_size0 total_size1024while recv_size < total_size:time.sleep(0.1)recv_size1024#打印进度条percentrecv_size / total_sizeres int(50 * percent) * #print(\r[%-50s] %d%% % (res,int(100 * percent)),end) # end 打印以‘’结尾&#xff0c;打印% 需…...

【微小说】大学日记

感谢B站up主“看见晴晴了吗”的视频提供的灵感&#xff0c;链接&#xff1a;https://www.bilibili.com/video/BV1tA411m7Kc 整篇故事完全虚构&#xff0c;如有雷同纯属巧合。 2019年8月25日 星期天 晴 今天是我进入大学的第一天。早晨&#xff0c;我画了美美的妆&#xff0c;穿…...

ArrayList扩容机制解析

1.ArrayList的成员变量 首先我们先了解一下ArrayList的成员变量。 // 默认初始化大小 private static final int DEFAULT_CAPACITY 10;// 空数组&#xff08;用于空实例&#xff09; // 比如List<String> ls new ArrayList<>(0); private static final Object[…...

jsp-----web应用与开发

jsp基本语法 jsp页面的基本结构 定义变量 <%! %> 表达式&#xff1a;变量、常量、表达式 <% %>代码块、程序段【jsp程序代码即jsp脚本】 <% %>注释 隐藏注释 不会显示在客户的浏览器上&#xff0c;即jsp页面运行后页面上看不到注释内容。同时也不会出…...

洛谷 P1201 [USACO1.1]贪婪的送礼者Greedy Gift Givers

题目链接&#xff1a;P1201 [USACO1.1]贪婪的送礼者Greedy Gift Givers - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 题目描述 对于一群 n 个要互送礼物的朋友&#xff0c;GY 要确定每个人送出的钱比收到的多多少。在这一个问题中&#xff0c;每个人都准备了一些钱来送礼物…...

php设计模式-组合模式的运用

介绍 PHP的组合模式是一种设计模式&#xff0c;用于将对象组合成树形结构以表示“部分-整体”的层次结构。该模式允许客户端统一处理单个对象和组合对象&#xff0c;使得客户端在处理对象时不需要知道对象是否为单个对象还是组合对象。 在组合模式中&#xff0c;有两种类型的…...

一文教会你如何简单使用Fegin进行远程服务调用

文章目录1、fegin的基本介绍2、fegin的基本使用步骤3、项目中的实际运用4、测试前言在分布式微服务中&#xff0c;少不了会进行不同服务之间的相互调用&#xff0c;比如A服务要调用B服务中的接口&#xff0c;如何简单方便的实现呢&#xff1f;fegin可以来帮助。 1、fegin的基本…...

OceanBase学习

OceanBase&#xff08;OB&#xff09;是蚂蚁集团完全自研的原生分布式关系型数据库&#xff0c;2010年诞生&#xff0c;支撑支付宝/双11核心交易&#xff0c;金融级高可用&#xff0c;同时兼容 MySQL 与 Oracle 两种模式&#xff0c;是国产分布式数据库的标杆。一、核心定位&am…...

一键永久保存QQ空间说说:GetQzonehistory帮你守护青春记忆

一键永久保存QQ空间说说&#xff1a;GetQzonehistory帮你守护青春记忆 【免费下载链接】GetQzonehistory 获取QQ空间发布的历史说说 项目地址: https://gitcode.com/GitHub_Trending/ge/GetQzonehistory 你是否曾经担心QQ空间里的那些珍贵说说会随着时间流逝而消失&…...

MT4 EA避坑指南:从Nerve Knife策略看如何设计‘永不爆仓’的风控模块

MT4 EA风控设计实战&#xff1a;从策略逻辑到代码落地的避坑指南 在量化交易领域&#xff0c;风控模块的设计质量往往决定一个EA的生死存亡。许多看似完美的策略在实盘中折戟沉沙&#xff0c;90%的问题都出在风险控制的薄弱环节。本文将从一个专业开发者的视角&#xff0c;解剖…...

ncmdump终极指南:快速免费解密网易云NCM格式音乐

ncmdump终极指南&#xff1a;快速免费解密网易云NCM格式音乐 【免费下载链接】ncmdump 项目地址: https://gitcode.com/gh_mirrors/ncmd/ncmdump 你是否曾经遇到过从网易云音乐下载的歌曲只能在官方客户端播放&#xff0c;无法在其他设备或播放器使用的困扰&#xff1f…...

React Context 状态管理方案对比

React Context 状态管理方案对比 在React应用开发中&#xff0c;状态管理一直是开发者关注的核心问题之一。随着应用规模的扩大&#xff0c;如何高效、灵活地管理状态成为关键挑战。React Context作为官方提供的状态管理方案&#xff0c;因其轻量级和易用性受到广泛关注。与其…...

Qwen3.5-2B开源大模型:支持离线运行的轻量级多模态AI部署方案

Qwen3.5-2B开源大模型&#xff1a;支持离线运行的轻量级多模态AI部署方案 1. 项目概述 Qwen3.5-2B是一款仅20亿参数的轻量级多模态大语言模型&#xff0c;专为本地离线运行优化设计。相比动辄数百亿参数的大模型&#xff0c;这款模型在保持出色性能的同时&#xff0c;显著降低…...

从实验室到产线:VSCode调试配置如何通过UL 61000-6-4电磁兼容EMC预测试?3步完成信号完整性验证与JTAG噪声抑制

更多请点击&#xff1a; https://intelliparadigm.com 第一章&#xff1a;从实验室到产线&#xff1a;VSCode调试配置如何通过UL 61000-6-4电磁兼容EMC预测试&#xff1f;3步完成信号完整性验证与JTAG噪声抑制 在嵌入式系统量产前&#xff0c;EMC预测试是绕不开的关键门槛。UL…...

PyAutoGUI实战:从零构建GUI自动化脚本

1. PyAutoGUI入门&#xff1a;解放双手的GUI自动化神器 每天重复点击几十次相同的按钮&#xff0c;填写上百份格式雷同的表单&#xff0c;这种机械操作是否让你抓狂&#xff1f;PyAutoGUI就是为解决这类问题而生的Python神器。这个轻量级库能模拟人类的鼠标键盘操作&#xff0c…...

保姆级教程:在Ubuntu系统的AIxBoard上,用CODESYS V3.5 SP17配置软PLC,并打通Python(OpenVINO/YOLOv5)的共享内存通信

边缘智能控制实战&#xff1a;基于AIxBoard与CODESYS的软PLC-Python协同开发指南 当工业控制遇上人工智能&#xff0c;传统PLC的封闭性与现代AI算法的开放性如何实现无缝对接&#xff1f;本文将手把手带您完成从零搭建一个支持机器视觉的智能控制系统。不同于简单的理论概述&am…...

别再死记硬背了!用一张图帮你彻底搞懂防火墙的三种工作模式(分组过滤/应用代理/状态检测)

一图胜千言&#xff1a;用视觉化思维拆解防火墙三大核心模式 每次看到网络安全教材里那些关于防火墙的抽象描述&#xff0c;你是不是也感到头大&#xff1f;"分组过滤工作在第三层"、"应用代理基于第七层"、"状态检测结合会话状态"...这些概念单…...