【架构设计】-- ACK 机制

1、ACK 机制的定义

        ACK(全称:acknowledgement) 机制是一种确认机制,起源于TCP报文到达确认(ACK)机制(参考:TCP报文到达确认(ACK)机制_tcp接收方在收到一个报文段后,如何回复ack报文?-CSDN博客)。用于确认接收方是否已经正确接收了发送方发送的数据。这种机制的好处是可以保证数据的可靠传输,防止数据的丢失或重复传输。如果没有ACK机制,就无法确保数据的正确性,可能会导致数据传输的失败或者错误。
        虽然也可以使用输入输出流来传输数据,但是这种方式无法保证数据的可靠性,因为在网络通信中,数据的传输可能会受到各种干扰和影响,如网络延迟、丢包等。因此,使用ACK机制可以更好地保证数据的可靠传输,提高数据传输的成功率和效率。

2、ACK 机制在大数据中的应用

2.1 Storm

      大概 13 年前(2011年),Storm 开源,约 8000 行 Clojure 代码组成一个完整的流计算系统,惊艳的设计,巧妙的 Ack 机制解决 At-least-once 的问题。

       ack 机制是 Storm 整个技术体系中非常闪亮的一个创新点,阿里的 JStorm 很好的继承了这个机制,并对原生 Storm 的ack机制做了一点点代码优化。

2.1.1 JStorm 中的 ack 应用

        通过Ack机制,spout发送出去的每一条消息,都可以确定是被成功处理或失败处理, 从而可以让开发者采取动作。比如在Meta中,成功被处理,即可更新偏移量,当失败时,重复发送数据。因此,通过Ack机制,很容易做到保证所有数据均被处理,一条都不漏。

       另外需要注意的,当spout触发fail动作时,不会自动重发失败的tuple,需要spout自己重新获取数据,手动重新再发送一次。ack机制即, spout发送的每一条消息,

  • 在规定的时间内,spout收到Acker的ack响应,即认为该tuple 被后续bolt成功处理
  • 在规定的时间内,没有收到Acker的ack响应tuple,就触发fail动作,即认为该tuple处理失败,
  • 或者收到Acker发送的fail响应tuple,也认为失败,触发fail动作

      另外Ack机制还常用于限流作用: 为了避免spout发送数据太快,而bolt处理太慢,常常设置pending数,当spout有等于或超过pending数的 tuple 没有收到 ack 或fail响应时,跳过执行nextTuple, 从而限制spout发送数据。

      通过设置 spout pend数:

 conf.put(Config.TOPOLOGY_MAX_SPOUT_PENDING, pending); 

2.1.2 JStorm 如何使用 Ack 机制

  • spout 在发送数据的时候带上msgid
  • 设置acker数至少大于0;Config.setNumAckers(conf, ackerParal);
  • 在bolt中完成处理tuple时,执行OutputCollector.ack(tuple), 当失败处理时,执行OutputCollector.fail(tuple); ** 推荐使用IBasicBolt, 因为IBasicBolt 自动封装了OutputCollector.ack(tuple), 处理失败时,请抛出FailedException,则自动执行OutputCollector.fail(tuple)

2.2 Kafka

参考:【Kafka 基础】-- acks 机制_kafka acks-CSDN博客

2.3 RabbitMQ

    在  RabbitMQ 中,有多种方式保证消息的成功投递、成功消费和消息丢失的处理,比较常用的一种就是 ACK 机制。

        ACK 机制是消费者从 RabbitMQ 收到消息并处理完成后,反馈给 RabbitMQ,MQ 收到反馈后才将此消息从队列中删除。消息的ACK确认机制默认是打开的。
      如果一个消费者在处理消息出现了网络不稳、服务器异常等现象,那么就不会有ACK反馈,RabbitMQ会认为这个消息没有正常消费,会将消息重新放入队列。
      如果在集群的情况下,RabbitMQ会立即将这个消息推送给这个在线的其他消费者。这种机制保证了在消费者服务端故障的时候,不丢失任何消息和任务。
      消息永远不会从RabbitMQ中删除,只有当消费者正确发送ACK反馈,RabbitMQ确认收到后,消息才会从RabbitMQ服务器的数据中删除。

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

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

相关文章

Linux关于文件的高级命令

tree命令 tree命令用于以树状图的形式显示目录结构。它可以帮助用户快速了解目录和文件的层次关系,非常适合用于浏览和理解大型文件系统的结构。 基础用法 显示当前目录的树状结构:tree 显示指定目录的树状结构:tree 指定目录路径 tree命…

Java基础入门day74

day74 Mybatis 日志 简介 mybatis有默认的日志实现,之前我们在mybatis的核心配置文件中设置logImpl值为STDOUT_LOGGING,就可以在控制台输出对应的SQL语句日志信息,好处不使用任何第三方jar包即可支持,但是仅限于控制台的输出&a…

基于FreeRTOS+STM32CubeMX+LCD1602+AD5621(SPI接口)的DAC控制输出Proteus仿真

一、仿真原理图: 二、运行效果: 三、STM32CubeMX配置: 1)、GPIO配置: 2)、freertos配置: 四、软件部分: 1)、main主函数: /* USER CODE BEGIN Header */ /** ****************************************************************************** * @file …

模拟5亿年自然进化史,全新蛋白质大模型ESM3诞生!前Meta老将力作LeCun转赞

模拟5亿年自然进化史,全新蛋白质大模型ESM3诞生!前Meta老将力作LeCun转赞。 能抗衡AlphaFold 3的生命科学大模型终于出现了。初创公司Evolutionary Scale AI发布了他们最新的98B参数蛋白质语言模型ESM3。不仅支持序列、结构、功能的all-to-all推理&#…

Java基础-控制流、异常处理、

控制流 条件语句 if 语句: if语句用于基于条件执行代码块。基本语法: if (condition) { // 条件为true时执行的代码 } 可以与else结合使用,提供当条件为false时的备选执行路径: if (condition) { // 条件为true时执行的代码 } else { // 条件为false时执行的代码 } 支持el…

【动态规划】动态规划一

动态规划一 1.第 N 个泰波那契数2.面试题 08.01. 三步问题3.使用最小花费爬楼梯4.解码方法 点赞👍👍收藏🌟🌟关注💖💖 你的支持是对我最大的鼓励,我们一起努力吧!😃😃 1.…

【INTEL(ALTERA)】为什么Nios® II构建流程在 Windows WSL 上产生不正确的 .elf 文件大小?

目录 说明 解决方法 说明 由于在 Makefile 流程中缺少对 .sopcinfo 文件的参考信息,因此,命令在 英特尔 Quartus Prime 专业版软件版本 19.2 解决方法 要解决此问题,请在命令中指定SOPCINFO_FILE可变数据指向相应的 .sopcinfo 文件。 例…

[k8s生产系列]:k8s集群故障恢复,etcd数据不一致,kubernetes集群异常

文章目录 摘要1 背景说明2 故障排查2.1 查询docker与kubelet状态2.2 查看kubelet服务日志2.3 重启docker与kubelet服务2.3.1 首先kubelet启动起来了,但是报错master节点找不到2.3.2 查询kubernetes集群服务,发现etcd与kube-apiserver均启动异常 2.4 etcd…

【Pyhton】读取寄存器数据到MySQL数据库

目录 步骤 modsim32软件配置 Navicat for MySQL 代码实现 步骤 安装必要的库:确保安装了pymodbus和pymysql。 配置Modbus连接:设置Modbus从站的IP地址、端口(对于TCP)或串行通信参数(对于RTU)。 连接M…

公用对象池

什么是对象池? 对象池顾名思义就是存放对象的池子,主要是为了重复利用对象。将不用的对象扔进池子里,需要用的时候再从池子中取出来。这样的一套机制我们称为对象池。 为什么用对象池? 其实从定义我们就可以看出来,…

算法金 | 我最常用的两个数据可视化软件,强烈推荐

大侠幸会,在下全网同名「算法金」 0 基础转 AI 上岸,多个算法赛 Top 「日更万日,让更多人享受智能乐趣」 抱个拳,送个礼 预警:今天文章的描述可能会让你有点别扭;如感到不适,请及时停止 在我行…

大数据面试题之数据库(1)

目录 数据库中的事务是什么,MySQL中是怎么实现的 MySQL事务的特性? 数据库事务的隔离级别?解决了什么问题?默认事务隔离级别? 脏读,幻读,不可重复读的定义 MySQL怎么实现可重复读? 数据库第三范式和第四范式区别? MySQL的…

MacOS 安装 mtr 网络检测工具

Install sudo brew install mtr sudo chown root $(which mtr) sudo chmod us $(which mtr) sudo chown root $(which mtr-packet) sudo chmod us $(which mtr-packet) Test mtr google.com

C# WPF 3D 数据孪生 系列六

数字孪生应用开发 应用开发中的布局需求 Grid基本使用 WPF 3D绘图 点云 系列五-CSDN博客 WPF UI 3D 多轴 机械臂 stl 模型UI交互-CSDN博客 WPF UI 3D 基本概念 点线三角面 相机对象 材质对象与贴图 3D地球 光源 变形处理 动作交互 辅助交互插件 系列三-CSDN博客 数字孪生 介…

015-GeoGebra基础篇-定点旋转物体、动态显示数值并显示运动轨迹

这可能是我能想到的最大概率可以被你搜索到的标题了,容我先喘口气~ 目录 一、成品展示二、涉及内容三、做图步骤(1)绘制三角形t(2)建立定点D(3)制作角度滑动条(4)图形绕点…

刷题Day42|198.打家劫舍、213.打家劫舍II、337.打家劫舍III

198.打家劫舍 198. 打家劫舍 - 力扣(LeetCode) 思路:最简单的动态规划思路。递推公式是dp[j] Math.max(dp[j - 1], dp[j - 2] nums[j]),要么打劫第j个房子(下一个打劫的房子不能和j相邻),要…

嵌入式Linux系统编程 — 6.7 实时信号

目录 1 什么是实时信号 2 sigqueue函数 3 sigpending()函数 1 什么是实时信号 等待信号集只是一个掩码,它并不追踪信号的发生次数。这意味着,如果相同的信号在被阻塞的状态下多次产生,它只会在信号集中被记录一次,并且在信号集…

CG-01D 室外露点变送器

产品概述 本系列产品是采用一款高度集成的温湿度式露点传感器芯片,芯片全量程标定的数字输出。 它采用CMOSens技术,确保产品具有较高的可靠性与优良的长期稳定性。传感器包括一个电容性聚合体湿度敏感元件和一个用能隙材料制成的温度敏感元件&#xff…

Windows 下用MSYS2 环境为RP2040 编译MicroPython 固件

就是想试试看MSYS2 能兼容到什么地步。自己做了个RP2040 板子,用了4MB 的Flash,默认的Micropython 固件是2MB 的,所以只能自己编译固件。 编译环境 MSYS2 的安装方法、基本配置什么的我就不管了,到处都有文章介绍这个。只提一点…

做一个自动校正英文拼写错误的程序 使用c++

概述一个自动校正英文拼写错误的程序的基本的方法,并提供一个简化的C实现。这个方法基于编辑距离(Levenshtein距离)和一个预定义的词典。 以下是实现这样一个程序的步骤: 创建一个词典(单词列表)计算编辑…