博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Storm消息容错机制(ack-fail机制)
阅读量:6708 次
发布时间:2019-06-25

本文共 1098 字,大约阅读时间需要 3 分钟。

storm消息容错机制(ack-fail)

1、介绍

  • storm中,可靠的信息处理机制是从spout开始的。
  • 一个提供了可靠的处理机制的spout需要记录他发射出去的tuple,当下游bolt处理tuple或者子tuple失败时spout能够重新发射。
  • Storm通过调用SpoutnextTuple()发送一个tuple。为实现可靠的消息处理,首先要给每个发出的tuple带上唯一的ID,并且将ID作为参数传递给SpoutOutputCollectoremit()方法:collector.emit(new Values("value1","value2"), msgId); messageid就是用来标示唯一的tuple的,而rootid是随机生成的。

给每个tuple指定ID告诉Storm系统,无论处理成功还是失败,spout都要接收tuple树上所有节点返回的通知。如果处理成功,spoutack()方法将会对编号是msgId的消息应答确认;如果处理失败或者超时,会调用fail()方法。

2、基本实现

Storm 系统中有一组叫做"acker"的特殊的任务,它们负责跟踪DAG(有向无环图)中的每个消息。

acker任务保存了spout id到一对值的映射。第一个值就是spout的任务id,通过这个idacker就知道消息处理完成时该通知哪个spout任务第二个值是一个64bit的数字,我们称之为"ack val", 它是树中所有消息的随机id的异或计算结果

ack val表示了整棵树(tuple树)的的状态,无论这棵树多大,只需要这个固定大小的数字就可以跟踪整棵树。当消息被创建和被应答的时候都会有相同的消息id发送过来做异或。 每当acker发现一棵树的ack val值为0的时候,它就知道这棵树已经被完全处理了。

 

3、可靠性配置

有三种方法可以去掉消息的可靠性:

将参数Config.TOPOLOGY_ACKERS设置为0,通过此方法,当Spout发送一个消息的时候,它的ack方法将立刻被调用;

Spout发送一个消息时,不指定此消息的messageID。当需要关闭特定消息可靠性的时候,可以使用此方法;

最后,如果你不在意某个消息派生出来的子孙消息的可靠性,则此消息派生出来的子消息在发送时不要做锚定,即在emit方法中不指定输入消息。因为这些子孙消息没有被锚定在任何tuple tree中,因此他们的失败不会引起任何spout重新发送消息。

 

转载于:https://www.cnblogs.com/ahu-lichang/p/6904635.html

你可能感兴趣的文章
产品经理到底是要做全职保姆式,还是要做合作伙伴式?
查看>>
如何安装 Debian 的非 systemd 复刻版本 Devuan Linux
查看>>
《C++ 开发从入门到精通》——2.2 分析C++的程序结构
查看>>
《像计算机科学家一样思考Python》——3.12 为什么要有函数
查看>>
德国队的大数据策略|虽然被淘汰了但是人家准备很充分啊
查看>>
一个小型数据库的核心组件
查看>>
码农如何快速打造一个有设计感的网站
查看>>
你应该知道的人工智能三大分类
查看>>
《Unity 游戏案例开发大全》一6.2 游戏的策划及准备工作
查看>>
《JavaScript设计模式》——9.2 Module(模块)模式
查看>>
《企业大数据系统构建实战:技术、架构、实施与应用》一第3章 企业大数据解决方案3.1 企业大数据解决方案实现方式...
查看>>
Linux下的七个类Dropbox同步工具推荐
查看>>
非ROOT实现静默安装的一些思考与体会,AIDL获取IPackageManager,反射ServiceManager,系统签名...
查看>>
如何快速搭建钉钉微应用?
查看>>
《C语言及程序设计》实践参考——翻转数组
查看>>
Android 仿百合网超火爆社交app首页滑动效果
查看>>
Sublime Text 3 全程详细图文
查看>>
小心FOR IN遍历数组
查看>>
移动Web开发的bug及解决方案
查看>>
RabbitMQ(二) -- Work Queues
查看>>