Live2D

bolt继承关系和区别

先上个图: 

 

 

 具体区别:

IRichBolt/IBasicBolt

区别IRichBolt和IBasicBolt

IRichBolt继承自IBolt和IComponent。IBasicBolt继承自IComponent,和IBolt没有继承关系。

实现IRichBolt的Bolt有:BaseRichBolt,ClojureBolt,CoordinatedBolt,KeyedFairBolt,RichShellBolt等。

实现IBasicBolt的有:BaseBasicBolt,IdentityBolt,PrepareBatchBolt等。

他们的区别在于IRichBolt需要手动的ack或fail消息,若不ack,很快就outOfMemory了;而IBasicBolt不需要确认消息,自动完成。

看下面的OutputCollector和BasicOutputCollector。

 

OutputCollector/BasicOutputCollector

OutputCollector实现了IOutputCollector,方法有:emit,emitDirect,ack,fail。

BasicOutputCollector实现了IBasicOutputCollector,方法有:emit,emitDirect,reportError。

可以看到,OutputCollector暴露了emit API给IRichBolt,包括了ack和fail,用来对应消息成功/失败后的处理,可以保证消息不丢失。具体可以看:如何保证消息不丢失

而BasicOutputCollector没有此api,对应于IBasicBolt。

IBatchBolt

顾名思义,批处理的Bolt,与IRichBolt和IBasicBolt也没有继承关系。这个bolt对象每次处理一批batch在一起的tuples。对于每一个tuple调用execute方法。而在整个batch处理完成的时候调用finishBatch方法。然后新来一批tuples,会产生新的batchBolt来处理。

具体可以见:http://xumingming.sinaapp.com/736/twitter-storm-transactional-topolgoy/

BatchOutputCollector

和IBatchBolt对应的Collector

BaseTransactionalBolt

事务性的Bolt。

记住:继承了BaseTransactionalBolt的class在execute方法中获取tuple时,应从下标为1开始获取,第0个为TransactionAttempt对象,为<txid,_attemptId>,用来记录tuples重放时。因为事务性的bolt继承了批处理的bolt,具体还是见IBatchBolt中关于事务性拓扑的链接。

 

 

参考:https://my.oschina.net/u/2300159/blog/382524

posted @   -涂涂-  阅读(250)  评论(0编辑  收藏  举报
编辑推荐:
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
阅读排行:
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
点击右上角即可分享
微信分享提示