全网整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:400-708-3566

jstorm源码解析之bolt异常处理方法

问题

用过storm或者jstorm的都知道,如果在bolt代码中发生了没被catch住的异常,所在worker进程会退出。本文就从源码角度分析一下具体设计,其实并不是“有异常然后进程崩了”这么简单。

实质

我们先看BasicBoltExecutor的源码:

  public void execute(Tuple input) {
    _collector.setContext(input);
    try {
      _bolt.execute(input, _collector);
      _collector.getOutputter().ack(input);
    } catch (FailedException e) {
      if (e instanceof ReportedFailedException) {
        _collector.reportError(e);
      }
      _collector.getOutputter().fail(input);
    }
  }

_bolt.execute(input, _collector) 就是执行我们自己编写的bolt里的excute方法。可以看到,在这里,只会catch storm自己定义的FailedException,并且发送fail消息,标记tuple处理失败, 其余异常则会被放过。

再外层是BoltExecutors的processTupleEvent方法:

    try {
      if (!isSystemBolt && tuple.getSourceStreamId().equals(Common.TOPOLOGY_MASTER_CONTROL_STREAM_ID)) {
        backpressureTrigger.handle(tuple);
      } else {
        bolt.execute(tuple);
      }
    } catch (Throwable e) {
      error = e;
      LOG.error("bolt execute error ", e);
      report_error.report(e);
    }

在这里,所有异常都会被catch住,但是只会进行report_error,并不会发fail消息,相关tuple只能等超时才能被标记为失败。

再来看report_error.report(e) 的具体实现,通过看构造函数,可以看到report_error是一个TaskReportErrorAndDie类,

  @Override
  public void report(Throwable error) {
    this.reporterror.report(error);
    this.haltfn.run();
  }

在这里,reporterror是一个AsyncLoopDefaultKill类

  @Override
  public void run() {
    JStormUtils.halt_process(1, "Async loop died!");
  }

这里就是整个过程的最终步骤了, JStormUtils.halt_process()方法会打印一条"Async loop died!"的日志后将worker进程杀死。

思考

通过代码可以出来,对于jstorm,“异常后worker退出”是一个故意设计出的特性,并非程序不健壮。猜测这一块的设计理念就是对于已知异常,开发人员自己捕获并重新抛出FailedException,使相应消息失败;未知异常则强制使进程直接失败退出,避免过度的catch导致问题被掩盖。

不过虽然话是这么说,对这个设计还是持保留意见,毕竟storm和普通的java程序不一样,storm的worker进程在退出后是会自动被重启的,所以这种异常处理方式并不能起到failfast的效果。

相反,worker的持续重启,还会带来一些其他问题。再一个,不主动将消息标为失败,而是等超时,如果设置的超时时间过长(当然超时时间太长也不合理),也会引入一些问题。比如说kafkaSpout, 一条消息没被ack之前是不会继续取后边的数据的,这样如果有一条数据需要等超时,同分区下的数据在这一个超时周期内,就都无法被处理了。

从另一方面来说,如果像FailedException一样处理其他所有异常,由于异常之后可以看到有数据fail,也并不会掩盖问题。

所以说,这一块的处理逻辑,个人感觉还是需要斟酌一下。

以上这篇jstorm源码解析之bolt异常处理方法就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持。


# jstorm  # bolt  # Springboot2.0处理自定义异常并返回json  # 简单学习5种处理Vue.js异常的方法  # Nodejs处理异常操作示例  # Nodejs异步回调之异常处理实例分析  # SpringBoot学习之全局异常处理设置(返回JSON)  # 浅谈NodeJs之数据库异常处理  # javascript中异常处理案例(推荐)  # 解析Node.js异常处理中domain模块的使用方法  # javascript异常处理实现原理详解  # 是一个  # 在这里  # 可以看到  # 这一  # 只会  # 给大家  # 重启  # 有一  # 也不  # 也会  # 在这  # 还会  # 希望能  # 再来  # 用过  # 这篇  # 后将  # 并不能  # 生了  # 这么简单 


相关文章: 我的世界制作壁纸网站下载,手机怎么换我的世界壁纸?  建站之星如何助力网站排名飙升?揭秘高效技巧  如何用景安虚拟主机手机版绑定域名建站?  微信小程序 input输入框控件详解及实例(多种示例)  建站之星北京办公室:智能建站系统与小程序生成方案解析  广州网站建站公司选择指南:建站流程与SEO优化关键词解析  用v-html解决Vue.js渲染中html标签不被解析的问题  C#怎么创建控制台应用 C# Console App项目创建方法  网站制作服务平台,有什么网站可以发布本地服务信息?  建站之星后台密码遗忘或太弱?如何重置与强化?  建站主机默认首页配置指南:核心功能与访问路径优化  深圳防火门网站制作公司,深圳中天明防火门怎么编码?  如何在Windows环境下新建FTP站点并设置权限?  香港服务器租用每月最低只需15元?  如何通过cPanel快速搭建网站?  建站之星后台密码如何安全设置与找回?  广州顶尖建站服务:企业官网建设与SEO优化一体化方案  建站之星ASP如何实现CMS高效搭建与安全管理?  如何通过山东自助建站平台快速注册域名?  如何选择最佳自助建站系统?快速指南解析优劣  c++23 std::expected怎么用 c++优雅处理函数错误返回【详解】  企业宣传片制作网站有哪些,传媒公司怎么找企业宣传片项目?  网站制作公司排行榜,四大门户网站排名?  制作网站的过程怎么写,用凡科建站如何制作自己的网站?  nginx修改上传文件大小限制的方法  linux top下的 minerd 木马清除方法  制作网页的网站有哪些,电脑上怎么做网页?  公司网站制作费用多少,为公司建立一个网站需要哪些费用?  建站之星五站合一营销型网站搭建攻略,流量入口全覆盖优化指南  设计网站制作公司有哪些,制作网页教程?  企业在线网站设计制作流程,想建设一个属于自己的企业网站,该如何去做?  如何在自有机房高效搭建专业网站?  Python如何创建带属性的XML节点  如何选择CMS系统实现快速建站与SEO优化?  胶州企业网站制作公司,青岛石头网络科技有限公司怎么样?  建站之星备案是否影响网站上线时间?  定制建站模板如何实现SEO优化与智能系统配置?18字教程  黑客如何通过漏洞一步步攻陷网站服务器?  如何在建站主机中优化服务器配置?  香港网站服务器数量如何影响SEO优化效果?  阿里云高弹*务器配置方案|支持分布式架构与多节点部署  如何配置支付宝与微信支付功能?  建站主机选购指南:核心配置优化与品牌推荐方案  seo网站制作优化,网站SEO优化步骤有哪些?  湖南网站制作公司,湖南上善若水科技有限公司做什么的?  c++怎么编写动态链接库dll_c++ __declspec(dllexport)导出与调用【方法】  如何在阿里云完成域名注册与建站?  如何通过服务器快速搭建网站?完整步骤解析  北京网站制作费用多少,建立一个公司网站的费用.有哪些部分,分别要多少钱?  专业商城网站制作公司有哪些,pi商城官网是哪个? 

您的项目需求

*请认真填写需求信息,我们会在24小时内与您取得联系。