Как мне реализовать Event Sourcing, используя Kafka? - PullRequest
0 голосов
/ 19 января 2019

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

Идея:

Мое приложение содержит список клиентов. Клиенты могут быть созданы и удалены. Очень просто. Когда приходит запрос на создание клиента, я создаю событие CUSTOMER_CREATED, включающее данные клиента, и сохраняю его в теме kafka с помощью KafkaProducer. То же самое, когда клиент удаляется с событием CUSTOMER_DELETED.

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

Я бы создал временный список клиентов, а затем поочередно обрабатывал бы все события (создание клиента, создание клиента, удаление клиента, создание клиента и т. Д.). (Использование этих событий с KafkaConsumer). В конце я возвращаю временный список.

Я хочу, чтобы это было как можно проще, и это только дает мне понимание того, как на практике работает поиск событий. Это источник событий? А также: как мне создавать моментальные снимки при такой реализации?

1 Ответ

0 голосов
/ 20 января 2019

когда я хочу перечислить всех клиентов, я должен повторить все события, которые произошли до сих пор

Вы на самом деле этого не делаете, или, по крайней мере, не после того, как ваше приложение запускается заново и активно собирает / захороняет данные. Я рекомендую вам поискать «Двойственность таблицы потоков», которая в основном утверждает, что ваша таблица - это текущее состояние мира в вашей системе, и снимок во времени всех потоковых событий на данный момент, который будет ((* customers added + customers modified) - customers deleted).

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

С этим вы можете реализовать на нем Интерактивные запросы для сканирования или поиска сведений о конкретном клиенте.

...