Поговорим о сохранении данных после обработки.
Варианты действий по завершению анализа:
Долговременное хранилище – если необходимо хранение исторических данных для последующей обработки в пакетном режиме.
Примеры: HDFS, HBase, реляционные СУБД и т.п.
Три принципиальных подхода:
1 и 2 – прямая запись.
Потенциальные проблемы и риски:
3 – непрямая запись.
Здесь связь между хранилищем и обработкой разрывается очередью.
Подходы, с очередью, рассмотренные ранее.
Данные из очереди извлекаются пакетным загрузчиком:
Сохранение из Kafka в HDFS, Openstack Swift или другое.
Цель потоковой системы – обработка данных в “почти” реальном времени. Для анализа может быть необходим какой-то объём исторических данных. Доступ должен быть максимально быстрым.
Максимально быстрый доступ – к данным в оперативной памяти.
Системы хранения – в 1000 или более раз медленнее оперативной памяти. Объем оперативной памяти узла может достигать нескольких терабайт.
Рассмотрим варианты.
Решения, предназначенные для встраивания в программу. Рассчитаны на один узел, не предоставляют средств распределённой обработки.
На каждом узле анализа – своё, отдельное хранилище данных. Проблема доступа к нелокальным данным. Проблема отказоустойчивости.
Примеры:
Предназначены для ускорения доступа к данным за счёт хранения в оперативной памяти.
Ставятся между потребителями данных и системой хранения (обычно долговременным хранилищем).
Долговременное или отказоустойчивое хранилище в любом случае необходимо на случай отказов по питанию.
Рассмотрим стратегии кэширования
Постоянное хранилище обновляется помимо кэша. На предыдущих схемах показано точечным пунктиром.
Примеры:
Базы данных в памяти (IMDB) и сетки данных в памяти (IMDG) – более мощное решение.
Для энергонезависимого хранения непосредственно используется диск, однако данные в основном хранятся в памяти, а диск используется только для журналирования и периодического сохранения “снимков” данных, т.е. для устойчивости к сбоям.
Примеры:
Как осуществляется доступ к данным, т.е. как данные доставляются потребителю?
Распространённые паттерны:
Подразумевает синхронизацию между хранилищем и клиентом.
Общая идея:
При поступлении новых данных, сервер API вызывает процедуру на подключённом клиенте.
API следит за изменениями в хранилище и уведомляет о них клиента.
Две разновидности паттерна:
Простая схема запрос-ответ.
Необходимо добавить метки, чтобы избежать передачи одних и тех же данных.
Например, ответ сервера может содержать метку последнего обновления данных (версия или метка времени), а клиент в запросе – отправлять метку последнего запроса данных (аналогично).
Клиент подписывается на некоторую тему, API рассылает всем подписчикам сообщения об изменении/поступлении новых данных.
Есть преимущества перед другими рассмотренными, набирает популярность.
Рассмотрим распространённые протоколы взаимодействия с клиентами. Для каждого будем обращать внимание на следующие факторы:
Веб-хуки концептуально аналог callback в языках программирования.
Выполняются с помощью HTTP POST-запросов. Клиенты часто реализуются сторонними разработчиками.
Для потоковой системы подходит не слишком хорошо.
Клиент устанавливает соединение с сервером, соединение остаётся открытым на неопределённо долгий период времени. Сервер посылает клиенту данные по мере поступления. Соединение закрывается после получения пакета данных и открывается заново.
Клиент управляет опросом наличия изменений, открывая соединение, но за это приходится расплачиваться необходимостью держать соединение со всеми клиентами.
Немного ближе к тому, что мы ожидаем увидеть от потокового API, поскольку есть возможность контролировать поток данных со стороны клиента. Но низкая эффективность.
Разработан в 2015 году как усовершенствование HTTP long-poll. Устраняет неэффективность открытия и закрытия соединений. Поддерживается прокси-сервер push-уведомлений.
C 2011 года. Полнодуплексный протокол, транспортный механизм – TCP. Поддерживают все современные браузеры для настольных и мобильных устройств. Обычно он используется в вебе, но для большинства популярных языков программирования имеются библиотеки поддержки.
Интересен в том смысле, что для начального согласования используется HTTP, а затем отправляется запрос переключения протокола и происходит переход на TCP.
Быстро становится одним из самых распространённых протоколов в системах потоковой обработки, в первую очередь в силу эффективности и гибкости.
В случае клиентов с ограниченными ресурсами, не поддерживающих HTTP, возможно использовать протоколы Data Distribution Service (DDS) и MQ Telemetry Transport (MQTT). Оба протокола используют паттерн издатель-подписчик.
Если же возможностей DDS или MQTT недостаточно, то всегда есть вариант напрямую работать с TCP. Обратная сторона конечно в том, что придётся с нуля разрабатывать весь протокол.