Задача в очереди получила снимок данных вместо идентификатора
Начисление бонусов ставится в очередь так:
dispatch(new RecalculateBonuses([
'order_id' => $order->id,
'total' => $order->total, // снимок суммы на момент постановки
'status' => $order->status,
]));
В часы пик очередь разгребается с задержкой 10–15 минут. За это время заказ могут отредактировать или отменить. Бухгалтерия находит начисления по отменённым заказам и по устаревшим суммам.
Что верно?
- Достаточно добавить воркеров: если очередь разгребается за секунды, расхождение данных перестаёт возникать вовсе
- Нужно передавать в задачу сам объект заказа целиком — при десериализации его свойства всегда окажутся актуальными
- Задача должна получать идентификатор и перечитывать состояние заказа в момент выполнения, проверяя статус и предусловия
- Проблема решается постановкой задачи внутри той же транзакции, в которой создаётся заказ: тогда данные согласованы
