node.js - Node.js 应用程序与 IronWorker 上的工作线程之间的通信。如何正确轮询任务状态并接收任务响应?

标签 node.js heroku express worker ironworker

申请如下:

首先,我使用带有express.js框架的node.js应用程序作为Web服务器。在前端,当用户通过 POST 表单发送付款时,express.js 通过“app.post”路由此任务并调用外部 API 进行付款。理想情况下,此 API 请求应返回应重定向用户进行付款的 URL。然后,express.js 应通过“app.post”响应变量 (res) 重定向用户:

res.redirect(307, url);

由于此支付 API 请求需要一些时间,并且由于我使用的是 Heroku,因此 API 请求超时并返回错误。为了解决这个问题,我知道我需要在 Heroku worker 插件上设置一个 worker (根据 https://stackoverflow.com/a/11438381/2859410 ),例如 IronWorker。但是,我很难理解将工作线程中发出的外部 API 请求返回的 URL 传送回 Node.js 应用程序的正确机制是什么。

为了让事情更清楚: - 用户提交付款表格。
- Node.js 应用程序处理 POST 数据并调用工作线程(在工作线程上“排队”任务)。
- 工作人员请求外部支付 API,该 API 返回 URL。
- 工作人员应将此 URL 传达回 Node.js 应用程序。
- Node.js 应用程序应接收此 URL 并重定向用户。
然而,这些操作必须是非阻塞的。

我可以想到两种沟通替代方案:
替代方案 1 - 当前端用户通过 POST 请求付款时,node.js 应用程序调用特定的工作程序(也通过 POST),并将付款数据作为有效负载。 Worker 处理数据,请求支付 API 并获取支付 URL。同时,node.js 对工作线程状态进行轮询,并在收到“已完成”状态时重定向用户。
谬误:对我来说,这里的困难是以异步方式执行持续轮询。由于我需要将用户重定向到付款 URL,因此我需要在“app.post('/form', function(req,res) {”方法中包含 URL,这样我就可以响应 (“res ") 来重定向用户。 为此,我查看了 async.whilst(test, fn, callback),但我不知道如何使用同步的测试函数。我的直接想法是一个发出状态请求的测试函数和一个重定向用户的回调函数。然而,这个测试函数是一个异步操作(例如使用“请求”模块)。

替代方案 2 - 工作人员还接收付款数据作为有效负载、处理数据、请求付款 API 并获取付款 URL。完成后,它会通过 HTTP 请求将 URL 传回 Node.js 应用程序。
谬论:我如何将传回 Node.js 应用程序的 URL 与请求付款的用户联系起来?根据我的理解,带有支付 URL 的 HTTP 请求将具有比表单 POST 路由独立的路由。换句话说,这样我就无法在“app.post('/orderform', function(req,res) {”方法中包含付款URL,因此无法使用响应变量(“res”)重定向用户。

node.js 应用程序的结构如下:

app.post('/order', function(req, res) {  
    // user data on req.body
    // process data and request payment API  
    // Wait until URL is communicated to the endpoint belo '/url'
    // receive URL from the other endpoint and redirect user
}

app.post('/url', function(req, res) {  
    // receive payment URL on req.body
    // communicate the URL to the '/order/ endpoint    
}

在这种情况下会推荐什么?

提前致谢。

最佳答案

我建议使用像 pubnub 这样的服务( http://www.pubnub.com/ )。当您收到来自用户的请求时,将其添加到队列中进行处理,并创建并返回一个 token 来标识该工作请求。将该 token 发送回客户端。使用该 token 作为要收听的 pubnub channel 。当工作人员完成后,向同一 token 发送一条消息,让客户端知道工作已完成。

关于node.js - Node.js 应用程序与 IronWorker 上的工作线程之间的通信。如何正确轮询任务状态并接收任务响应?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20851984/

相关文章:

javascript - 读取长文件并使用nodejs加密

node.js - Angular 2 RC 使用 Express 服务器而不是 Lite 服务器

javascript - Express 中间件 : ERROR: TypeError: Converting circular structure to JSON

javascript - 使用 JavaScript/nodejs 计算目录中的文件数?

javascript - 如何导入使用npm安装的vue插件

javascript - 努力在 for 循环中等待

python - 如何将所有 URL 以 "www"开头的请求重定向到裸域?

ruby-on-rails - 无法在 Heroku 上为我的 Rails 应用程序提供种子文件

CSS 布局差异(在 Octopress 上使用 Twitter Bootstrap)

javascript - 使用 MongoDB、Express、Node.Js 和 GridFS-stream 存储视频和图片文件