Метод Webhook обрабатывается быстрее, чем контроллер - PullRequest
0 голосов
/ 27 сентября 2019

В моем приложении есть оплата Stripe.

Когда я нажимаю кнопку "Оплатить", должна быть обработка через контроллер.Webhook также работает в то же время.

Проблема в том, что метод в ответ на веб-ловушку быстрее, чем действие в моем контроллере.

Как замедлить метод для веб-крючкатак что действие в контроллере сначала обрабатывается?

Webhook:

ev = Stripe::Webhook.construct_event(...)
case ev.type
when "invoice.created"
  change_invoice(ev)
when "invoice.payment_succeeded"
  invoice_paid(ev)

change_invoice(ev) быстрее, чем мой контроллер.

1 Ответ

0 голосов
/ 27 сентября 2019

Самым простым решением, которое я могу придумать, является использование блокировки базы данных.Прочитайте здесь: https://www.peterdebelak.com/blog/pessimistic-locking-in-rails-by-example/

Предполагая, что Событие является моделью, которую вы определили:

  # Controller action
  def create
   ev = Event.create(some_params)
   ev.lock!
   # Do the stripe processing here
   # When you are done with your controller work:
   ev.save # will release the lock
  end

  # Then in your webhook processor
  def process
    ev = Event.find(some_id) # This will wait until the lock is released in the controller thread. Just be aware that if the controller doesn't release the lock within the timeout limit, this will raise an exception
    # now you can process the event because the controller is done
  end
...