Когда Kafka Streams GlobalKTable — хороший выбор в качестве хранилища данных в мире микросервисов?

Я новичок в мире Kafka Streams. Мне интересно, когда использовать Kafka Streams GlobalKTable (с уплотненной темой под капотом) вместо обычной базы данных для сохранения данных. И каковы преимущества и недостатки обоих решений. Я предполагаю, что оба обеспечивают постоянство данных на одном уровне.

Допустим, есть простое приложение электронной коммерции, в котором пользователи регистрируются и обновляют свои данные. И есть два микросервиса — первый (service-users) отвечает за регистрацию пользователей, а второй (service-orders) отвечает за размещение заказов. И теперь есть два варианта:

  1. Когда новый пользователь регистрируется, service-user принимает запрос, сохраняет данные вновь зарегистрированного пользователя в своей базе данных (SQL или noSQL, не имеет значения), а затем отправляет событие в Kafka, чтобы распространить его на другие службы. service-orders получает такое событие и сохраняет необходимые пользовательские данные в своей базе данных. Это как самый распространенный шаблон (из моего опыта).

А теперь второй подход с GlobalKTable:

  1. Когда новый пользователь регистрируется или обновляется, service-user принимает запрос и отправляет событие со снимком пользовательских данных в Kafka. service-user и service-orders используют GlobalKTable для чтения информации о пользователях.

Когда я должен использовать какое решение? Какое решение лучше в каких случаях? Каковы преимущества и недостатки обоих подходов? Разве второй подход не нарушает правило «каждый микросервис должен хранить свои данные в своей собственной базе данных»?

Надеюсь, я хорошо объяснил свои соображения, и они вообще имеют смысл.

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

OneCricketeer 19.11.2022 14:12

Я полагаю, что ваша интерпретация того, что может сделать GlobalKTable, может немного отличаться — она не может использоваться совместно двумя разными и независимо развернутыми приложениями Streams (т. е. микросервисами). Скорее это таблица, содержащая данные, к которым могут обращаться все экземпляры одного и того же микросервиса.

cmcnealy 20.11.2022 06:38
Как настроить Tailwind CSS с React.js и Next.js?
Как настроить Tailwind CSS с React.js и Next.js?
Tailwind CSS - единственный фреймворк, который, как я убедился, масштабируется в больших командах. Он легко настраивается, адаптируется к любому...
LeetCode запись решения 2536. Увеличение подматриц на единицу
LeetCode запись решения 2536. Увеличение подматриц на единицу
Увеличение подматриц на единицу - LeetCode
Переключение светлых/темных тем
Переключение светлых/темных тем
В Microsoft Training - Guided Project - Build a simple website with web pages, CSS files and JavaScript files, мы объясняем, как CSS можно...
Отношения "многие ко многим" в Laravel с методами присоединения и отсоединения
Отношения "многие ко многим" в Laravel с методами присоединения и отсоединения
Отношения "многие ко многим" в Laravel могут быть немного сложными, но с помощью Eloquent ORM и его моделей мы можем сделать это с легкостью. В этой...
В PHP
В PHP
В большой кодовой базе с множеством различных компонентов классы, функции и константы могут иметь одинаковые имена. Это может привести к путанице и...
Карта дорог Беладжар PHP Laravel
Карта дорог Беладжар PHP Laravel
Laravel - это PHP-фреймворк, разработанный для облегчения разработки веб-приложений. Laravel предоставляет различные функции, упрощающие разработку...
0
2
123
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

В целом преимущества GlobalKTable:

  • Вы можете выполнить присоединение к GlobalKTable по внешнему ключу.
  • Приложение имеет полный набор данных в памяти, набор данных автоматически загружается во время запуска приложения, и все изменения данных автоматически синхронизируются во всех экземплярах. Сравнивая это с архитектурой с внешней базой данных, вам не нужно связываться (через сеть) с каким-либо другим ресурсом (например, с реляционной базой данных) во время обработки сообщений, поэтому очевидно, что обработка происходит намного быстрее, и в результате вы можете обрабатывать большие объемы данных. объем данных быстро. Когда вы хотите добиться аналогичной производительности обработки, вам нужно реализовать свой собственный кеш в памяти (например, Guava), а затем вам нужно решить все вопросы, связанные с правильным управлением кэшированием - прогрев, обновление, выселение.

И главные недостатки:

  • Приложение имеет полный набор данных в памяти, это преимущество, но это может быть очень большой проблемой, все зависит от того, насколько велик ваш набор данных или как вы моделируете свои данные. Ссылаясь на ваш пример, хранение всех пользовательских заказов в GlobalKTable звучит как очень плохая идея, набор данных будет расти очень быстро, а размер данных со временем растет, поэтому после нескольких месяцев / лет работы приложения на производстве набор данных может иметь гигабайты, и он будет постоянно расти. Когда нам все еще нравится хранить заказы в GlobalKTable для эффективной обработки, нам нужно по-другому проектировать нашу модель данных. Вероятно, наши объекты (заказы, документы и т. д.) имеют некоторый жизненный цикл, например: новые, оплаченные, закрытые и т. д., некоторые из них завершаются — я имею в виду, что дальнейшая обработка объекта с заданным идентификатором не будет (например, закрытый заказ ), так что если обработки не будет, хранить данные в памяти не нужно, мы можем перенаправить их в какое-то другое хранилище, например Elasticsearch, и удалить из GlobalKTable. Мы можем назвать наш набор данных с заказами при обработке горячим хранением и набором данных с прекращенными заказами с холодным хранением. Короче говоря: иметь только активные/горячие заказы в GlobalKTable может быть хорошей идеей.
  • Запрос GlobalKTable ограничен перебором всего набора данных, подмножества или получением данных по ключу записи или ключу, составленному с отметкой времени.
  • Обработка на основе состояния во внешней базе данных широко используется уже много лет, поэтому многие разработчики знают, как развивать и поддерживать такие приложения. Мы не можем сказать то же самое о сохранении состояния в уплотненных топиках Kafka.

Другие вопросы по теме