Поместить данные в первую очередь в Kafka или в базу данных?

Какие плюсы и минусы при помещении данных сначала в Kafka, а затем в базу данных или наоборот?

Пример: Пользователь выполняет вызов REST (POST) для хранения, скажем, продуктов. Обычно я перехватываю этот вызов в бэкэнде и сохраняю тело в базе данных (после проверки и всего…). Лучше всего принять этот вызов и сохранить данные в кулаке Kafka, а затем сохранить их в базе данных (в этом случае база данных является потребителем kafka).

Или лучше сначала сохранить в базе, а потом отправить в кафку?

Спасибо

вы можете захотеть узнать больше о двухфазных коммитах

Thomas Jungblut 25.10.2018 09:53

Если вы сначала сохраните его в базе данных, почему вам все равно нужно отправить его в Kafka? Какие еще потребители есть у вас в этом случае?

Thilo 25.10.2018 09:58

Это зависит. Во-первых, зачем вам Кафка?

Giorgos Myrianthous 25.10.2018 10:05

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

user1786646 25.10.2018 11:34
ReactJs | Supabase | Добавление данных в базу данных
ReactJs | Supabase | Добавление данных в базу данных
Это и есть ваш редактор таблиц в supabase.👇
3
4
2 613
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

Я бы предпочел поставить Kafka, так как у него есть гарантия, что сообщение не будет потеряно и оно долговечное. Но если вы поместите 1st put в db, тогда Kafka существует риск того, что ваш сервис может упасть между записью в db и kafka.

в таком случае кафка является источником истины? И ничего плохого в этом нет?

user1786646 25.10.2018 11:37

Я не думаю, что есть проблема, даже в архитектуре микросервисов вы никогда не добираетесь до БД, вы помещаете свои результаты в Kafka и базу данных, поскольку другие потребители / службы получают собственное обновление оттуда. На самом деле это происходит в очень короткий промежуток времени, вы чувствуете, что это как помещать данные напрямую в БД.

Vasif 25.10.2018 12:40

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

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

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

Это полностью зависит от ваших требований.

  1. Если вы хотите, чтобы функциональность была:

-при неудачной попытке нажать на исключение журнала темы kafka и выйти.

-в зависимости от нажатия кафки - это успех или не сохранение данных на вашей стороне.

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

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

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

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

Давайте рассмотрим пример обоих сценариев с вашим вариантом использования, вызов API для хранения продукта позволяет сказать PRODUCT1:

ваша база данных: product_table (product_id, product_name, product_info)

Псевдокод API:

  1. valiadteProductInfo
  2. сохранить - либо сначала в кафке, либо в БД

ПОДХОД 1 -

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

ПОДХОД 2 - Сохранение сначала в db, а во вторую - в kafka, есть два сценария: 1. Kafka push синхронизируется в коде - в этом случае при отправке в kafka происходит сбой, что в вашем бизнес-сценарии очень важно, поскольку зависит от других микросервисов. это неправильный подход, но если все в порядке, то в <0,001% случаев, если push не выполняется, а затем вы удаляете продукт из БД и возвращаете исключение пользователю. Я думаю, что с этим все в порядке.

  1. kafka push - это опрос базы данных на предмет изменений и внесение изменений в kafka (для этого прочтите о EventSourcing): в этом случае вы получите 100% гарантию, но с небольшой задержкой. это также вы можете использовать

Есть ли исходный код для вашего подхода?

aeranginkaman 23.10.2020 14:03

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