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

相关文章

怎样通过分析GC日志来定位Java进程的内存问题

《怎样通过分析GC日志来定位Java进程的内存问题》:本文主要介绍怎样通过分析GC日志来定位Java进程的内存问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、GC 日志基础配置1. 启用详细 GC 日志2. 不同收集器的日志格式二、关键指标与分析维度1.

MySQL中的表连接原理分析

《MySQL中的表连接原理分析》:本文主要介绍MySQL中的表连接原理分析,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录1、背景2、环境3、表连接原理【1】驱动表和被驱动表【2】内连接【3】外连接【4编程】嵌套循环连接【5】join buffer4、总结1、背景

Spring 框架之Springfox使用详解

《Spring框架之Springfox使用详解》Springfox是Spring框架的API文档工具,集成Swagger规范,自动生成文档并支持多语言/版本,模块化设计便于扩展,但存在版本兼容性、性... 目录核心功能工作原理模块化设计使用示例注意事项优缺点优点缺点总结适用场景建议总结Springfox 是

python中Hash使用场景分析

《python中Hash使用场景分析》Python的hash()函数用于获取对象哈希值,常用于字典和集合,不可变类型可哈希,可变类型不可,常见算法包括除法、乘法、平方取中和随机数哈希,各有优缺点,需根... 目录python中的 Hash除法哈希算法乘法哈希算法平方取中法随机数哈希算法小结在Python中,

Java Stream的distinct去重原理分析

《JavaStream的distinct去重原理分析》Javastream中的distinct方法用于去除流中的重复元素,它返回一个包含过滤后唯一元素的新流,该方法会根据元素的hashcode和eq... 目录一、distinct 的基础用法与核心特性二、distinct 的底层实现原理1. 顺序流中的去重

Python的端到端测试框架SeleniumBase使用解读

《Python的端到端测试框架SeleniumBase使用解读》:本文主要介绍Python的端到端测试框架SeleniumBase使用,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全... 目录SeleniumBase详细介绍及用法指南什么是 SeleniumBase?SeleniumBase

关于MyISAM和InnoDB对比分析

《关于MyISAM和InnoDB对比分析》:本文主要介绍关于MyISAM和InnoDB对比分析,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录开篇:从交通规则看存储引擎选择理解存储引擎的基本概念技术原理对比1. 事务支持:ACID的守护者2. 锁机制:并发控制的艺

MyBatis Plus 中 update_time 字段自动填充失效的原因分析及解决方案(最新整理)

《MyBatisPlus中update_time字段自动填充失效的原因分析及解决方案(最新整理)》在使用MyBatisPlus时,通常我们会在数据库表中设置create_time和update... 目录前言一、问题现象二、原因分析三、总结:常见原因与解决方法对照表四、推荐写法前言在使用 MyBATis

Python主动抛出异常的各种用法和场景分析

《Python主动抛出异常的各种用法和场景分析》在Python中,我们不仅可以捕获和处理异常,还可以主动抛出异常,也就是以类的方式自定义错误的类型和提示信息,这在编程中非常有用,下面我将详细解释主动抛... 目录一、为什么要主动抛出异常?二、基本语法:raise关键字基本示例三、raise的多种用法1. 抛

github打不开的问题分析及解决

《github打不开的问题分析及解决》:本文主要介绍github打不开的问题分析及解决,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、找到github.com域名解析的ip地址二、找到github.global.ssl.fastly.net网址解析的ip地址三