当前位置: 首页 > 知识库问答 >
问题:

带有队列的长时间运行的REST API

谈渊
2023-03-14

非常感谢你的见解。

共有1个答案

向修谨
2023-03-14

我假设您的系统如下所示。您有一个REST服务,它接收来自客户机的请求。它将请求转换为业务逻辑可以理解的命令。您将这些命令放入队列中。您有一个或多个workers可以处理和从队列中删除这些命令,并将结果发送给REST服务,后者可以响应客户机。

您的问题是,由于长时间运行的任务,客户端连接超时,因此无法发送响应。因此,您可以做的是在将命令放入队列并添加轮询链接后发送一个202 accepted,这样客户机就可以轮询更改。您的任务有多个子任务,因此有进展,而不仅仅是挂起和完成状态更改。

  1. 如果您想坚持轮询,您应该创建一个新的REST资源,其中包含实际状态和长时间运行任务的进度。这意味着您必须将此信息存储在数据库中,以便REST服务能够响应get/tasks/23461/status请求。这意味着您的工作人员必须在完成子任务或整个任务时更新数据库。
  2. 如果您的REST服务作为守护进程运行,那么您可以通过进度通知它,这样将任务状态存储在数据库中就不是工作人员的责任了。这种REST服务还可以将信息存储在内存中。
  3. 如果决定使用websockets通知客户端,则可以创建通知服务。在REST时,您必须使用任务ID进行响应。之后,在websocket连接上发回这个任务id,这样通知服务就会知道哪个websocket连接订阅了某个任务的事件。之后,您将不需要REST服务,只要客户端不关闭连接,您就可以通过websocket连接发送进度。
  4. 您可以通过以下方式组合这些解决方案。您可以让REST服务创建任务资源,这样您就可以通过使用轮询链接访问进度。之后,您将通过websockets连接返回一个带有202的标识符。因此可以使用通知服务来通知客户端。按照进度,您的工作人员将通知REST服务,该服务将创建类似get/tasks/23461/status的链接,并通过通知服务将该链接发送给客户端。之后,客户端可以使用该链接更新其状态。
 类似资料:
  • 每个人在最新的更新之后,Studio在运行应用程序之前已经运行了很长时间(3-40分钟)“运行Gradle Build”。如何治疗?当前Studio版本:1.3。2.

  • 我正在进行数据结构考试,我正在准备一系列复习题。我的问题如下: “假设你的朋友来找你,声称他发明了一个超快速的基于优先级的比较队列。优先级队列的速度如下(n 是当前在优先级队列中的项目数):a. 在 O(sqrt(logn))时间插入新项目 b. 在 O(sqrt(logn)) 时间从队列中提取(删除并返回)最小项目。 解释为什么你的朋友一定在撒谎: 据我所知,标准优先级队列的运行时间是用于提取的

  • 问题内容: 说我长时间运行更新查询 some_table中的modification_time的值是什么?它们是相同还是不同(例如,执行查询花了2天的时间)。 如果它们不同,如​​何编写此查询以使它们都相同? 问题答案: 它们都是一样的,因为NOW()在查询开始时被锁定了。 答案太短了吗? 好的,更多信息有关NOW()的MySQL参考 NOW()返回一个 恒定时间 ,该时间指示该语句 开始执行的时

  • 问题内容: 我正在用node.js编写游戏服务器,某些操作涉及服务器部分的大量计算。在运行这些计算时,我不想停止接受连接- 当node.js不支持线程时,如何在后台运行它们? 问题答案: 我个人不能保证任何一种,但是如果您热衷于进行工作,那么节点模块页面上列出了针对节点的WebWorkers API的几个独立实现。 : http://github.com/cramforce/node-worker

  • 我在context.xml文件中定义了一个Spring调度任务,它每分钟运行一次。该任务调用postgres存储过程。存储过程运行时可以持续一分钟以上。如果当前运行没有完成,spring框架会调用相同的调度程序吗?谢谢,

  • 经过长时间的调查,问题似乎是长时间运行的请求超时,并且在NodeJS中再次调用endpoint。没有来自浏览器的新网络请求。我做了一些测试,2分钟后再次调用endpoint。我读到NodeJS中http请求的默认超时时间为2分钟。 https://nodejs.org/docs/latest-v12.x/api/http.html#http_server_timeout 我使用的是NestJS(有