针对多个消费者的GenStage分区调度程序?

时间:2016-10-17 04:30:45

标签: elixir

假设生产者得到的事件如下:

%{somedata: [], analyze: true, test: true}

我有两种不同类型的消费者。第一个只关注事件analyze: true而另一个关注test: true

我可以从文档中了解如何将事件发送到1个分区(生产者),如果事件分析和测试都是真的,我可以发送给两者吗?如果两者都是假的,则为零。

其他选择是:向所有人广播并跳过消费者的工作,如果错误的类型,这听起来不是一个好主意 - 或者为不同类型的工作提供不同的制作人。

1 个答案:

答案 0 :(得分:0)

我知道已经有一段时间了。有类似的问题,我使用GenStage.BroadcastDispatcher解决了这个问题。

这个允许多个订阅者接收相同的消息。 但它允许使用:selector选项进行路由逻辑。 请查看GenStage.BroadcastDispatcher上的文档,详细了解其行为。

在订阅逻辑上,我使用以下代码,利用广播调度程序的:selector选项。

鉴于我有3个消费者。 analyze_consumertest_consumergeneral_consumer

# this one will receive each message that has a value at :analyze
GenStage.sync_subscribe(analyze_consumer,
                        to: producer_pid,
                        selector: &(&1.analyze))

# this one will receive each message that has a value at :test
GenStage.sync_subscribe(test_consumer,
                        to: producer_pid,
                        selector: &(&1.test))

# this one will receive all messages
GenStage.sync_subscribe(general_consumer,
                        to: producer_pid)

希望这有帮助。