问题

用过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异常处理实现原理详解
# 是一个
# 在这里
# 可以看到
# 这一
# 只会
# 给大家
# 重启
# 有一
# 也不
# 也会
# 在这
# 还会
# 希望能
# 再来
# 用过
# 这篇
# 后将
# 并不能
# 生了
# 这么简单
相关文章:
常州自助建站:操作简便模板丰富,企业个人快速搭建网站
如何通过wdcp面板快速创建网站?
javascript基本数据类型及类型检测常用方法小结
C++如何编写函数模板?(泛型编程入门)
内部网站制作流程,如何建立公司内部网站?
如何选择PHP开源工具快速搭建网站?
如何通过虚拟主机快速完成网站搭建?
公司网站设计制作厂家,怎么创建自己的一个网站?
Swift中switch语句区间和元组模式匹配
在线制作视频网站免费,都有哪些好的动漫网站?
长沙做网站要多少钱,长沙国安网络怎么样?
如何在企业微信快速生成手机电脑官网?
如何在建站之星网店版论坛获取技术支持?
如何选择CMS系统实现快速建站与SEO优化?
简易网站制作视频教程,使用记事本编写一个简单的网页html文件?
微信小程序制作网站有哪些,微信小程序需要做网站吗?
php8.4新语法match怎么用_php8.4match表达式替代switch【方法】
宝塔Windows建站如何避免显示默认IIS页面?
网站专业制作公司有哪些,做一个公司网站要多少钱?
如何在阿里云完成域名注册与建站?
建站主机选哪家性价比最高?
如何快速上传建站程序避免常见错误?
建站主机服务器选型指南与性能优化方案解析
建站主机选购指南:核心配置优化与品牌推荐方案
详解免费开源的.NET多类型文件解压缩组件SharpZipLib(.NET组件介绍之七)
如何获取PHP WAP自助建站系统源码?
专业型网站制作公司有哪些,我设计专业的,谁给推荐几个设计师兼职类的网站?
建站主机是否等同于虚拟主机?
如何选择美橙互联多站合一建站方案?
网站app免费制作软件,能免费看各大网站视频的手机app?
建站三合一如何选?哪家性价比更高?
如何在Golang中指定模块版本_使用go.mod控制版本号
网站制作企业,网站的banner和导航栏是指什么?
如何快速搭建自助建站会员专属系统?
高防服务器:AI智能防御DDoS攻击与数据安全保障
行程制作网站有哪些,第三方机票电子行程单怎么开?
建站主机类型有哪些?如何正确选型
建站上市公司网站建设方案与SEO优化服务定制指南
建站之星后台密码遗忘?如何快速找回?
如何选择高效响应式自助建站源码系统?
在线制作视频的网站有哪些,电脑如何制作视频短片?
成都响应式网站开发,dw怎么把手机适应页面变成网页?
建站之星导航如何优化提升用户体验?
宝塔建站无法访问?如何排查配置与端口问题?
建站之星后台密码遗忘如何找回?
合肥制作网站的公司有哪些,合肥聚美网络科技有限公司介绍?
制作销售网站教学视频,销售网站有哪些?
css网站制作参考文献有哪些,易聊怎么注册?
武汉网站制作费用多少,在武汉武昌,建面100平方左右的房子,想装暖气片,费用大概是多少啊?
网站制作公司排行榜,抖音怎样做个人官方网站
*请认真填写需求信息,我们会在24小时内与您取得联系。