延迟koa请求30分钟,但立即发送200标头

问题描述 投票:0回答:1

我希望将所有请求延迟到最初收到请求后的30分钟。我正在与Shopify合作,正在响应一个订单创建网络挂钩,将数据传递给另一个第三方服务。

发生的情况:下订单,然后通过Shopify触发Webhook,Shopify将与关联的订单数据联系我的koa端点。

我想立即接收Webhook主体(包括订单数据),但是要等待30分钟,然后将该信息发送给另一个服务。但是我想立即将200标头发送回Shopify,无论代码在30分钟的延迟后是否能够正常执行(如果延迟不正确,无论如何我都会通过错误电子邮件收到通知,并且可以手动进行处理,这不会是世界末日)。

我已经尝试过setTimeout方法,但问题似乎是这样的:我无法在Shopify结束30分钟后将200标头发送回Shopify(或者无论如何我还是[[不应该到Koa文档?)。

意思是,如果我做类似的事情

context.response.status = 200; // tried to send response code immediately due to 30 minute timeout. await handleRequest(context.request.body); // code waits 30 mins via settimeout

没有立即发送200标头

到30分钟为止,Shopify早就放弃了接收200标头的操作,并已自动将请求放入重试队列,这意味着webhook将在30分钟结束前再次触发,因此向我要等待30分钟的服务发送重复的请求。

我已经考虑过cron,但这并不是我希望每30分钟处理一次,我希望每个单独的请求在收到请求后都需要等待30分钟才能发送给第三方服务。

我实际上是在尝试避免使用数据库。

如果可以在超时之前将200标头发送回Shopify,并在30分钟后进行后续服务调用,那么我可以使用setTimeout很好。

node.js shopify webhooks koa
1个回答
1
投票
状态代码与HTTP消息的第一部分一起出现,因此您需要开始发送或结束HTTP响应。

在这种情况下,您无需阻止第三方通话的响应。将要在30分钟内运行的逻辑移到其自己的函数中,无需等待计时器。您在响应逻辑中不需要它。

一些伪代码:

function talkTo3rdPartyDelayed(context, delay) { setTimeout(()=>{ // talk to 3rdparty }, delay); return; // continue what you were doing before, this is non-blocking } function listenForShopify(req, res, next) { talkTo3rdPartyDelayed({req.body}, 30*60*1000); res.statusCode = 200; next(); // or res.end() which sends the status code }

此外,在功能强大的系统中,您希望将要延迟30分钟的第三方请求存储在队列系统中,并且可见性计时器设置为提前30分钟。这样,如果流程终止,您就不会失去原本打算做的工作。必须手动处理出现的任何问题会很烦。     
© www.soinside.com 2019 - 2024. All rights reserved.