Ack 框架分析

2024-06-08 00:32
文章标签 分析 框架 ack

本文主要是介绍Ack 框架分析,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

Ack介绍

 每个Spout Tuple保存一个ack-val的校验值,它的初始值是0,然后每发射一个Tuple或者ack一个Tuple,Tuple的ID都要跟这个校验值异或一下,并把得到的值更新为ack-val的新值。

如果每个发射出去的Tuple都被ack了,最后ack-val一定是0(因为一个数字跟自己异或得到的值是0)。如果ack-val为0,表示这个Tuple树就被完整处理过了。当达到超时时间,ack-val不为0,则Tuple处理失败了。


Ack框架执行过程

1) Storm的Spout中对每条发射出去的消息生产一个MessageId 对象,内容为<RootId,消息ID>,消息ID为一个64位的随机数,并且Spout会以RootId为键,以消息为值,放到自己的pendingMap中,并且只保留一段时间,具体时间有Topology.message.timeout.secs决定,超时后则调用Spout的fail方法。

2)Spout发送消息出去之后,给Acker Bolt 发射一条Tuple消息,消息的内容为[ tuple-id , ack-val, task-id]。

    a) tuple-id 为消息的RootId

    b) Spout发送的消息有一个或者多个接受目标Task,对所有的目标Task的消息ID进行异或,得到ack-val。

    c) task-id 为spout的ID,这样Acker就知道是哪个Spout发送过来的Ack信息了。

    d)发送消息的StreamId是_ack_init(ACKER-INIT-STREAM-ID)。

3)Acker Bolt收到StreamId为ACKER-INIT-STREAM-ID的消息后,会在自己的pending对象中添加一个记录{tuple-id :  { task-id : ack-val  } },记录中的各项值从Spout中发送过来。

4)Bolt收到的消息中(来源于Spout或者父Bolt) 同样会包含MessageId对象。Bolt在发射信息的过程中,对每个需要接受该信息的Task,会创建一个新的MessageId对象。该MessageId对象会发送给目标Task,并且该MessageId的消息Id和接受到的消息Id进行异或,把得到的ack-val发送给Acker Bolt。发送给Acker的消息内容为<tuple-id, ack-val>,消息的StreamId为_ack_ack(ACKER_ACK_STREAM_ID).

5)Acker Bolt收到StreamId 为ACKER_ACK_STREAM_ID的消息后,根据tuple-id从pending中取出老的ack-val,并将新的ack-val进行异或操作,跟新到新的pending中。

6)如果第5步的异或结果为0,则Acker Bolt 认为从Spout发出的消息已经正确处理完毕了。就会给spout发送通知。消息的内容为tuple-id,StreamId 为_ack_ack(ACKER_ACK_STREAM_ID)).

7)Spout收到StreamId后,则将pendingMap中的tuple-id记录删除,并调用Spout的ack方法。

8)如果第1步中spout发射消息的时候,不指定消息ID,则Storm不会启动ACK跟踪。如果系统中不含Acker Bolt,也不会启用Ack。

9)如果Bolt调用fail方法,会给Acker Bolt发送StreamId为_ack_fail(ACKER_FAIL_STREAM_ID)的消息。Acker Bolt收到ACKER_FAIL_STREAM_ID的消息,会将该消息转发给对应的spout。spout收到fail消息后,则执行spout的fail方法。

10)Acker Bolt的pending中,只会保存一段时间的跟踪信息,具体时间根据topology.message.timeout.secs决定的,超过这个时间,就会删除这个tuple-id的跟踪信息。如果后续收到Bolt发送的跟踪信息,则会出发Acker发送ACKER_FAIL_STREAM_ID的消息。


举例说明,Ack框架执行过程


 

1) spout产生一个Tuple,其初始化的消息ID为0100,Spout同时将该消息ID发送给Acker和Bolt1.

2)Bolt1收到Spout发送过来的消息ID为0100消息,经过处理之后,产生新的消息,消息ID为0010,Bolt1就讲 0100 xor 0010的结果发送给Acker。

3)Bolt2接收到Bolt1的消息,处理完后,没有后续的消息产生,则直接将Bolt1的消息ID转发给Acker。

4)Acker中,此时ack-val值已经为0,因此StreamId为ACKER_ACK_STREAM_ID的流上发送相应的消息。Spout收到消息后,调用spout的ack方法,完成整个消息流的ack操作,确认所有的消息都被正确处理了。







这篇关于Ack 框架分析的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1040745

相关文章

Android 缓存日志Logcat导出与分析最佳实践

《Android缓存日志Logcat导出与分析最佳实践》本文全面介绍AndroidLogcat缓存日志的导出与分析方法,涵盖按进程、缓冲区类型及日志级别过滤,自动化工具使用,常见问题解决方案和最佳实... 目录android 缓存日志(Logcat)导出与分析全攻略为什么要导出缓存日志?按需过滤导出1. 按

解决若依微服务框架启动报错的问题

《解决若依微服务框架启动报错的问题》Invalidboundstatement错误通常由MyBatis映射文件未正确加载或Nacos配置未读取导致,需检查XML的namespace与方法ID是否匹配,... 目录ruoyi-system模块报错报错详情nacos文件目录总结ruoyi-systnGLNYpe

Linux中的HTTPS协议原理分析

《Linux中的HTTPS协议原理分析》文章解释了HTTPS的必要性:HTTP明文传输易被篡改和劫持,HTTPS通过非对称加密协商对称密钥、CA证书认证和混合加密机制,有效防范中间人攻击,保障通信安全... 目录一、什么是加密和解密?二、为什么需要加密?三、常见的加密方式3.1 对称加密3.2非对称加密四、

MySQL中读写分离方案对比分析与选型建议

《MySQL中读写分离方案对比分析与选型建议》MySQL读写分离是提升数据库可用性和性能的常见手段,本文将围绕现实生产环境中常见的几种读写分离模式进行系统对比,希望对大家有所帮助... 目录一、问题背景介绍二、多种解决方案对比2.1 原生mysql主从复制2.2 Proxy层中间件:ProxySQL2.3

python使用Akshare与Streamlit实现股票估值分析教程(图文代码)

《python使用Akshare与Streamlit实现股票估值分析教程(图文代码)》入职测试中的一道题,要求:从Akshare下载某一个股票近十年的财务报表包括,资产负债表,利润表,现金流量表,保存... 目录一、前言二、核心知识点梳理1、Akshare数据获取2、Pandas数据处理3、Matplotl

python panda库从基础到高级操作分析

《pythonpanda库从基础到高级操作分析》本文介绍了Pandas库的核心功能,包括处理结构化数据的Series和DataFrame数据结构,数据读取、清洗、分组聚合、合并、时间序列分析及大数据... 目录1. Pandas 概述2. 基本操作:数据读取与查看3. 索引操作:精准定位数据4. Group

MySQL中EXISTS与IN用法使用与对比分析

《MySQL中EXISTS与IN用法使用与对比分析》在MySQL中,EXISTS和IN都用于子查询中根据另一个查询的结果来过滤主查询的记录,本文将基于工作原理、效率和应用场景进行全面对比... 目录一、基本用法详解1. IN 运算符2. EXISTS 运算符二、EXISTS 与 IN 的选择策略三、性能对比

MySQL 内存使用率常用分析语句

《MySQL内存使用率常用分析语句》用户整理了MySQL内存占用过高的分析方法,涵盖操作系统层确认及数据库层bufferpool、内存模块差值、线程状态、performance_schema性能数据... 目录一、 OS层二、 DB层1. 全局情况2. 内存占js用详情最近连续遇到mysql内存占用过高导致

深度解析Nginx日志分析与499状态码问题解决

《深度解析Nginx日志分析与499状态码问题解决》在Web服务器运维和性能优化过程中,Nginx日志是排查问题的重要依据,本文将围绕Nginx日志分析、499状态码的成因、排查方法及解决方案展开讨论... 目录前言1. Nginx日志基础1.1 Nginx日志存放位置1.2 Nginx日志格式2. 499

Python Web框架Flask、Streamlit、FastAPI示例详解

《PythonWeb框架Flask、Streamlit、FastAPI示例详解》本文对比分析了Flask、Streamlit和FastAPI三大PythonWeb框架:Flask轻量灵活适合传统应用... 目录概述Flask详解Flask简介安装和基础配置核心概念路由和视图模板系统数据库集成实际示例Stre