Чем заменить обычные транзакции в распределенных системах
Если продолжать нашу линию про event-driven, асинхронность и рассинхрон данных, то логично ответить еще на один вопрос «А почему мы просто не обернём всё в одну транзакцию?»
В монолите это звучит разумно: есть база данных - есть транзакция - либо всё записалось, либо ничего. Но в распределённой системе этот подход начинает разваливаться. Потому что у нас уже не одна база и не один процесс, а несколько сервисов, где у каждого своя БД, свой жизненный цикл, свои очереди и задержки.
И вот стандартный кейс: создали заказ, списали оплату, зарезервировали товар, отправили уведомление. И хочется, чтобы это всё было атомарно, но проблема в том, что между этими шагами нет общей транзакции. Нельзя сказать «если уведомление не отправилось, откати оплату».
Потому что: • сервис оплаты уже мог зафиксировать списание • склад уже мог зарезервировать товар • а уведомление вообще живёт в другой системе и упало позже
И тут появляется ключевая мысль: в распределённых системах мы не предотвращаем рассинхрон, мы учимся с ним работать
Тогда что вместо транзакций?
Рассмотрим в следующем посте.
Post #1048
217
- 👍 5
- ✍ 3
- 🔥 2