Andy Melnikov (nponeccop) wrote,
Andy Melnikov
nponeccop

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

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

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

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

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

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

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

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

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

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

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

  • Post a new comment

    Error

    default userpic

    Your reply will be screened

    Your IP address will be recorded 

    When you submit the form an invisible reCAPTCHA check will be performed.
    You must follow the Privacy Policy and Google Terms of use.
  • 24 comments