storm - 处理 bolt.execute 中的异常

storm - handling exceptions in bolt.execute

我正在使用 storm 处理一个流,其中一个螺栓正在写入 cassandra。 cassandra session.execute() 命令可能会抛出异常,我想知道如何将其捕获到 'fail' 元组以便重试。

IRichBolt 的文档不会show 它抛出任何东西,所以我想知道异常情况是如何处理的。

主要问题:我应该将 cassandra 调用包装在 try/catch 中,还是 storm 会为我处理这种情况?

多部分答案:

1) 一定要用 try-catch 块包围您的代码。

2) 如何处理故障取决于 Storm 拓扑和故障类型:

如果异常表明立即重试可能有效,那么您可以循环一些小的、有限的次数,直到尝试成功或您 运行 尝试失败。

如果您正在执行的元组是 spout 发出的元组,那么您的螺栓可能会使该元组失败。这将强制 Storm 重试(也就是说将调用 spout 上的 fail() 方法,您可以编写重试代码)

如果处理此元组已经产生了至少一个副作用,并且您不希望由于重试该元组而重复该副作用,那么您需要更有创意一些。您的 Cassandra bolt 可以将失败的元组发送到失败的元组流中,它可以持久保存在某个地方(HBase、文件系统、Kafka),直到您准备好再次尝试。要重试,您可以将另一个 Spout 添加到您的拓扑中,该 Spout 从失败元组的存储中读取并将它们发送到流中返回到 Cassandra bolt 以进行重试。这为您提供了一种方法,可以在重试之间延长时间来连续循环重试。如果除了失败的元组之外,您还 persist/log Cassandra 异常,您可以 browse/monitor 日志以查看您的管理员是否应该知道任何问题。