Задача списания с $tries = 3 списала деньги трижды при таймауте банка
class ChargeSubscription implements ShouldQueue
{
public $tries = 3;
public $timeout = 30;
public function handle(Bank $bank): void
{
$bank->charge($this->subscription->card_token, $this->subscription->price);
$this->subscription->markPaid();
}
}
Банк отвечал 40 секунд, но списание проходило. Воркер считал задачу упавшей по таймауту и повторял её. Что исправить?
- Ключ идемпотентности для списания
- Установить $tries = 1 и не повторять никогда
- Увеличить $timeout до 300 секунд
- Вызывать markPaid() до обращения к банку
