终止风暴拓扑后资源清理

Resource clean up after killing storm topology

我们有一个与 MariaDB 数据库交互的风暴拓扑。我们的 Bolt 实现了 IRichBolt 接口并覆盖了生命周期方法。我们在 prepare 方法中打开一个数据库连接,并在 cleanup 方法中关闭它。 cleanup 方法文档说:

Called when an IBolt is going to be shutdown. There is no guarentee that cleanup will be called, because the supervisor kill -9's worker processes on the cluster. The one context where cleanup is guaranteed to be called is when a topology is killed when running Storm in local mode

kill -9 命令会在不清理任何资源的情况下终止进程。所以我们得出这样的结论,即在终止拓扑时,没有必要调用 cleanup 方法并关闭数据库连接。

所以继续我的问题,我们有一个用于拓扑部署的 shell 脚本,执行时会终止当前拓扑,超时为 0,并部署一个新拓扑。我们在数据库级别面临一个问题,即打开了许多连接,这提示我们之前的连接未关闭。 (上一个拓扑中打开的那个)。

我们的假设是否正确?增加超时会清理所有资源吗?

没有。增加拓扑超时不会影响您的工作人员必须清理的时间。当你使用例如一个 30 秒的超时,它只是关闭 spout 并给拓扑的其余部分 30 秒来完成处理。

您想要的是增加 Storm 允许工作人员在强制终止之前关闭的时间。 https://github.com/apache/storm/blob/b07413670fa62fec077c92cb78fc711c3bda820c/storm-server/src/main/java/org/apache/storm/DaemonConfig.java#L780 选项允许您指定 Storm 在发送 kill -9 之前将等待多长时间。默认值为 3 秒。您需要在storm.yaml中设置该选项,在拓扑配置中设置不会有任何效果。