有没有办法在风暴中重试一个博尔特?

时间:2015-12-14 16:13:22

标签: java apache-storm

我们有一个可以进行数据库保存的应用。如果保存失败,有没有办法只重试失败的螺栓?我们不想一直失败回到鲸鱼喷水。

2 个答案:

答案 0 :(得分:2)

You could add an output "scorpion tail" stream to the bolt. The stream would be read by whichever bolt would begin the retry process. This would create a loop in the topology. The idea is that when a failure occurs, you can write a packet of information to this stream and have the tuple delivered to the upstream bolt that would begin the retry. The packet contains whatever state is needed for the retry.

答案 1 :(得分:1)

Storm中没有内置支持。但是,您可以编写自己的解决方案:

  1. 不要确认(或失败)失败的元组,将其缓冲在内部数据结构中(即成员变量;可能是List),并从execute()返回
  2. 继续处理execute()中的其他元组,直到您想重试(可能是某个计时器,即您可能想要获取当前时间戳或基于计数器重试)。
  3. 在重试时,在处理新的输入元组之前,从缓冲区接收失败的元组并尝试插入到DB中。如果再次失败,请再次插入缓冲区。如果插入成功,则ack缓冲元组并继续处理当前输入元组。
  4. 你只需要考虑Storm MESSAGE_TIMEOUT。重试不能超过此值,因为如果元组在超时值内没有得到响应,那么Storm会自动使源元组失效。