【问题标题】:JS: How to manage a POST request queueJS:如何管理 POST 请求队列
【发布时间】:2022-05-05 23:35:56
【问题描述】:
我创建了一个 API,允许您发出一个不会立即向客户端返回结果并且需要处理的 POST 请求。我想允许客户端发送多个 POST 请求,这些请求一次排队并处理一个。你能推荐一个可以帮助我完成这项任务的包吗?你能举个例子吗:
【问题讨论】:
标签:
javascript
node.js
api
rest
【解决方案1】:
如果您的任务繁重且需要使用 Node.js worker threads,请查看作业队列模块,例如 Bull、BullMQ、Bree 等。
前两个,需要Redis队列存储,最后一个,只是RAM。
否则,您可以使用 MQ 代理,如 Kafka 或 RabbitMQ,并与它们一起工作。
因此,您的POST 请求可以将作业放入队列中并执行,而您的客户端可以通过唯一(作业)ID 或任何其他参数在另一个端点上请求结果。或者通过 WebSocket 接收通知。由您决定。
【解决方案2】:
演员在其运行中访问的队列 URL。了解如何在参与者运行之间共享您的队列。从 Apify 控制台或通过 API 访问和管理请求队列。
请求队列使您能够排队和检索请求,例如带有 HTTP 方法和其他参数的 URL。它们不仅在网络抓取中很有用,而且在您需要处理大量 URL 并将新链接加入队列的任何地方都非常有用。
请求队列存储支持广度优先和深度优先的爬取顺序,以及自定义数据属性。它允许您查询是否已找到特定 URL,将新 URL 推送到队列并获取下一个要处理的 URL。
【解决方案3】:
您可以使您的 POST 请求承诺并将它们链接到 .then() 调用中。在这里您可以看到顺序承诺解析的实现:Resolve promises one after another (i.e. in sequence)?
一个更老派的方法是创建一个function,我们称之为doPosts,你可以像doPosts(requestData, index)一样调用它,它会向requestData[index]发送一个POST请求,在回调中它会拨打doPosts(requestData, index + 1)。
您还可以创建一个for 循环,您可以在其中按顺序发送POST 请求await。
也可以设置XmlHttpRequest的open函数的第三个参数:
var client = new XMLHttpRequest();
client.open("POST", "/log", false);
上面的false 表示同步。因此,您可以循环请求数据并发送同步请求。