一、简介:
   
  storm中有
个很重要的特性:

保证发出的每个tuple都会被完整处理。一个tuple被完全处理的意思是: 这个tuple以及由这个tuple所产生的所有的子tuple都被成功处理。
          如果任一个消息在timeout所指定的时间内没有完成处理,那这个tuple就失败了。

二、原理:
    

        acker并不会为每个tuple都分配内存空间来完成跟踪,而是利用了一个非常巧妙的算法,这个算法只需使用恒定的20字节就可以完成整个tuple树的跟踪。
     
   具体原理:

         acker对于每个spout-tuple保存一个ack-val的校验值,它的初始值是0, 然后每发射一个tuple/ack一个tuple,那么tuple的id都要跟这个校验值异或一下,
        并且把得到的值更新为ack-val的新值。那么假设每个发射出去的tuple都被ack了, 那么最后ack-val一定是0(因为一个数字跟自己异或得到的值是0)。

通俗理解:
         

       1.在spout产生一条tuple时,会向acker发送一条信息,让ack来进行跟踪,消息内容:

{spout-tuple-id {:spout-task task-id :val ack-val}}
              spout-tuple-id:这条tuple的id,每条tuple都会产生一个随机的MessageId
              
task-id:产生这条tuple的id,spout可能有多个task,每个task都会被分配一个唯一的taskId
              ack-val:默认值为0,用来跟踪tuple

2.acker会在自己的map(类型为TimeCacheMap)里保存这条记录。 这就是acker对spout-tuple进行跟踪的核心数据结构, 对于每个spout-tuple所产生的tuple树的跟踪
       都只需要保存上面这条记录。acker后面会检查:val什么时候变成0,变成0, 说明这个spout-tuple产生的tuple都处理完成了。
     
    3.spout在发送完消息给acker后会将该tupleMessageId发送到boltTask。boltTask在创建子tuple时并不会向acker发送消息让其跟踪,而是很巧妙的省略了这一步:
      bolt在发射一个新的bolt的时候会把这个新tuple跟它的父tuple的关系保存起来(strom称之为anchoring)。然后在ack tuple的时候,storm会把要ack的tuple的id, 以及
     这个tuple新创建的所有的tuple的id的异或值发送给acker。消息格式是:(spout-tuple-id,tmp-ack-val)执行完这一步后,ack-val的值就变成了所有子tuple的id的异或值
      ps:storm使用一致性哈希来把一个spout-tuple-id对应到acker, 因为每一个tuple知道它所有的祖宗的tuple-id, 所以它自然可以算出要通知哪个acker来ack

4.当所有子tuple都被ack之后,val会被异或成0,OK 整个tuple树执行跟踪完成。


场景分析:

     1. 由于对应的task挂掉了,一个tuple没有被ack: storm的超时机制在超时之后会把这个tuple标记为失败,从而可以重新处理。

2. Acker挂掉了: 这种情况下由这个acker所跟踪的所有spout tuple都会超时,也就会被重新处理。

3. Spout挂掉了: 在这种情况下给spout发送消息的消息源负责重新发送这些消息。比如Kestrel和RabbitMQ在一个客户端断开之后会把所有”处理中“的消息放回队列。

由此可见storm的高度容错性。

原文链接:http://blog.itpub.net/29754888/viewspace-1261363/

转载于:https://www.cnblogs.com/wuxiang/p/5629014.html

理解storm的ACKER机制原理相关推荐

  1. 用实例的方式去理解storm的并发度

    什么是storm的并发度 一个topology(拓扑)在storm集群上最总是以executor和task的形式运行在suppervisor管理的worker节点上.而worker进程都是运行在jvm ...

  2. Storm的acker确认机制

    Storm的acker消息确认机制... ack/fail消息确认机制(确保一个tuple被完全处理) 在spout中发射tuple的时候需要同时发送messageid,这样才相当于开启了消息确认机制 ...

  3. storm消息可靠机制(ack)的原理和使用

    关于storm的基础,参照我这篇文章:流式计算storm 关于并发和并行,参照我这篇文章:并发和并行 关于storm的并行度解释,参照我这篇文章:storm的并行度解释 关于storm的流分组策略,参 ...

  4. Storm程序的并发机制原理总结

    文章目录 目录 前言: 1.概念 2.配置并行度 总结: 目录 前言: 为了在以后的实践中提高Storm程序执行的效率,我们还是有必要了解下对应的Storm程序的并发机制.(哈哈,虽然以博主小菜鸟的水 ...

  5. Storm的ack机制在项目应用中的坑

    正在学习storm的大兄弟们,我又来传道授业解惑了,是不是觉得自己会用ack了.好吧,那就让我开始啪啪打你们脸吧. 先说一下ACK机制: 为了保证数据能正确的被处理, 对于spout产生的每一个tup ...

  6. Storm的通信机制

    目录 前言: 1.Worker进程间通信原理 2.Worker进程间技术(Netty.ZeroMQ) 3.Worker 内部通信技术(Disruptor) 总结: 目录 前言: 这篇文章,博客主要介绍 ...

  7. 北风设计模式课程---深入理解[代理模式]原理与技术

    北风设计模式课程---深入理解[代理模式]原理与技术 一.总结 一句话总结: 不仅要通过视频学,还要看别的博客里面的介绍,搜讲解,搜作用,搜实例 设计模式都是对生活的抽象,比如用户获得装备,我可以先装 ...

  8. (转载)彻底理解浏览器的缓存机制

    彻底理解浏览器的缓存机制 2018/04/16 概述 浏览器的缓存机制也就是我们说的HTTP缓存机制,其机制是根据HTTP报文的缓存标识进行的,所以在分析浏览器缓存机制之前,我们先使用图文简单介绍一下 ...

  9. 理解 K8s 资源更新机制,从一个 OpenKruise 用户疑问开始

    作者 | 酒祝  阿里云技术专家 背景 OpenKruise 是阿里云开源的大规模应用自动化管理引擎,在功能上对标了 Kubernetes 原生的 Deployment / StatefulSet 等 ...

最新文章

  1. vue实现pdf导出,解决生成canvas模糊等问题
  2. Latex IEEEtran第一次总结
  3. abc242 D(脑子一团浆糊)
  4. 商城购物APP——YiGo
  5. 跨平台应用开发进阶(十五) :uni-app实现全项目字体替换
  6. java: -source 1.6 中不支持 diamond 运算符, (请使用 -source 7 或更高版本以启用 diamond 运算符)
  7. cms php vue 开源_lucms —— 基于 Vue 和 Laravel 开发的后台管理系统
  8. 山西将部署5万个5G基站,并对5G基站进行电价补贴
  9. HTTP状态码大全(整理)
  10. Elasticsearch集群类型和选举策略
  11. 网络流量领域公开数据集及工具库
  12. 天国没有加班,胡新宇兄弟一路好走
  13. 文档 IT公司组网,网络布局要考虑周全(图)
  14. 2022/11/16
  15. 一环(令牌)将它们全部统治
  16. 微信渠道推广带参数二维码如何生成和统计呢?
  17. android 字符串换行符,\ n(换行符)删除Android
  18. 序列化Writable接口
  19. java开发季度绩效自评_季度绩效考核英文自我评价
  20. h5开发语音播报功能

热门文章

  1. Gitee仓库创建及本地项目如何关联并上传
  2. PhoneGap在Microsoft Visual Studio Express For Wi...
  3. 基础XML配置的AOP与基于注解实现的AOP详细对比
  4. poj 3211 Washing Clothes (01)
  5. SQL注入如何进行攻击
  6. Undefined reference to ...
  7. 2020-02-14 转载 开发应该知道的Linux系统分析-网络篇
  8. WebAPI——浏览器跨域解决方案
  9. arcpy.mapping实战-专题图制图自动化
  10. 开始学习 PixiJS