Согласованность и полнота распределенной обработки потоков в Apache Kafka Streams

Автор Категория ,
Согласованность и полнота распределенной обработки потоков в Apache Kafka Streams

Сегодня рассмотрим 2 важных понятия архитектуры распределенных систем для хранения и аналитики больших данных на примере платформы потоковой обработки событий Apache Kafka.Читайте далее, что такое согласованность и полнота, а также в чем преимущества строго однократной доставки сообщений на основе транзакционной записи и фиксации смещений в журналах, и как все это поддерживается библиотекой разработки stateful-приложений Apache Kafka Streams.

Почему согласованность и полнота так важны для потоковой обработки Big Data

В настоящее время потоковая обработка стала новой парадигмой программирования в мире Big Data, которая позволяет анализировать данные асинхронно, производя сложные в реальном времени. Поскольку такие задачи решаются распределенными системами, для них остается актуальной проблема CAP-теоремы, которую каждый движок потоковой обработки решает по-своему. Напомним, CAP-теорема для распределенных систем гласит, что из 3 возможных состояний (Consistency – Согласованность, Availability – Доступность и Partition tolerance – Устойчивость к разделению) одновременно возможны лишь 2. В свою очередь, именно согласованность является одним из 4-х ключевых свойств ACID (Atomicity – атомарность, Consistency – согласованность, Isolation – изолированность, Durability – долговечность), характерных для транзакций. Подробнее об этом мы писали здесь.

Однако, платформа Apache Kafka и ее компоненты обеспечивает согласованность, гарантируя, что даже stateful-приложение потоковой обработки может восстановиться после сбоя без дубликатов и потери данных. Также гарантируется полнота данных, что означает отсутствие частичных выходных результатов в качестве окончательных итогов, даже при нарушении порядка поступления входного потока записей. Как именно Apache Kafka и ее библиотека Kafka Streams обеспечивает эти 2 ключевые характеристики распределенных систем потоковой обработки, согласованность и полноту данных, мы рассмотрим далее.

Потоковая согласованность как обеспечение уникальных и существующих записей

Рассмотрим типичный кейс Big Data системы потоковой аналитики больших данных, когда запись обрабатывается в конвейере потоковых данных, но непосредственно перед фиксацией происходит сбой процесса. После восстановления системы та же запись будет снова получена и обработана, а состояние обновится дважды, что приведет к несогласованному выводу и соответствует семантика «хотя бы один раз» (at-least-once). Избежать этого, гарантируя согласованность, поможет строго-однократная семантика доставки сообщений (exactly-once), которая обеспечивает успешную фиксацию записи только один раз даже при неудачном завершении процесса. Как это устроено в Apache Kafka, мы говорили в этой статье.

Полнота как гарантия корректного порядка записей

В идеале в потоковой парадигме момент создания записи (время события) совпадает со временем ее получения и обработки. Но на практике это не совсем так из-за искажения системных часов, а также задержек, вызванных сбоями в источниках данных или сетевой передаче. Все это приводит к нарушению порядка записей в потоках данных. Однако полнота гарантирует корректность итоговых результатов, даже если записи в потоке данных поступают не по порядку.

Таким образом, сбой процесса может привести как к нарушению согласованности, так и к изменению порядка записей в потоковых данных. Apache Kafka решает двойную проблему корректности за счет интеграции потоковой обработки с постоянным ведением журнала. Платформа хранит все непрерывные потоки данных в виде реплицированных журналов на запись (только для добавления, append-only). Это упрощает проблему согласованности и полноты потоковой передачи за счет использования упорядоченных добавлений и повторов журналов транзакций.

Согласованность и полнота потоковых данных в Apache Kafka Streams

Kafka Streams, масштабируемая клиентская библиотека потоковой обработки в Apache Kafka, разделяет проблемы согласованности и полноты, решая их с помощью двух разных подходов:

  • идемпотентная и транзакционная запись для согласованности;
  • спекулятивная обработка с пересмотром для полноты.

В частности, циклы процесса чтение-запись в Kafka Streams транслируются по мере того, как запись добавляется к набору журналов Kafka, а протокол двухфазной фиксации используется для включения идемпотентных и транзакционных добавлений, чтобы обеспечить семантику exactly-once.

Для обеспечения полноты применяется отдельный спекулятивный подход с механизмами, основанными на пересмотрах с подмножеством операторов, чувствительных к упорядочению данных. Этот подход на основе журналов предупреждает задержки внутрипроцессорной координации, позволяя разделить фундаментальные решения для ускорения обработки, повышения пропускной способностью и обеспечения правильного порядка записей [1].

В заключение отметим, что Kafka Streams позволяет создавать распределенные stateful-приложения потоковой обработки данных, хранящихся в топиках Apache Kafka, используя встроенную базу данных RocksDB в качестве надежного хранилища состояний. В свою очередь, это высокопроизводительное key-value NoSQL-хранилище использует файловый кэш на уровне раздела, предоставляя локальный доступ к потокам без задержки в сети [2, 3]. О том, что такое RocksDB, как устроена эта NoSQL-СУБД и при чем здесь Apache Kafka Streams, читайте в этом материале.

Узнайте больше про платформу потоковой обработки событий Apache Kafka и ее библиотеку Streams для разработки распределенных приложений на специализированных курсах в нашем лицензированном учебном центре обучения и повышения квалификации для разработчиков, менеджеров, архитекторов, инженеров, администраторов, Data Scientist’ов и аналитиков Big Data в Москве:

Источники

  1. https://www.confluent.io/blog/rethinking-distributed-stream-processing-in-kafka/
  2. https://medium.com/blackrock-engineering/delivering-eventual-consistency-with-kafka-streams-c013a217b9b9
  3. https://www.confluent.io/blog/how-to-tune-rocksdb-kafka-streams-state-stores-performance/