Консистентность в конкуретной среде: как не захлебнуться в потоках данных

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

Напомню, что текст рассчитан в первую очередь на разработчиков, которые имеют мало практического опыта работы в конкурентной и/или микросервисной среде, поэтому многие вещи я объясню на пальцах. Для тех, кто захочет ознакомиться с более строгими формулировками, сразу скажу, что здесь будут затронуты упрощённые идеи паттернов Transactional Outbox и Saga.

a963f69022981dc3242fa52b9b4649c3.png

Консистентность в пределах одного сервиса

В прошлой статье я рассказал, как для Точки важна консистентность данных. Под консистентностью я здесь понимаю достоверность и непротиворечивость информации о планах и прогрессе выполнения задач. Иными словами, при консистентности сервисы «не забывают» выполнить поставленные задачи, а после выполнения не пытаются их сделать во второй раз.

Например, если пользователь оплачивает покупку — с него надо списать деньги. Если сервис забудет это сделать — продавец, скорее всего, не обрадуется такому исходу. А если плата спишется дважды, то недоволен будет сам пользователь.

Давайте разберёмся, как добиться консистентности в ситуациях, когда наш сервис практически не влияет на «внешний мир», то есть мы не посылаем и не получаем запросы от других сервисов. Взаимодействие происходит лишь с БД.

Казалось бы, а что тут сложного? Давайте просто писать в базу консистентные данные. Нормально делай — нормально будет!

© Habrahabr.ru