Как собранные данные передаются в систему анализа и дальше по цепочке?
Вспоминая общую схему потоковой системы, речь будет идти о компоненте очереди сообщений.
Зачем очередь сообщений?
Кажется, данные можно сразу передавать на анализ.
Ответ – распределённые системы. Проще – отсутствие сильных связей между компонентами.
Чтобы разорвать сильную связь, вводятся “прослойки”.
Очередь сообщений позволяет работать на более высоком уровне абстракции.
Что именно понимается под очередями сообщений?
Здесь понимается в широком смысле.
Программные продукты:
Три главных компонента:
Очереди абстрагируются брокером.
На этой схеме более очевидно, что происходит:
Одна из целей – ослабить связи.
Очередь сообщений ослабляет связь сбора данных и анализа.
Какие преимущества это даёт?
Если сообщения порождаются быстрее, чем получается обработать, как предотвратить “захлёбывание”?
“Противодавление” – мера того, насколько быстрее сообщения порождаются, чем обрабатываются. Аналогия с гидравликой.
Временный рост противодавления – нормально.
В системах “почти” реального времени, рост противодавления – признак проблемы.
Варианты:
Решение на стороне потребителей. При росте противодавления, можно увеличить число потребителей или сделать их быстрее.
Не всегда оправдано.
Управление производителем. Уменьшать плотность потока при росте противодавления.
Не все системы поддерживают. Тогда управление – на совести разработчика.
Поддержка – в основном в продуктах, с долговечными сообщениями.
Интересны не только в связи с противодавлением.
Могут обеспечивать устойчивость к сбоям связности сети.
Долговечные сообщения: не только устойчивость к сбоям, но и поддержка периодически активных потребителей.
Может быть интересно, если хочется обрабатывать одни и те же данные по-разному.
Пример: система дорожной навигации (типа Яндекс.Навигатор).
Три вида гарантий:
Какое лучше? Интуитивно – “ровно один раз”. Но цена – выше сложность, ниже производительность.
Точки отказа “только один раз”:
Не все системы дают гарантию “только один раз”.
Не фатально – можно реализовать вручную через координацию производителей и потребителей:
Полезно хранить метаданные полезной нагрузки сообщения. Почти “бесплатно” возможность аудита данных.
Следует следить за:
Стоит обратить внимание:
Что произойдёт с данными, когда случится что-то нехорошее.
Если один из брокеров выйдет из строя? Если используется долговременное хранилище, риску подвержены только не записанные туда сообщения.
Способов снижения рисков:
В случае разрыва сетевых соединений? При поддержке репликации, данные в относительной безопасности.
При выборе продукта, следует найти ответы:
При отказе хранилища? Следует найти ответы на вопросы:
Вопросы:
Концепция данных в движении (in-flight data) и непрерывных запросов.
Данные в движении – все кортежи в системе, от источника до клиента на выходе. Находящиеся в процессе обработки, или только что обработанные.
Данные “в покое” – записанные в постоянное хранилище.
Цель – быстрее получить данные из очереди сообщений. В идеале, анализ данных с тем же темпом, что и сбор данных.
В “традиционной” системе – меняющиеся запросы к статичным данным.
В потоковой системе – фиксированный запрос, динамические данные. Модель непрерывного запроса.
Пример: управление новостным агентством.
Традиционная система:
Потоковая система:
Традиционная система проигрывает потоковой в отзывчивости.
Ещё раз ключевые различия:
В потоковой системе – инверсия потока упралвения.
Различие в обработке сбоев:
Различие в обработке сбоев:
Приведём несколько примеров успеха:
Общие подходы к распределённым системам.
На рынке немало технологий.
Из популярных OpenSource:
Проекты фонда Apache.
Общая архитектура
Пример с газовой турбиной:
Система Spark Streaming – поверх Apache Spark. Кроме Streaming:
Архитектура Streaming:
Storm – система потоковой обработки по принципу “один кортеж за раз”. Спроектирована для работы в режиме реального времени.
Архитектура Storm:
Концепции:
Flink – потокоориентированная система. Всё рассматривается как поток.
Программа для Flink состоит из:
Выход – “сток”
Приложение для Flink – само по себе поток.
Облегчает композицию приложений.
Архитектура:
Потоковая модель Samza несколько отличается. Использует поэтапную модель обработки потока. На базе Apache YARN и Apache Kafka.
Похожа на семантику доставки в очередях. Определения те же, но выводы немного другие.
Семантики:
“Не более одного раза”, ошибки:
Семантика “не более одного раза” – самая простая
“Не менее одного раза” более сложная, поскольку потоковая система должна отслеживать каждое сообщение и подтверждение получения.
Потоковая задача может получить одно и то же сообщение несколько раз, задача должна быть идемпотентной.
Семантика “ровно один раз” ещё увеличивает сложность системы. Система должна ещё и обнаруживать дубликаты. Упрощает работу задачи.
Вообще, лучше всё равно делать задачи идемпотентными.
Какие именно гарантии нужны в каждом конкретном случае зависит, понятно, от характера решаемой задачи.
Если потоковый алгоритм более сложный, чем чистая обработка текущего сообщения (без зависимостей между сообщениями или от внешних данных), необходимость хранения состояния. Тогда – служба управления состоянием.
Вопрос не в том, сломается что-то или нет, а в том, когда это произойдёт. Поэтому – отказоустойчивость.
В компоненте анализа данных семь точек отказа:
Отказы со стороны входящего потока и места назначения (и связи с ними) должны корректно обрабатываться и связь должна автоматически восстанавливаться при первой возможности
Оставшиеся элементы:
Два подхода к репликации и координации: