Вы можете легко получить конечную согласованность с одной базой данных. Давайте обойдемся без примеров, связанных с денежными сделками, так как они, кажется, вызывают много чувств и мнений.
Вместо этого рассмотрите базу данных, которая отслеживает онлайн-игру. Всякий раз, когда вы выигрываете матч, база данных немедленно сохраняет результат матча. Он также публикует событие с информацией о результате на асинхронной шине публикации/подписки.
Один подписчик получает информацию и может использовать ее для обновления таблицы лидеров.
Это обычная оптимизация производительности, поскольку вы не хотите замедлять обновление состояния игры, также записывая в таблицу лидеров. И вы, вероятно, также не хотите основывать таблицу лидеров на прямом запросе всех результатов матчей, так как это, вероятно, потребует полного сканирования таблицы (возможно, если таблица результатов не отсортирована по счету).
Пока асинхронное сообщение находится в пути, у вас может быть несоответствие в системе, когда таблица лидеров не отражает последний результат.
На самом деле, если вы представляете, что существует достаточная конкуренция, к тому времени, когда таблица лидеров обновится, новый рекорд может быть уже в пути по шине сообщений. Представьте, что это продолжается. Такая система может никогда не прийти в согласованное состояние, но мы по-прежнему называем ее согласованной в конечном счете, потому что, если вы представите, что прекращаете все внешние действия и позволяете системе опустошить все асинхронные очереди, она в конце концов прийти к согласованному состоянию.
Приведенный выше пример основан на асинхронности и некоторой денормализации, но при таких обстоятельствах вы можете легко спроектировать в конечном счете непротиворечивые системы даже для одной базы данных.
person
Mark Seemann
schedule
19.02.2021