Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/elixir/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Elixir 使用GenStage/Flow进行软实时事件处理_Elixir_Flow_Genstage - Fatal编程技术网

Elixir 使用GenStage/Flow进行软实时事件处理

Elixir 使用GenStage/Flow进行软实时事件处理,elixir,flow,genstage,Elixir,Flow,Genstage,我目前正在使用Elixir构建一个软实时事件处理系统,现在我正试图了解GenStage/Flow是否是构建的正确抽象。不幸的是,大型应用程序的示例很少,大多数都是关于过时数据的并行处理。我使用无限的事件流作为源 我的问题是,如果我订阅一个无限的外部事件流,将事件推送到我的应用程序,那么在GenStage/Flow上构建是否有意义。我希望事件到达服务器时立即进行处理。也就是说,我不想缓冲它们,直到我得到500的流量来启动需求。但是使用最小需求量1有意义吗?我想说,对于任何接近实时的GenStage

我目前正在使用Elixir构建一个软实时事件处理系统,现在我正试图了解GenStage/Flow是否是构建的正确抽象。不幸的是,大型应用程序的示例很少,大多数都是关于过时数据的并行处理。我使用无限的事件流作为源


我的问题是,如果我订阅一个无限的外部事件流,将事件推送到我的应用程序,那么在GenStage/Flow上构建是否有意义。我希望事件到达服务器时立即进行处理。也就是说,我不想缓冲它们,直到我得到500的流量来启动需求。但是使用最小需求量1有意义吗?

我想说,对于任何接近实时的GenStage都不起作用。核心思想是推迟评估,直到有需求(比如说,工人准备好了)。如果您想立即处理它们,只需为每个事件生成新的Elixir进程,并祈祷调度程序不会阻塞:)

即使您使用最小需求1,它也将按顺序处理,您将得到缓冲的溢出事件。是的,您可以并行化,但我不确定您是否必须立即启动并行阶段。同样,当您到达具有N个并行工作线程的N个同时事件时,这些事件将得到缓冲


更新经过一点考虑后,我认为在某些情况下,GenStage或其高阶导数流仍然可以用于近实时处理。为了避免流程创建的开销,可以使用固定宽度的窗口来收集和划分事件,然后可以由不同的使用者、池甚至单个流程(如果需要)来处理这些事件。唯一的缺点或者说限制是,这将引入量化,它可以低至1ms:然而这只是一个理论推测,我还没有尝试过

我们使用
GenStage
进行几乎实时的处理,这是一个完美的解决方案。关键字几乎是。我们没有为每个
事件
和祈祷产生新的流程,而是使用了许多(比如说,100个)消费者和生产者。是的,我只是想,如果时间要求允许量化,GenStage(或更容易的流)可能是有用的,这样事件将在固定的时间间隔内按类型收集和分发。(流中的周期窗口)