【问题标题】:Apache Storm - use multiple spouts?Apache Storm - 使用多个喷口?
【发布时间】:2016-05-13 13:18:06
【问题描述】:

所以我正在尝试将我的 spout 配置为从 Amazon SQS 队列中读取。现在,我想要一个可以跨多个 spout 分担负载的情况。

我知道可以有多个线程,但是我是否可以有两个或多个不同的 spout 实例/应用程序从同一个队列中读取并发送到同一个拓扑?例如。 Spout A 和 Spout B 从 SQS 读取,然后都发送到 Bolt C?

【问题讨论】:

    标签: amazon apache-storm


    【解决方案1】:

    当然,您可以有多个 spout,但您必须相应地定义它们以防止重复提交相同的元素(或者您的拓扑确实接受了这种设计)。例如,同一元素的多个进程意味着错误的计数器。

    从每个 spout/bolt 的执行器(线程)和任务(实例)开始检查 Storm 并发性,然后选择所需的数量。

    在您的代码中,您必须确保您不会两次或多次管理相同的元组,或者在风暴之前执行(一个不接受两次相同元素的队列,该元素被许多人处理/清空例如 spout,或多个队列 - 每个 spout 一个,注意事务)或者您在storm中执行(仅在一个 spout 中使用 x 参数处理消息,在另一个 spout 中使用 y,并且消息不能同时是 x 和 y )。

    【讨论】:

    • 谢谢。 Storm 不能基于集群工作吗?也就是说,如果 ip x.x.x.A 的实例正在运行 Storm,它会同时运行 Spouts 和 Bolts?一定是一种去中心化的方法?
    • @SarthakDev 是的。 Storm 决定哪个 bolt/spout 分配给哪个 worker。你不能明确地设置它。 AFAIK 它使用 mod 哈希函数在集群的工作人员中分配螺栓/喷口的任务(实例)。它有时是不平衡的(你可以在 Storm UI 中检查),所以你拥有的工作人员越多,你可以更好地平均分配负载,你可以决定例如每个硬件有超过 1 个工作人员来防止有点糟糕的平衡.
    【解决方案2】:

    SQS Queue -----> Spout(N 个执行器)。

    这个模型会很好。一旦任何 executor 实例接收到消息,消息将从 SQS 中变得不可见。

    保持消息不可见时间远高于 Storm Topology 中的消息处理时间。

    您可以在 ack 方法中保留删除 SQS 消息逻辑。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-05-02
      • 2013-11-11
      • 2015-07-12
      • 1970-01-01
      • 1970-01-01
      • 2018-07-23
      • 2016-09-14
      相关资源
      最近更新 更多