Какие плюсы и минусы при помещении данных сначала в Kafka, а затем в базу данных или наоборот?
Пример: Пользователь выполняет вызов REST (POST) для хранения, скажем, продуктов. Обычно я перехватываю этот вызов в бэкэнде и сохраняю тело в базе данных (после проверки и всего…). Лучше всего принять этот вызов и сохранить данные в кулаке Kafka, а затем сохранить их в базе данных (в этом случае база данных является потребителем kafka).
Или лучше сначала сохранить в базе, а потом отправить в кафку?
Спасибо
Если вы сначала сохраните его в базе данных, почему вам все равно нужно отправить его в Kafka? Какие еще потребители есть у вас в этом случае?
Это зависит. Во-первых, зачем вам Кафка?
Kafka необходим для обеспечения масштабируемости и отказоустойчивости приложения. Также для связи между несколькими микросервисами

Я бы предпочел поставить Kafka, так как у него есть гарантия, что сообщение не будет потеряно и оно долговечное. Но если вы поместите 1st put в db, тогда Kafka существует риск того, что ваш сервис может упасть между записью в db и kafka.
в таком случае кафка является источником истины? И ничего плохого в этом нет?
Я не думаю, что есть проблема, даже в архитектуре микросервисов вы никогда не добираетесь до БД, вы помещаете свои результаты в Kafka и базу данных, поскольку другие потребители / службы получают собственное обновление оттуда. На самом деле это происходит в очень короткий промежуток времени, вы чувствуете, что это как помещать данные напрямую в БД.
Сначала вы захотите создать различные темы, которые будут действовать как очереди в Kafka для ваших данных. Тогда у вас будут потребители этих данных, которые будут записывать в вашу базу данных. Это позволит вашей системе повторно подключиться к работе в случае отказа одного из компонентов.
Кроме того, если у вас есть другие потребители данных, это просто создать потребителя очереди kafka и предоставить его вашему потребителю через согласованный общий интерфейс (REST, SOAP, RPC и т. д.).
Кроме того, вы можете масштабировать производительность, имея несколько читателей для каждой темы, которые затем могут объединять свои запросы в базу данных.
Это полностью зависит от ваших требований.
-при неудачной попытке нажать на исключение журнала темы kafka и выйти.
-в зависимости от нажатия кафки - это успех или не сохранение данных на вашей стороне.
-заставить потребителя сохранить его в БД. Я предполагаю, что когда вы отправляете сообщение, вы хотите манипулировать данными в своем методе слушателя. Итак, это зависит от того, какое состояние данных вы хотите сохранить в своей БД.
Кроме того, если вы используете Kafka, вы бы вызывали другой микросервис, ваша таблица, которую вы хотите обновить, доступна для обеих служб, то есть если службы совместно используют базу данных (в идеале они не будут).
Если база данных не является общедоступной, и вы все еще хотите сохранить эти данные, которые необходимо сохранить до или после вызова pushMessage в kafka, потому что это степень проверки, которую вы можете выполнить, успешно ли отправлено сообщение или нет. pushMessage будет иметь метод при сбое, вы можете выбросить и исключить его, а в случае сбоя сохранить данные или выйти.
Давайте рассмотрим пример обоих сценариев с вашим вариантом использования, вызов API для хранения продукта позволяет сказать PRODUCT1:
ваша база данных: product_table (product_id, product_name, product_info)
Псевдокод API:
ПОДХОД 1 -
сохранение в kafka сначала означает, что вы можете увидеть этот результат в БД через некоторое время, вы вернете идентификатор продукта пользователю, и если пользователь захочет заполнить идентификатор продукта, он не будет виден. для меня это неправильный подход, поскольку вам придется обрабатывать многие вещи на стороне пользовательского интерфейса для такой задержки.
ПОДХОД 2 - Сохранение сначала в db, а во вторую - в kafka, есть два сценария: 1. Kafka push синхронизируется в коде - в этом случае при отправке в kafka происходит сбой, что в вашем бизнес-сценарии очень важно, поскольку зависит от других микросервисов. это неправильный подход, но если все в порядке, то в <0,001% случаев, если push не выполняется, а затем вы удаляете продукт из БД и возвращаете исключение пользователю. Я думаю, что с этим все в порядке.
Есть ли исходный код для вашего подхода?
вы можете захотеть узнать больше о двухфазных коммитах