Использование Kafka в качестве (CQRS) Eventstore. Хорошая идея?


хотя я сталкивался с Кафка раньше я только недавно понял, что Кафка, возможно, может быть использован в качестве (основы) a CQRS,eventstore.

один из главных моментов, который поддерживает Кафка:

  • захват / хранение событий, все Ха, конечно.
  • паб / суб архитектуры
  • возможность воспроизведения журнала событий, который позволяет новым подписчикам регистрироваться в системе после факт.

по общему признанию, я не на 100% разбираюсь в CQRS / Event sourcing, но это кажется довольно близким к тому, что должен быть eventstore. Забавно: я действительно не могу найти так много о том, что Кафка используется в качестве магазина событий, поэтому, возможно, я что-то упускаю.

Итак, что-нибудь отсутствует у Кафки, чтобы он был хорошим eventstore? Сработает ли это? Используя его производство? Интересует понимание, ссылки и т. д.

в основном состояние системы сохраняется на основе на транзакциях / событиях, которые система когда-либо получала, вместо того, чтобы просто сохранять текущее состояние / снимок системы, что обычно делается. (Подумайте об этом как о главной книге в бухгалтерском учете: все транзакции в конечном итоге складываются до конечного состояния) это позволяет всем классным вещам, но просто читайте по ссылкам.

5 148

5 ответов:

Кафка должен быть системой обмена сообщениями, которая имеет много общего с магазином событий, однако процитировать их вступление:

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

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

обновление

Кафка документация:

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

обновление 2

одной из проблем с использованием Kafka для поиска событий является количество необходимых тем. Обычно в источнике событий существует поток (тема) событий для каждой сущности (как потребитель, продукт, etc). Таким образом, текущее состояние объекта может быть восстановлено путем повторного применения всех событий в потоке. Каждая тема Кафки состоит из одного или нескольких разделов, и каждый раздел хранится в виде каталога в файловой системе. Там тоже будет давление из ZooKeeper а число Z-узлов увеличивается.

Я один из оригинальных авторов Кафка. Кафка будет очень хорошо работать в качестве журнала для поиска событий. Он отказоустойчив, масштабируется до огромных размеров данных и имеет встроенную модель секционирования.

мы используем его для нескольких случаев использования этой формы в LinkedIn. Например, наша система обработки потока с открытым исходным кодом, Apache Samza, поставляется с встроенная поддержка для поиска события.

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

Я написал немного об этом стиле использования Кафки здесь.

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

  • Кафка только гарантирует, по крайней мере один раз доставить и есть дубликаты в хранилище событий, которое невозможно удалить. обновление: Здесь вы можете прочитать, Почему это так трудно с Кафкой и некоторые последние новости о том, как, наконец, добиться такого поведения: https://www.confluent.io/blog/exactly-once-semantics-are-possible-heres-how-apache-kafka-does-it/
  • из-за неизменяемости, нет никакого способа управлять хранилищем событий, когда приложение развивается и события должны быть преобразованы (есть, конечно, методы, такие как upcasting, но...). Один раз может сказать, что вам никогда не нужно преобразовывать события, но это неверное предположение, может возникнуть ситуация, когда вы делаете резервную копию оригинала, но обновляете их до последних версий. Что является допустимым требованием в архитектурах, управляемых событиями.
  • нет места для сохранения снимков объектов / агрегатов и воспроизведения будет становиться все медленнее и медленнее. Создание моментальных снимков-это обязательная функция для хранилища событий в долгосрочной перспективе.
  • Данные разделы Кафки распределены, и ими трудно управлять и резервное копирование сравнить с базами данных. Базы данных просто проще :-)

Итак, прежде чем сделать свой выбор, вы дважды подумаете. Хранилище событий как комбинация интерфейсы прикладного уровня (мониторинг и управление), SQL/NoSQL store и Kafka в качестве брокера-лучший выбор, чем оставить Kafka обрабатывать обе роли для создания полного полнофункционального решения.

Event store-это сложный сервис, который требует больше, чем то, что может предложить Kafka, если вы серьезно относитесь к применению источников событий, CQR, саг и других шаблонов в событийной архитектуре и высокой производительности.

не стесняйтесь оспаривать мой ответ! вы можете не то, что я говорю о вашем любимом брокере с множеством перекрывающихся возможностей, но все же, Kafka не был разработан как магазин событий, а больше как высокопроизводительный брокер и буфер одновременно для обработки быстрых производителей против медленных сценариев потребителей, например.

пожалуйста, посмотрите eventuate.io микросервисы open source framework, чтобы узнать больше о потенциальных проблемах:http://eventuate.io/

обновление от 8 февраля 2018

Я не включаю новую информацию из комментариев, но согласен с некоторыми из этих аспектов. Это обновление больше о некоторых рекомендациях для событийное конструирование платформы. Если вы серьезно относитесь к конструирование прочной конструкции и максимальной производительности в целом я предоставлю вам несколько советов могут быть вам интересны.

  1. не используйте пружину-это здорово (я использую его сам много), но тяжелый и медленный в то же время. И это не микросервис платформа вообще. Это" просто " структура, которая поможет вам реализовать один (много работы за этим..). Другими механизмами являются "просто" легкий отдых или СПД или иначе ориентированных структур. Я рекомендую, вероятно, лучшее в своем классе открытых источников полной конструирование платформа, которая возвращается к чистой Java корней: https://github.com/networknt

Если вы задаетесь вопросом о производительности, вы можете сравнить себя с существующим эталоном комплект. https://github.com/networknt/microservices-framework-benchmark

  1. Не используйте Кафку вообще : -)) это наполовину шутка. Я имею в виду, что, хотя Кафка велик, это еще одна брокер-центрическая система. Я думаю, что будущее в системах обмена сообщениями без брокеров. Вы можете быть удивлены, но есть более быстрые, чем Кафка системы: -), конечно, вы должны спуститься на более низкий уровень. Посмотрите на хронику.

  2. для хранилища событий я рекомендую улучшенный Postgresql расширение под названием TimescaleDB, которая фокусируется на высокой производительности обработки временных рядов данных (события таймсерий) в большом объеме. Конечно, CQRS, источник событий (replay и т. д. особенности) построены в рамках light4j из коробки, которая использует Postgres в качестве низкого хранения.

  3. для обмена сообщениями попробуйте посмотреть на хронику очереди, карты, движок, сеть. Я имею в виду избавиться от этой старомодный брокер centric решения и идут с микро-системой обмена сообщениями (врезанной одним). Хроника очереди на самом деле даже быстрее, чем Кафка. Но я согласен, что это не все в одном решении, и вам нужно сделать некоторую разработку, иначе вы идете и покупаете корпоративную версию(платную). В конце концов, усилия по созданию из Chronicle собственного уровня обмена сообщениями будут оплачены путем снятия бремени поддержания кластера Кафки.

Я продолжаю возвращаться к этому QA. И я не нашел существующие ответы достаточно подробны, поэтому я добавляю этот.

ТЛ;ДР: да или нет, в зависимости от вашего использования поиска события.

есть два основных вида систем источников событий, о которых я знаю.

нисходящие обработчики событий = да

в такой системе, события происходят в реальном мире и фиксируются как факты. Например, складская система для отслеживания паллет продуктов. Там в основном нет конфликтующих событий. Все уже произошло, даже если это было неправильно. (Т. е. поддон 123456 поставлен на грузовик А, но был запланирован на грузовик Б.) Затем позже факты проверяются на исключения с помощью механизмов отчетности. Кафка кажется хорошо подходящим для такого рода нисходящего потока, обработки событий приложения.

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

контролируемый приложением источник истины = нет

такое заявление декларирует свои собственные события в результате запросов пользователей, проходящих через бизнес-логику. Кафка не работает хорошо в этом случае по двум основным причинам.

отсутствие изоляции сущности

этот сценарий требует возможности загрузки потока событий для определенной сущности. Общая причина этого заключается в создании переходной модели записи для бизнес-логики, используемой для обработки запроса. Делать это у Кафки непрактично. Использование topic-per-entity может позволить это, за исключением того, что это не стартер, когда могут быть тысячи или миллионы этой сущности. Это связано с техническими ограничениями в Kafka / Zookeeper. Используя тему ТВ-типа вместо них рекомендуются для Кафки, но это потребует загрузки событий ибо каждая сущность такого типа, чтобы получить события для одного объекта. Поскольку вы не можете определить по позиции журнала, какие события принадлежат к какой сущности. Даже с помощью снимки чтобы начать с известной позиции журнала, это может быть значительное количество событий для оттока. Но снимки не могут помочь вам с изменением кода. Поскольку добавление новых функций в бизнес-логику может привести к структурной несовместимости предыдущих снимков. Так что еще надо сделать тему анализировать в тех случаях, чтобы построить новую модель. Одна из основных причин использования временной модели записи вместо постоянной заключается в том, чтобы сделать изменения бизнес-логики дешевыми и простыми в развертывании.

отсутствие обнаружения конфликта

во-вторых, пользователи могут создавать условия гонки из-за одновременных запросов к одной и той же сущности. Может быть весьма нежелательно сохранять конфликтующие события и разрешать их постфактум. Поэтому важно уметь предотвращать конфликтные события. К масштабирование нагрузки запроса, обычно используют службы без состояния, предотвращая конфликты записи с помощью условной записи (только запись, если последнее событие сущности было #x). A. k. A. оптимистичный параллелизм. Кафка не поддерживает оптимистический параллелизм. Даже если он поддерживает его на уровне темы, он должен быть полностью на уровне сущности, чтобы быть эффективным. Чтобы использовать Kafka и предотвратить конфликтующие события, вам нужно будет использовать сериализованный писатель с отслеживанием состояния на уровне приложения. Это значительное архитектурное требование / ограничение.

дополнительная информация


обновление за комментарий

Это было слишком большим, чтобы вписаться в комментарий. Похоже, что большинство людей сворачивают свою собственную реализацию хранилища событий поверх существующей базы данных. Для не распределенных сценариев, таких как внутренние серверные или автономные продукты, это хорошо документированы как создать хранилище событий на основе SQL. И есть библиотеки доступны поверх различных видов баз данных. Существует также EventStore, который построен для этой цели.

в распределенных сценариях, я видел несколько разных реализаций. Самолет проект Panther использует Azure CosmosDB, С функцией изменения канала для уведомления слушателей. Еще одна подобная реализация, о которой я слышал на AWS, использует DynamoDB с функцией Streams для уведомления слушателей. Ключ раздела, вероятно, должен быть идентификатором потока для лучшего распределение данных (чтобы уменьшить объем избыточной подготовки). Тем не менее, полный повтор через потоки в Динамо стоит дорого (читай и по стоимости). Таким образом, этот impl также был настроен для динамических потоков для сброса событий в S3. Когда новый слушатель подключается к сети, или существующий слушатель хочет полного воспроизведения, он будет читать S3, чтобы догнать в первую очередь.

мой текущий проект-это мультитенантный сценарий, и я свернул свой собственный поверх Postgres. Что-то вроде Citus кажется подходящим для масштабируемости, разделение по tentant + stream.

Кафка по-прежнему очень полезен в распределенных сценариях. Это нетривиальная проблема-предоставлять события каждой службы другим службам. Магазин событий обычно не строится для этого, но это именно то, что Кафка делает хорошо. Каждая служба имеет свой собственный внутренний источник истины (может быть хранилище событий или иначе), но слушает Кафку, чтобы знать, что происходит "снаружи". Команда может также размещать свои служебные мероприятия в Kafka, чтобы информировать "снаружи" интересные вещи делали.

Да, вы можете использовать Kafka в качестве хранилища событий. Она работает довольно хорошо, особенно с введением Кафка Потоков, который обеспечивает Кафка-родной способ обработки ваших событий в накопленные укажите, что вы можете запросить.

о:

возможность воспроизведения журнала событий, который позволяет возможность для новых абонентов зарегистрироваться в системе после факта.

Это может быть сложно. Я покрыл это в подробно здесь: https://stackoverflow.com/a/48482974/741970