Node.js 使用https请求/响应包装的分布式队列

Node.js 使用https请求/响应包装的分布式队列,node.js,queue,task,distributed,Node.js,Queue,Task,Distributed,寻求有关如何执行以下操作的建议: 从网站接收特定长时间运行流程的请求(约10-30秒) 网站后端计划作业并将其放入分布式队列。。可以是SQS/Kue/resque 工作人员将作业从队列中取出并进行处理。在某处有结果 网站后端订阅作业完成事件并获取已处理作业的结果 网站后端使用任务结果关闭对网站的请求 1、2和3都可以。我只是发现将排队任务的结果传递回后端以使其能够关闭请求很棘手 从网站进行轮询不是一个选项——无论任务需要多长时间才能处理,请求都必须保持打开状态。我用的是nodejs 2-4都发生

寻求有关如何执行以下操作的建议:

  • 从网站接收特定长时间运行流程的请求(约10-30秒)
  • 网站后端计划作业并将其放入分布式队列。。可以是SQS/Kue/resque
  • 工作人员将作业从队列中取出并进行处理。在某处有结果
  • 网站后端订阅作业完成事件并获取已处理作业的结果
  • 网站后端使用任务结果关闭对网站的请求
  • 1、2和3都可以。我只是发现将排队任务的结果传递回后端以使其能够关闭请求很棘手


    从网站进行轮询不是一个选项——无论任务需要多长时间才能处理,请求都必须保持打开状态。我用的是nodejs

    2-4都发生在服务器端。没有什么可以阻止您轮询结果的预期结果位置(在服务器端),然后在结果最终出现时返回结果

  • 客户端发送请求
  • 服务器启动作业并开始轮询结果
  • 结果返回,因此服务器端的轮询循环结束
  • 服务器将结果发送回客户端
  • 客户端-服务器连接最终被切断
  • 如果作业完成后可以执行url,那么代码运行效率会更高。在这种情况下,您的服务将有两个端点。。。一个供客户端启动流程,另一个供作业队列调用

  • 客户端发送请求
  • 服务器启动作业。。。将响应回调保存在一个全局对象中,这样它就不会关闭(我在这里假设类似于express)

    push({id:12345,res:res}); 执行({id:12345,数据:{…})

  • 作业完成并保存结果后,使用id调用服务url

  • 您可以检查作业是否已实际完成,并从openJobs列表中删除该作业
  • 完成原始响应

    openJob.res.send(数据)

  • 这将发送数据并关闭原始客户机-服务器连接

  • 总体结果是,您根本没有轮询。。。这很酷


    当然。。。在这两种情况下,如果服务器在批处理中关闭,则会被拧紧。这就是为什么我会在这个场景中推荐类似socket.io的东西。您可以将作业的结果排在某个位置,socket.io将轮询/等待列表上的回调,并在出现新项目时推送到客户端。这更好,因为如果服务器崩溃没什么大不了的-一旦服务器恢复,客户端将重新连接。

    谢谢您的回答。我不确定将响应回调存储为全局状态是否是一个好主意……是的,但从技术上讲,所有回调都存储在全局状态中(通常由V8引擎在内部完成)。。。任何回调都必须存储,直到最终调用为止。在本例中,我们正在重建一个离开js环境的回调机制。几乎可以正常工作,但在第二次循环中,当我将
    res
    存储在数组中,然后将其拉出以关闭响应时,它会出现“发送后无法设置标头”的错误。现在,我肯定不会过早结束回复。这是一个范围问题,导致
    res
    始终是第一个响应,我不确定如何“释放”此变量,使其不会关闭。
    res
    始终是第一个响应?你是说在你把它从阵列中拉出来之后?我通常会在使用express时出错,因为我想先发送内容上的一个片段,然后再发送另一个片段,并且我错误地对它使用了“send”命令(这会关闭请求),如果数组中的内容不正确,我会将其拉出。是的,我很熟悉错误的含义。。但我唯一一次关闭它是在我把它从阵列中拉出来之后。所以我想弄明白为什么它总是放在第一反应中。