Вступить в клуб →
сложнаявопросLaravel: Eloquent, очереди и события

Задача списания с $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() до обращения к банку

🔒 Проверка ответа — для участников клуба

  • Проверка ответа
  • Подсказка, если застряли
  • Разбор с объяснением, почему так
  • Прогресс по всем задачам и виртуальные собеседования
Зарегистрироваться →

Регистрация занимает минуту

Другие задачи раздела