Предотвращение потери данных, когда медленные потребители вызывают обратное давление при потоковой обработке (spark, aws).

Я новичок в распределенной потоковой обработке (Spark). Я читал несколько руководств/примеров, в которых показано, как обратное давление приводит к замедлению производительности в ответ на перегрузку потребителей. Приведенный классический пример — прием и анализ твитов. Когда возникает неожиданный всплеск трафика, когда потребители не могут справиться с нагрузкой, они применяют обратное давление, и производитель реагирует, снижая свою скорость.

Чего я действительно не вижу, так это того, какие подходы используются на практике для обработки огромного количества входящих данных в реальном времени, которые не могут быть немедленно обработаны из-за более низкой пропускной способности всего конвейера?

Я полагаю, что ответ на этот вопрос зависит от бизнес-домена. Для некоторых проблем может быть нормально просто удалить эти данные, но в этом вопросе я хотел бы сосредоточиться на случае, когда мы не хотим терять данные.

Поскольку я буду работать в среде AWS, моей первой мыслью будет «буферизировать» лишние данные в очереди SQS или потоке Kinesis. Так ли это просто на практике, или это более стандартное потоковое решение этой проблемы (возможно, как часть самого Spark)?


person andrasp    schedule 08.04.2018    source источник


Ответы (1)


«Есть ли более стандартное решение для потоковой передачи?» — Возможно. Есть много разных способов сделать это, не сразу понятно, есть ли еще «стандарт». Это всего лишь мнение, и вы вряд ли получите конкретный ответ на эту часть.

«Так ли это просто на практике?» — у SQS и Kinesis разные шаблоны использования:

  • Use SQS if you want to always process all messages, AND have a single logical consumer
    • think of this like a classic queue where messages need to be "consumed" from the queue.
    • определенно более простая модель для понимания и использования, но по сути она действует как буфер
  • Use Kinesis if you want to easily skip messages, OR have multiple logical consumers

Для вашего случая использования, когда у вас есть «огромный объем входящих данных в реальном времени, которые не могут быть немедленно обработаны», я бы сосредоточил ваши усилия на Kinesis, а не на SQS, поскольку модель Kinesis также лучше согласуется с другими потоковыми механизмами, такими как Spark/Kafka. .

person Krease    schedule 09.04.2018
comment
Спасибо за полезную информацию о кинезисе и SQS. Для ответа я надеялся на конкретный пример того, как эта проблема решается на практике. - person andrasp; 10.04.2018
comment
Я сделал это, вероятно, 5 разными способами для разных проектов, над которыми я работал, с разными требованиями. Самый простой способ — смоделировать разрыв между производителем и потребителем (на основе метрик количества элементов в очереди/насколько далеко от «текущего» в потоке) и настроить поведение производителя или потребителя на основе значения этой метрики ( автоматическое масштабирование потребителей или производство другого типа или меньшего количества элементов). Если вы можете описать поведение, вы можете смоделировать его и закодировать. - person Krease; 10.04.2018