消息队列-消息队列保证消息可靠性的一些建议

如何检测到消息丢失?

美团消息队列文章中提到了对消息队列的监控手段,我理解消息丢失,根据不同节点来查看监控:

  • 生产者生产丢失:监控中生产者生产量异常
  • 消费者消费丢失:查看消费者消息延迟监控、消费者 offset 偏移

消息队列高手课中提到的检测方法是:消息队列中的有序性。具体来说,生产消息时附带一个递增 id,消费方消费时检查这个 id。这个方法的困难还是很多的,日常工作中感觉不太可用

  • 需要保证消息在 topic 中严格有序(kafka 只能保证在 分区 是有序的)
  • 多个不同的 producer 也需要保证消息的有序性
  • consumer 检测消息的有序性(consumer 和分区一一对应可能相对方便)

kafka 如何保证「消息可靠」

什么是 kafka 认为的「消息可靠」?

kafka 保证对「已提交」的消息进行有限度的可靠性。

  • 已提交:消息已经在 1-n 个 broker 上写到 日志 中
  • 有限度:n 个 broker 不能同时全部挂掉,不然神仙难救。

防止消息丢失的方法

  1. 生产者消息丢失
    1. 场景
      1. kafka 中提供的 api send 方法是异步发送,此时 send 给你的返回值并不代表 mq 真正成功发送。上述的场景,严格来说并不是 kafka 要提供的消息可靠范围内
      2. producer 设置的 acks 数量过少,且 broker 发生异常导致消息消失,这个对应的就是 kafka 消息可靠的有限性。
    2. 使用建议
      1. 使用 send 方法时已经要使用带有回调参数的 producer.send(msg, callback)
      2. 参数
      1. acks = all : 代表当「所有 broker 」接收到消息后,才会给 producer 发送确认
      2. retries 设置较大:代表 producer 的自动重试次数
  2. 存储可靠
    1. 配置多个 broker,减少 broker 异常导致消息丢失的可能性
    2. 具体参数
      1. unclean.leader.election.enable = false 不允许消息不全的 broker 副本竞选 leader
      2. replication.factor >= 3:消息的副本数量
      3. min.insync.replicas > 1:消息至少写入多少副本后才算「已提交」
      4. replication.factor > min.insync.replicas: 如果相等,一个副本挂机,这个分区无法工作,生产者的生产永远不可以成功
  3. 消费者消息丢失
    1. 场景
      1. 消息消费之前进行了确认,这种严格来说也不属于消息可靠的范围
      2. 这种场景的另一种极端,消费者使用多线程进行消息消费,有一个线程失败,这个消息消费就失败了
    2. 使用建议
      1. 消息消费之后再进行 mq 确认 && 程序确认
      2. enalbe.auto.commit = false:不要自动确认,防止「单 concumer 多线程场景下消息消费失败」造成的消息丢失

如何保证消息可靠传输?

总结一下,消息传输中简单说有三个阶段:生产阶段、存储阶段、消费阶段。

生产阶段保证可靠传输

  • 代码中确保可靠传输的方式
    • 使用 mq api 时,注意对响应进行处理(同步发送直接检查响应值,异步使用回调方法)
  • 配置
    • kafka 中对 prodecer ack 数量的配置 && 重试次数等

存储阶段可靠传输,mq 提供的手段是对消息进行持久化

  • 响应配置
    • 副本数量配置
    • 不允许日志不全的落后 broker 竞争 leader

消费阶段和生产阶段相同,需要注意的地方就是确认机制

  • 配置中关闭 自动确认
  • 程序中,代码完成消费逻辑后,发送确认

参考文章

  1. 美团消息队列
  2. kafka 核心技术与实践(极客时间)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/28101.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

新能源汽车高压上电、高压下电逻辑分析

高压上电逻辑 新能源汽车的上电分为高压上电和低压上电,高压上电流程一般理解为高压件通电的过程,具体流程如下: 1、点火开关处于ON档时,仪表盘点亮,低压电接通。 2、VCU、BMS、MCU等控制模块依次被唤醒并开始进行自检…

基于Java自习室在线预约系统 的设计与实现

博主介绍: 大家好,本人精通Java、Python、C#、C、C编程语言,同时也熟练掌握微信小程序、Php和Android等技术,能够为大家提供全方位的技术支持和交流。 我有丰富的成品Java、Python、C#毕设项目经验,能够为学生提供各类…

解决JupyteNotebook打不开问题

问题:打开jupyternotebook出现黑色界面,马上闪退 步骤: 1、winr,cmd进入,conda activate yes 进入yes环境(后面是要下载新的jupyter notebook),我这里下载到了yes环境下 2、下载jupyter Note…

<Rust><iced>基于rust使用iced库构建GUI实例:图片的格式转换程序

前言 本专栏是Rust实例应用。 环境配置 平台:windows 软件:vscode 语言:rust 库:iced、iced_aw 概述 本文是专栏第二篇实例,是一个图像格式转换程序,基于rust图像处理库image以及文件处理库rfd。 UI演示&…

【2024最新华为OD-C/D卷试题汇总】[支持在线评测] URL拼接(100分) - 三语言AC题解(Python/Java/Cpp)

🍭 大家好这里是清隆学长 ,一枚热爱算法的程序员 ✨ 本系列打算持续跟新华为OD-C/D卷的三语言AC题解 💻 ACM银牌🥈| 多次AK大厂笔试 | 编程一对一辅导 👏 感谢大家的订阅➕ 和 喜欢💗 📎在线评测链接 URL拼接(100分) 🌍 评测功能需要订阅专栏后私信联系清隆解…

Python中的数据可视化:绘制三维线框图plot_wireframe()

【小白从小学Python、C、Java】 【考研初试复试毕业设计】 【Python基础AI数据分析】 Python中的数据可视化: 绘制三维线框图 plot_wireframe() [太阳]选择题 在上面的代码中,plot_wireframe() 方法用于绘制什么类型的图形? import matplot…

冷却塔蒸发量及补水量计算

1 冷却塔补水量计算 冷却塔补水蒸发量排污量飘散损失泄漏量。一般冷却塔内水份的蒸发量约为进水量的1~2.5%。 (1)蒸发量 总冷却循环水量的蒸发量E C ① 冷却蒸发量 E E=72Q(X1–X2)=L △t/600 E : 蒸发量…

react有什么特点

React的特点可以归纳为以下几点: 声明式设计:React采用声明式设计,使得创建交互式用户界面变得简单。在React中,可以为应用的每一个状态设计简洁的视图,当数据变化时,React能够高效地更新并渲染相应的组件…

C# OpenCvSharp Mat操作-创建Mat-Range

📸 C#中使用OpenCvSharp库的Range类详解 在C#中使用OpenCvSharp库时,Range类是一个用于定义范围的工具,通常用于选择图像的感兴趣区域(ROI, Region of Interest)。下面是对该类及其使用方法的详细解释和举例说明。&am…

[Algorithm][贪心][K次取反后最大化的数组和][身高排序][优势洗牌][最长回文串]详细讲解

目录 1.K 次取反后最大化的数组和1.题目链接2.算法原理详解3.代码实现 2.身高排序1.题目链接2.算法原理详解3.代码实现 3.优势洗牌1.题目链接2.算法思路详解3.代码实现 4.最长回文串1.题目链接2.代码实现 1.K 次取反后最大化的数组和 1.题目链接 K 次取反后最大化的数组和 2.…

通过shell脚本检查web应用是否正常

#!/bin/bash #功能检查web应用是否正常 #作者:hp.li #日期:202406015 RUN_PATH$(dirname $(readlink -f "$0")) #检查web网站是否可和函数 check_url(){ #方法一:通过%{http_code}"参数获取状态码 #HTTP_CODE$(curl -o /dev/null --connect-timeou…

Golang 并发编程(Goroutine、Channels、Select、Sync、原子操作函数、Context、gpool)

文章目录 GoroutineSync(同步机制)sync.Mutex(互斥锁)sync.RWMutex(读写互斥锁)sync.WaitGroup(等待组)sync.Map(并发安全的映射) sync/atomic(原…

Java课程设计:基于Javaweb的校园订餐系统

文章目录 一、项目介绍二、项目技术栈三、核心代码四、项目展示五、源码获取 一、项目介绍 在当今互联网高速发展的时代,大学校园内的学生生活正在发生着翻天覆地的变化。其中,校园内的餐饮服务无疑是亟需改革和创新的领域之一。 传统的校园食堂模式,往往存在就餐高峰时段拥挤…

DELL服务器插入新磁盘、创建虚拟磁盘、挂载磁盘步骤

文章目录 一、磁盘清理(可选,针对新硬盘是Foreign状态)1、进入VD Mgmt2、清理新硬盘配置 二、创建虚拟磁盘1、进入Device Settings2、创建虚拟磁盘 三、挂载磁盘到系统1、分区磁盘(注意实际磁盘的名称)2、格式化分区3、…

Java web应用性能分析之【prometheus+Grafana监控springboot服务和服务器监控】

Java web应用性能分析之【java进程问题分析概叙】-CSDN博客 Java web应用性能分析之【java进程问题分析工具】-CSDN博客 Java web应用性能分析之【jvisualvm远程连接云服务器】-CSDN博客 Java web应用性能分析之【java进程问题分析定位】-CSDN博客 Java web应用性能分析之【…

【数学代码】幂

Hello!大家好,我是学霸小羊,今天来讲讲幂。 求几个相同因数的积的运算,叫做乘方,乘方的结果叫做幂。 a^n,读作 “ a的n次方 ” 或 “ a的n次方幂”,a叫做底数,n叫做指数。 对于底数、指数和幂…

Stm32超声波测距实验

一.任务需求 1. 采用stm32F103和HC-SR04超声波模块, 使用标准库或HAL库 定时器中断,完成1或2路的超声波障碍物测距功能。 2. 当前智能汽车上一般配置有12路超声波雷达,这些专用超声波雷达内置了MCU,直接输出数字化的测距结果&am…

鸿蒙ArkTs 下载监听完成、进度 DownloadUtils工具类

import request from ohos.request; import fs from ohos.file.fs; import { BusinessError } from kit.BasicServicesKit; import { common, Want } from kit.AbilityKit;export class DownloadUtils{/*** 下载文件* param mContext* param url* param destFileDir* param fi…

【QT Creator软件】解决中文乱码问题

QT Creator软件解决中文乱码问题 问题描述:Qtcreator安装好后打印中文在控制台输出乱码 在网上也查找了修改编辑器的默认编码为UTF-8,但是仍然没有任何作用,于是有了以下的解决方案 原因剖析:因为项目的编码与控制台的编码不一致…

LINUX中使用DT_MACHINE_START/MACHINE_START宏

LINUX中使用DT_MACHINE_START/MACHINE_START宏 DT_MACHINE_START宏 LINUX中用DT_MACHINE_START/MACHINE_START定义的MACH,并给出定义的各个成员函数在初始化过程中被调用的时机 比如,kernel/arch/arm/mach-vexpress/v2m.c: // SPDX-License-Identifier: GPL-2.0 #include…