Storm之Collector-p1

简介:



IBasicOutputCollector.java   


List<Integer> emit(String streamId, List<Object> tuple);

提交一系列的tuple,返回接收到这些tuple的taskId


void emitDirect(int taskId, String streamId, List<Object> tuple);

直接向某个task提交一系列的tuple


BasicOutputCollector.java 

这个类里封装了一个OutputCollector的代理和一个inputTuple

OutputCollector是在构造函数里传入的,在Bolt处理完tuple之后调用此类的emit方法时,方法内部会调用封装的OutputCollector来进行emit,

最终的emit是OutputCollector的emit

此类还提供了两个emit方法的重载,目的是在没有指定streamId的时候提供一个默认名为“default”的streamId.

此类的emit方法没有提供anchors参数,每次bolt执行完之后进行emit时会自动将输入tuples和输出tuples关联,如果不需要关联,则可不用此类。


IOutputCollector.java


List<Integer> emit(String streamId, Collection<Tuple> anchors, List<Object> tuple);

提交一系列的tuple,返回接收到这些tuple的taskId,anchors参数是指接收到的tuples


void emitDirect(int taskId, String streamId, Collection<Tuple> anchors, List<Object> tuple);

直接向某个task提交一系列tuple,同样的也会附带上输入的tuple


void ack(Tuple input);

ack某个tuple


void fail(Tuple input);

fail某个tuple


OutputCollector.java

封装了一个IOutputCollector的代理,该代理在构造函数时传递进来被初始化。

提供了多个emit方法的重载,基本上包括有(单个anchor,无anchor,无指定streamId,只有输出的tuple)这些

emitDirect重载的方式也基本上一样,都是为了使用方便来做的。

当然,最终的emit,ack和fail都是通过代理来实现的。


CoordinatedOutputCollector.java

这个类比较奇葩,是定义在CoordinatedBolt的内部类,只有CoordinatedBolt这个类使用。

封装了一个IOutputCollector代理,该代理在构造函数时被初始化。

此类没有重载emit和emitDirect方法,但是在emit和emitDirect方法内部会调用一个名为updateTaskCounts的方法


private void updateTaskCounts(Object id, List<Integer> tasks) {
    synchronized(_tracked) {
        TrackingInfo track = _tracked.get(id);
        if (track != null) {
            Map<Integer, Integer> taskEmittedTuples = track.taskEmittedTuples;
            for(Integer task: tasks) {
                int newCount = get(taskEmittedTuples, task, 0) + 1;
                taskEmittedTuples.put(task, newCount);
            }
        }
    }
}

这个方法主要是更新目标task和向其发送的tuple数量关系,其关系维护在_tracked变量里,关系链为 

tuple_id —> task_id —> num


public void ack(Tuple tuple) {
    Object id = tuple.getValue(0);
    synchronized(_tracked) {
        TrackingInfo track = _tracked.get(id);
        if (track != null)
            track.receivedTuples++;
    }
    boolean failed = checkFinishId(tuple, TupleType.REGULAR);
    if(failed) {
        _delegate.fail(tuple);
    } else {
        _delegate.ack(tuple);
    }
}


将收到的tupleID对应的跟踪信息中receivedTuples(已接收数量)+1 ,然后检查是否已经处理完该tupleID对应的任务,如果检查失败就fail回上一个bolt

TupleType.REGULAR是为了保证不是传递ID的也不是传递数量的流。


public void fail(Tuple tuple) {
    Object id = tuple.getValue(0);
    synchronized(_tracked) {
        TrackingInfo track = _tracked.get(id);
        if (track != null)
            track.failed = true;
    }
    checkFinishId(tuple, TupleType.REGULAR);
    _delegate.fail(tuple);
}


设置跟踪信息failed,然后checkFinishId方法中会fail所有应该ack的tuples,然后删除这个tupleID对应的跟踪信息

相关实践学习
深入解析Docker容器化技术
Docker是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux机器上,也可以实现虚拟化,容器是完全使用沙箱机制,相互之间不会有任何接口。Docker是世界领先的软件容器平台。开发人员利用Docker可以消除协作编码时“在我的机器上可正常工作”的问题。运维人员利用Docker可以在隔离容器中并行运行和管理应用,获得更好的计算密度。企业利用Docker可以构建敏捷的软件交付管道,以更快的速度、更高的安全性和可靠的信誉为Linux和Windows Server应用发布新功能。 在本套课程中,我们将全面的讲解Docker技术栈,从环境安装到容器、镜像操作以及生产环境如何部署开发的微服务应用。本课程由黑马程序员提供。 &nbsp; &nbsp; 相关的阿里云产品:容器服务 ACK 容器服务 Kubernetes 版(简称 ACK)提供高性能可伸缩的容器应用管理能力,支持企业级容器化应用的全生命周期管理。整合阿里云虚拟化、存储、网络和安全能力,打造云端最佳容器化应用运行环境。 了解产品详情: https://www.aliyun.com/product/kubernetes
目录
相关文章
|
NoSQL 算法 Redis
使用Docker-Compose搭建高可用redis哨兵集群
出于学习目的,您可以很轻松地在docker环境下运行redis的单个实例,但是如果您需要在生产环境中运行它,那么必须将Redis部署为HA(High Avaliable)模式。
使用Docker-Compose搭建高可用redis哨兵集群
|
2月前
|
数据采集 人工智能 自然语言处理
AI 搜索引擎优化方法:生成式搜索时代企业流量增长的完整实施路径
本文系统阐述GEO(生成式引擎优化)方法论:区别于传统SEO,GEO聚焦大模型RAG机制,强调实体标准化、结构化内容、多源可信信源、技术适配与持续迭代,助力企业抢占AI搜索答案席位。
215 0
|
4月前
|
人工智能 前端开发 JavaScript
你的时区正在告诉 Claude Code,你是中国人
Claude Code 通过系统时区(UTC+8)、浏览器语言、中文字体等6项本地指纹识别中国用户,无需依赖IP。开源工具 claude-tester 可本地检测你的“AI身份分”(满分100),揭示被忽视的隐私暴露面——时区、字体、Emoji 风格皆成线索。纯前端,零数据上传。
908 2
你的时区正在告诉 Claude Code,你是中国人
|
4月前
|
人工智能 JSON 安全
Claude Code 被封号!转向 Codex 实战教程:12 项关键配置与报错排查大全
2026年Codex CLI推出0.140及以上版本,新增`/import`一键导入指令,大幅降低从Claude Code迁移的工作量。两款工具底层逻辑相近,但配置文件格式、权限管控、钩子事件、模型支持存在明显差异,整体迁移本质是文件重命名、格式转换与局部规则重写。本文基于Codex CLI 0.142.5与Claude Code 2.1.178实测,梳理12项配置对应关系、完整迁移步骤、Claude模型兼容网关搭建、高频故障与团队协作方案,覆盖个人开发者与企业团队两种场景。
623 1
|
4月前
|
自然语言处理 运维 API
阿里云百炼Qwen3.7-Max:功能亮点+免费试用+订阅计费+接入配置解析
阿里云百炼平台的Qwen3.7-Max是面向智能体时代的旗舰大模型,聚焦复杂任务自主执行、深度推理与全场景代码能力,适配企业级应用与开发者场景。以下从核心功能、免费试用政策、订阅计费规则、配置接入流程四大维度,全面详解Qwen3.7-Max的使用与落地细节。
688 0
|
5月前
|
弹性计算 负载均衡 算法
阿里云SLB负载均衡网站流量分发规则配置完全指南
本文系统讲解了阿里云SLB负载均衡服务中网站流量分发规则的完整配置流程。从SLB产品体系(ALB、NLB、CLB)的选型策略入手,深入剖析了四层与七层监听的本质差异、加权轮询与加权最小连接数等调度算法的原理与适用场景、基于域名与URL路径的高级转发规则配置、会话保持机制的实现方式、健康检查参数的精细化调优等核心知识点。文章提供了详细的控制台操作步骤与阿里云CLI/Python SDK代码示例,涵盖从实例创建、监听配置、服务器组绑定到转发策略设置的全链路实操,并结合最佳实践帮助读者构建高可用、高性能的流量分发架构。
880 0
|
5月前
|
人工智能 架构师 API
AI 编程的“不可能三角”突围:从订阅困局到自主掌控
运营人亲测:用VS Code+Continue插件+api.cumob.com聚合网关,以极低成本(国内直连、按量付费)自由调度全球各大厂商的顶尖模型,打破订阅贵、网络差、体验碎的“不可能三角”,重掌AI编程主动权。(239字)
|
存储 数据管理 数据库
数据字典是什么?和数据库、数据仓库有什么关系?
在数据处理中,你是否常困惑于字段含义、指标计算或数据来源?数据字典正是解答这些问题的关键工具,它清晰定义数据的名称、类型、来源、计算方式等,服务于开发者、分析师和数据管理者。本文详解数据字典的定义、组成及其与数据库、数据仓库的关系,助你夯实数据基础。
数据字典是什么?和数据库、数据仓库有什么关系?
|
监控 Shell Linux
systemd调试
systemd调试,参考https://freedesktop.org/wiki/Software/systemd/Debugging/
2403 0
|
关系型数据库 测试技术 PostgreSQL