Использование GenStage/Flow для обработки событий в программном режиме реального времени

В настоящее время я создаю систему обработки событий мягкого реального времени с использованием Elixir, и теперь я пытаюсь разобраться в GenStage/Flow, чтобы понять, являются ли это правильными абстракциями для построения. К сожалению, примеров больших приложений мало, и большинство из них связано с параллельной обработкой устаревших данных. Я использую бесконечный поток событий в качестве источника.

Мой вопрос заключается в том, имеет ли смысл использовать GenStage/Flow для случая, когда я подписываюсь на бесконечный внешний поток событий, который отправляет события в мое приложение. Я хочу, чтобы события обрабатывались сразу же, как только они поступят на сервер. То есть я не хочу буферизовать их, пока не получу 500 для Flow, чтобы начать спрос. Но имеет ли смысл использовать минимальное требование 1?


person user3139545    schedule 16.08.2018    source источник


Ответы (1)


Я бы сказал, что для всего, что близко к реальному времени, GenStage не подойдет. Основная идея состоит в том, чтобы отложить оценку до тех пор, пока не появится спрос (скажем, пока работник не будет готов). Если вы хотите обработать их сразу, просто создайте новый процесс Elixir для каждого события и молитесь, чтобы планировщик не задохнулся :)

Даже если вы используете минимальное требование 1, оно будет обрабатываться последовательно, и вы получите буферизованные события переполнения. Да, распараллелить можно, но я не уверен, придется сразу запускать параллельные этапы или нет. И снова, когда вы достигнете N одновременных событий с N параллельными рабочими процессами, события будут буферизованы.

ОБНОВЛЕНИЕ После небольшого размышления я думаю, что в некоторых случаях GenStage или его производная Flow более высокого порядка все еще могут быть полезны для обработки почти в реальном времени. Чтобы избежать накладных расходов на создание процесса, можно использовать окна фиксированной ширины для сбора и разделения событий, которые затем могут обрабатываться различными потребителями, пулами или даже отдельными процессами, если это необходимо. Единственным недостатком или, скорее, ограничением является то, что это приведет к квантованию, которое может составлять всего 1 мс: https://github.com/elixir-lang/flow/blob/v0.14.2/lib/flow/window.ex#L324 Однако это просто теоретическое предположение, я не пробовал это.

person Ivan Yurov    schedule 16.08.2018
comment
Что ж, мы используем GenStage для обработки почти в реальном времени, и это оказывается идеальным решением. Ключевое слово почти. Вместо того, чтобы создавать новые процессы для каждого Event и молиться, мы используем много (скажем, 100) потребителей и производителя с GenStage.PartitionDispatcher. - person Aleksei Matiushkin; 17.08.2018
comment
Да, я просто подумал, что GenStage (или проще Flow) мог бы быть полезен, если бы временные требования позволяли квантовать, чтобы события собирались и распределялись по типам в течение фиксированного интервала времени. (Периодические окна в Flow) - person Ivan Yurov; 18.08.2018