September 10th, 2021

Book

Экономия на консистенси

Навеяно https://jakobz.livejournal.com/271705.html

Представьте ситуацию, что есть сервис с массовыми выплатами. Например, казино. Платят много, постоянно, большому количеству людей.

Как это работает? Ну вот раз в Х дней "казино" перечисляет в "банк" Y тысяч дол, пополняя баланс, а дальше дёргает выплаты параллельно запросами к разным узлам кластера.

Ну и вот вопрос: как понять когда у "казино" в "банке" закончился баланс?

Есть консистентный способ: сериализовывать все транзакции. То есть выстраивать их в цепочку, чтобы знать какая была перед какой. И перед каждой транзакцией считать текущий баланс и проверять, что его хватает для выплаты.

Это классный способ, всё кристально чисто и сходится до копейки. Но это нахуй никому не надо! Это не нужно техникам "банка", потому что сериализация -- это такой последовательный боттлнек.

Но сюрприз, это не нужно не только техникам, это бизнесу тоже не нужно. Ни "банку" ни "казино". Поскольку они скреплены договорными обязательствами и никуда не убегут (ака eventual consistency).

Вот решение без боттлнека:

- при проведении транзакции мы текущий баланс не считаем
- вместо этого у нас отдельный процесс, считающий баланс каждый час. Который никак с транзакциями не синхронизирован! И транзакции просто проверяют что этот баланс неотрицательный.

Что в этом случае в худшем случае может произойти? Банк может попасть на бабки в размере часового оборота казино. Но реально он не попадёт, поскольку это всё регулируется бизнес-процессами и контрактами. Например, казино обязуется не превышать порог часового оборота. Но этот порого обычно и так есть, для нужд capacity planning, например. И/или оставлять небольшой депозит. В этом случае если баланс меньше порогового, транзакции останавливаются "банком". Как это реально происходит? Процесс рассчёта баланса стартовал в 13:00, а транзакции "увидели" новое значение баланса скажем в 13:02. И у нас получается даже не на час минуса, а на 2 минуты. Что совершенно смешная цифра как для банка так и для казино.