Как не списать дважды за одну кнопку

habrahabr.ru · world

Между нажатием кнопки и результатом у нас проходит от трёх до шестидесяти секунд: очередь, воркер, внешний API, иногда таймаут. А снаружи — пользователь, у которого на счету ровно одна генерация, и палец, который очень хочет нажать ещё раз. Разбираю двухфазное списание: резерв при постановке в очередь, списание ровно зарезервированного при успехе, удаление строки при провале. Плюс мьютекс на пользователя через UNIQUE-индекс, почему цену нельзя пересчитывать при списании, что делать с резервами от умерших воркеров и зачем суточные лимиты обновлять скользящим окном, а не кроном в полночь. Читать далее

Read full article →