理解storm的ACKER机制原理
一、简介:
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:这条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后会将该tuple和MessageId发送到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机制原理相关推荐
- 用实例的方式去理解storm的并发度
什么是storm的并发度 一个topology(拓扑)在storm集群上最总是以executor和task的形式运行在suppervisor管理的worker节点上.而worker进程都是运行在jvm ...
- Storm的acker确认机制
Storm的acker消息确认机制... ack/fail消息确认机制(确保一个tuple被完全处理) 在spout中发射tuple的时候需要同时发送messageid,这样才相当于开启了消息确认机制 ...
- storm消息可靠机制(ack)的原理和使用
关于storm的基础,参照我这篇文章:流式计算storm 关于并发和并行,参照我这篇文章:并发和并行 关于storm的并行度解释,参照我这篇文章:storm的并行度解释 关于storm的流分组策略,参 ...
- Storm程序的并发机制原理总结
文章目录 目录 前言: 1.概念 2.配置并行度 总结: 目录 前言: 为了在以后的实践中提高Storm程序执行的效率,我们还是有必要了解下对应的Storm程序的并发机制.(哈哈,虽然以博主小菜鸟的水 ...
- Storm的ack机制在项目应用中的坑
正在学习storm的大兄弟们,我又来传道授业解惑了,是不是觉得自己会用ack了.好吧,那就让我开始啪啪打你们脸吧. 先说一下ACK机制: 为了保证数据能正确的被处理, 对于spout产生的每一个tup ...
- Storm的通信机制
目录 前言: 1.Worker进程间通信原理 2.Worker进程间技术(Netty.ZeroMQ) 3.Worker 内部通信技术(Disruptor) 总结: 目录 前言: 这篇文章,博客主要介绍 ...
- 北风设计模式课程---深入理解[代理模式]原理与技术
北风设计模式课程---深入理解[代理模式]原理与技术 一.总结 一句话总结: 不仅要通过视频学,还要看别的博客里面的介绍,搜讲解,搜作用,搜实例 设计模式都是对生活的抽象,比如用户获得装备,我可以先装 ...
- (转载)彻底理解浏览器的缓存机制
彻底理解浏览器的缓存机制 2018/04/16 概述 浏览器的缓存机制也就是我们说的HTTP缓存机制,其机制是根据HTTP报文的缓存标识进行的,所以在分析浏览器缓存机制之前,我们先使用图文简单介绍一下 ...
- 理解 K8s 资源更新机制,从一个 OpenKruise 用户疑问开始
作者 | 酒祝 阿里云技术专家 背景 OpenKruise 是阿里云开源的大规模应用自动化管理引擎,在功能上对标了 Kubernetes 原生的 Deployment / StatefulSet 等 ...
最新文章
- vue实现pdf导出,解决生成canvas模糊等问题
- Latex IEEEtran第一次总结
- abc242 D(脑子一团浆糊)
- 商城购物APP——YiGo
- 跨平台应用开发进阶(十五) :uni-app实现全项目字体替换
- java: -source 1.6 中不支持 diamond 运算符, (请使用 -source 7 或更高版本以启用 diamond 运算符)
- cms php vue 开源_lucms —— 基于 Vue 和 Laravel 开发的后台管理系统
- 山西将部署5万个5G基站,并对5G基站进行电价补贴
- HTTP状态码大全(整理)
- Elasticsearch集群类型和选举策略
- 网络流量领域公开数据集及工具库
- 天国没有加班,胡新宇兄弟一路好走
- 文档 IT公司组网,网络布局要考虑周全(图)
- 2022/11/16
- 一环(令牌)将它们全部统治
- 微信渠道推广带参数二维码如何生成和统计呢?
- android 字符串换行符,\ n(换行符)删除Android
- 序列化Writable接口
- java开发季度绩效自评_季度绩效考核英文自我评价
- h5开发语音播报功能
热门文章
- Gitee仓库创建及本地项目如何关联并上传
- PhoneGap在Microsoft Visual Studio Express For Wi...
- 基础XML配置的AOP与基于注解实现的AOP详细对比
- poj 3211 Washing Clothes (01)
- SQL注入如何进行攻击
- Undefined reference to ...
- 2020-02-14 转载 开发应该知道的Linux系统分析-网络篇
- WebAPI——浏览器跨域解决方案
- arcpy.mapping实战-专题图制图自动化
- 开始学习 PixiJS