【发布时间】:2016-05-13 13:18:06
【问题描述】:
所以我正在尝试将我的 spout 配置为从 Amazon SQS 队列中读取。现在,我想要一个可以跨多个 spout 分担负载的情况。
我知道可以有多个线程,但是我是否可以有两个或多个不同的 spout 实例/应用程序从同一个队列中读取并发送到同一个拓扑?例如。 Spout A 和 Spout B 从 SQS 读取,然后都发送到 Bolt C?
【问题讨论】:
标签: amazon apache-storm
所以我正在尝试将我的 spout 配置为从 Amazon SQS 队列中读取。现在,我想要一个可以跨多个 spout 分担负载的情况。
我知道可以有多个线程,但是我是否可以有两个或多个不同的 spout 实例/应用程序从同一个队列中读取并发送到同一个拓扑?例如。 Spout A 和 Spout B 从 SQS 读取,然后都发送到 Bolt C?
【问题讨论】:
标签: amazon apache-storm
当然,您可以有多个 spout,但您必须相应地定义它们以防止重复提交相同的元素(或者您的拓扑确实接受了这种设计)。例如,同一元素的多个进程意味着错误的计数器。
从每个 spout/bolt 的执行器(线程)和任务(实例)开始检查 Storm 并发性,然后选择所需的数量。
在您的代码中,您必须确保您不会两次或多次管理相同的元组,或者在风暴之前执行(一个不接受两次相同元素的队列,该元素被许多人处理/清空例如 spout,或多个队列 - 每个 spout 一个,注意事务)或者您在storm中执行(仅在一个 spout 中使用 x 参数处理消息,在另一个 spout 中使用 y,并且消息不能同时是 x 和 y )。
【讨论】:
SQS Queue -----> Spout(N 个执行器)。
这个模型会很好。一旦任何 executor 实例接收到消息,消息将从 SQS 中变得不可见。
保持消息不可见时间远高于 Storm Topology 中的消息处理时间。
您可以在 ack 方法中保留删除 SQS 消息逻辑。
【讨论】: