Убедитесь, что согласованность соблюдается с Kafka, Springboot и MongoDB - PullRequest
0 голосов
/ 18 октября 2019

Давайте предположим, что у меня есть данные в Кафке теме employee-topic, 2 SpringBoot экземпляров spring1 и spring2 того же приложения, которые хранятся / извлекаются в /из MongoDB

Предположим, что у нас есть таблица employee, содержащая два поля: id и amount

employee, заполненные следующим образом:

+---+---------+
| id|   amount|
+---+---------+
|  1|      200|
+---+---------+

В теме Kafka у нас есть 2 сообщения, содержащие 2 суммы: "amount1": -200 и "amount1": -100

Предположим, что наше весеннее приложение будет использовать spring1 для получения данных. содержащие "amount1" и spring2 для использования данных, содержащих "amount2"

Цель состоит в том, чтобы обновить значение в таблице employee.

При обновлении значения в MongoDB у меня может быть 2 возможности:

  • spring1 обновить до spring2, чтоозначает, что: spring1 читает 200, введите сумму (-200 + 200) и обновите сумму до 0, spring1 выполните ту же операцию: (-100 + 0) и сумма станет -100.
+---+---------+
| id|   amount|
+---+---------+
|  1|     -100|
+---+---------+
  • spring1 обновление после spring2, что означает, что: spring2 читает 200, делает сумму (-100 + 200) и затем: spring1 выполните ту же операцию (-200 + (-100)), и сумма станет -300
+---+---------+
| id|   amount|
+---+---------+
|  1|     -300|
+---+---------+

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

Заранее спасибо за помощь.

1 Ответ

1 голос
/ 18 октября 2019

По сути, это проблема параллелизма, поэтому я могу предложить несколько вариантов:

Источник событий:

Вместо того, чтобы делать обновления, найдите способ добавитьпоток событий.

Вместо:

  • Текущая сумма равна 200
  • Обновить текущую сумму на текущую сумму -100
  • Обновить текущую сумму на текущую сумму -200
  • Получить текущую сумму

Do:

  • Вставить новую запись на сумму -100
  • Вставить новую запись на сумму -200
  • Начиная с начала (или снимка), соберите общую сумму, чтобы получить текущую сумму

Разделите вашу тему

Я считаю, что это лучше всего подходит для ваших целей.

Вы можете предварительно назначить ресурсы базы данных конкретному экземпляру Spring на основе идентификатора.

По сути, ваш производитель может помещать сообщения с нечетными идентификаторамина тему или раздел для Spring1 для обработки и сообщения с четным идентификатором на отдельную тему или раздел для Spring2 для обработки. Каждая служба Spring знает, что запись базы данных для обновления не будет обновляться другой службой Spring, что устраняет проблему параллелизма.

Получение блокировки

Не могуОб этом можно говорить более подробно, но последнее средство может иметь какой-то механизм распределенной блокировки, такой как файл блокировки, флаг db, сообщение блокировки и т. д.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...