Я продовжую повертатися до цієї якості. І я не знайшов відповіді наявними досить нюансованими, тому додаю цю.
TL; DR. Так чи ні, залежно від використання джерела події.
Є два основні види систем подій, про які я знаю.
Процесори подальших подій = Так
У такій системі події відбуваються в реальному світі і реєструються як факти. Такі як складова система для відстеження піддонів продуктів. В основному конфліктних подій немає. Все вже сталося, навіть якщо воно було неправильним. (Тобто піддон 123456 поставлений на вантажівку A, але був запланований на вантажівку B.) Потім згодом факти перевіряються на винятки за допомогою механізмів звітності. Kafka, здається, добре підходить для такого роду додатків для обробки подій вниз,
У цьому контексті зрозуміло, чому люди Кафки виступають за це як рішення подій, що займається пошуком подій. Оскільки він досить схожий на те, як він уже використовується, наприклад, потоки клацань. Однак люди, які використовують термін "Подія подій" (на відміну від потокової обробки), ймовірно, посилаються на друге використання ...
Джерело правди, кероване додатком = Ні
Цей вид програми оголошує власні події в результаті запитів користувачів, що проходять через бізнес-логіку. Кафка не спрацьовує в цьому випадку з двох основних причин.
Відсутність ізоляції сутності
Цей сценарій потребує можливості завантаження потоку подій для конкретного об'єкта. Загальною причиною цього є побудова моделі перехідного запису для бізнес-логіки, яка використовується для обробки запиту. Робити це в Кафці недоцільно. Використання теми за особою може дозволити це, за винятком випадків, коли це не для початківців, коли може бути тисячами або мільйонами організацій. Це пов'язано з технічними обмеженнями в Kafka / Zookeeper.
Однією з головних причин використовувати перехідну модель запису таким чином - це зробити зміни в логіці бізнесу дешевими та зручними для розгортання.
Використовувати тему за типом рекомендується замість Kafka, але це вимагатиме завантаження подій для кожного об'єкта цього типу просто для отримання подій для однієї сутності. Оскільки за позицією журналу ви не можете визначити, які події належать до якої сутності. Навіть використовуючи Знімки, щоб почати з відомого положення журналу, це може бути значна кількість подій, які слід провести.
Відсутність виявлення конфлікту
По-друге, користувачі можуть створювати умови перегонів за рахунок одночасних запитів проти одного і того ж об'єкта. Зберігати конфліктні події та вирішувати їх після факту може бути дуже небажано. Тому важливо вміти запобігати конфліктним подіям. Щоб масштабувати завантаження запитів, звичайно використовувати служби без громадянства, запобігаючи конфліктам запису за допомогою умовного запису (записуйте лише якщо останньою подією сутності було #x). Aka Оптимістична паралельність. Кафка не підтримує оптимістичну одночасність. Навіть якби він підтримував його на рівні теми, для ефективності його потрібно було б зробити аж до рівня сутності. Щоб використовувати Kafka та запобігати конфліктним подіям, вам потрібно буде використовувати видатний, серіалізований автор на рівні програми. Це значна архітектурна вимога / обмеження.
Додаткова інформація
Оновлення за коментарем
Коментар видалено, але питання було на кшталт: що тоді люди використовують для зберігання подій?
Схоже, більшість людей здійснюють власну реалізацію пам’яті для подій поверх існуючої бази даних. Для нерозподілених сценаріїв, таких як внутрішні бек-енди або окремі продукти, добре задокументовано, як створити магазин подій на базі SQL. А ще існують бібліотеки, окрім баз даних різного роду. Існує також EventStore , який побудований для цієї мети.
У розподілених сценаріях я бачив пару різних реалізацій. Проект Jet's Panther використовує Azure CosmosDB з функцією Змінити подачу для сповіщення слухачів. Ще одна подібна реалізація, про яку я чув про AWS, використовує DynamoDB з функцією Streams для сповіщення слухачів. Ключем розділу, ймовірно, повинен бути ідентифікатор потоку для найкращого розподілу даних (щоб зменшити кількість перевищення резервів). Однак повне відтворення через потоки в "Динамо" є дорогим (читати та дорожче). Таким чином, ця імпульс також була налаштована для "Динамо", щоб скидати події на S3. Коли новий слухач приходить в Інтернеті, або наявний слухач хоче повну повтор, він буде читати S3, щоб наздогнати його першим.
Мій поточний проект є сценарієм для багатьох орендарів, і я прокрутив свій власний верх на Postgres. Щось на зразок Citus здається підходящим для масштабованості, розділення на tentant + stream.
Кафка все ще дуже корисна в розподілених сценаріях. Розкривати події кожної служби іншими службами - це нетривіальна проблема. Магазин подій не побудований для цього зазвичай, але саме це робить Кафка добре. Кожна служба має власне внутрішнє джерело істини (це може бути зберігання подій чи іншим способом), але слухає Кафку, щоб знати, що відбувається "зовні". Служба може також розміщувати події в Кафці, щоб інформувати «зовні» про цікаві речі, які робила служба.