来自
spatie/laravel-stripe-webhooks
包的文档:
我们强烈建议您将此作业放入队列,因为这将最大限度地缩短 Webhook 请求的响应时间。这使您可以处理更多条带 Webhook 请求并避免超时。
这是他们给出的例子:
class HandleChargeableSource implements ShouldQueue
{
use InteractsWithQueue, Queueable, SerializesModels;
/** @var \Spatie\WebhookClient\Models\WebhookCall */
public $webhookCall;
public function __construct(WebhookCall $webhookCall)
{
$this->webhookCall = $webhookCall;
}
public function handle()
{
// do your work here
// you can access the payload of the webhook call with `$this->webhookCall->payload`
}
}
根据我的理解,这就是这个包的工作原理:
\Spatie\StripeWebhooks\StripeWebhooksController
的 __invoke
方法。我非常感谢您解释为什么我应该让工作本身可排队。据我所知,仅控制器调度作业就足够了
minimize the response time of the webhook requests
。
我在这里遗漏了什么吗?对于同一个 Webhook 事件,队列是否不会被使用两次?
提前感谢您的回答。
您对包工作原理的理解大部分是正确的。 当调用 webhook 端点时,它将在自己的队列上调度 ProcessWebhookJob。该作业依次检查发生了哪些事件并调度您为这些事件注册的作业。
如果您没有将自己的作业定义为可排队的,它们将在与 ProcessWebhook 作业相同的进程中进行处理。如果您的作业需要较长时间才能完成,或者有许多事件需要处理,这可能会导致处理延迟甚至超时。
因此,将您自己的作业定义为可排队以便在分派时将它们推送到队列中是有意义的。这将释放 ProcessWebhook 作业,使其仅分派作业,而不进行处理。