【问题标题】:Data processing in Spout in Apache StormApache Storm 中 Spout 中的数据处理
【发布时间】:2015-09-10 10:11:28
【问题描述】:

我们正在尝试构建一个实时通知系统并使用 Apache Storm。

为此,我们有一个消息代理 (RabbitMq),它负责从发布者那里获取数据,并在订阅者端使用 Listner 将其推送到订阅者。

现在,我需要对消息代理接收到的每个事件进行一些处理(对数据库进行一些调用,并基于此决定是否要进一步处理它)。

理想情况下,storm 应该从流中读取事件数据(在我们的例子中是 Message Broker)。但是由于我们必须对事件进行一些操作并决定是否应该将其馈送到螺栓进行处理,我应该在我的 Spout 中执行该逻辑还是应该有一个单独的组件,比如一种将发送的调度程序它到 Spout 。基本上,spout 应该包含任何类型的业务逻辑吗?此外,考虑到我们在一秒钟内有数百万个事件发生,是否足以将这么多的负载放在 spout 上。

【问题讨论】:

    标签: rabbitmq apache-storm


    【解决方案1】:

    基本上,将逻辑放入 Spout 中是没有问题的。您只需要考虑以下几点:执行Spout.nextTuple() 方法的线程确实有一些额外的职责。例如,它接收已处理元组和超时发出元组的确认和失败消息(如果没有按时收到确认)。为此,您不要“永远”停留在.nextTuple() 中(即循环或阻塞),而是在向系统发出元组后返回(或者如果没有元组可以发出,则返回,但不是堵塞)。否则,Spout 无法正常工作。 nextTuple() 将被 Storm 循环调用。因此,在处理完 ack/fail 消息等之后,对nextTuple() 的下一次调用会很快发生。

    在您的情况下,如果您在检查元组后返回是否需要处理应该没问题。在丢弃或向系统发出单个元组后,只需从.nextTuple() 返回。您可能需要考虑得出关于单个元组的结论所需的时间,即您在nextTuple() 中花费的时间。如果太长,您可能需要增加消息超时时间。

    【讨论】:

      猜你喜欢
      • 2020-05-01
      • 1970-01-01
      • 2019-12-28
      • 2015-04-22
      • 1970-01-01
      • 2018-08-14
      • 1970-01-01
      • 2018-09-19
      • 2019-03-14
      相关资源
      最近更新 更多