在IronWorker上node.js应用程序和worker之间的通信。 如何正确轮询任务状态并接收任务响应?

申请如下:

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

res.redirect(307, url);

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

为了使事情更清楚: – 用户提交付款表格。
– node.js应用程序处理POST数据并调用一个worker(“在一个worker上排队”一个任务)。
– 工作人员请求一个外部支付API,它返回一个URL。
– 工作人员应该将这个URL传回给node.js应用程序。
– node.js应用程序应该收到这个URL并redirect用户。
但是,这些操作必须是非阻塞的。

我可以想到通讯的两种select:
备选scheme1 – 当前端用户通过POST请求付款时,node.js应用程序将(通过POST)调用特定的工作人员,付款数据作为有效负载。 工作人员处理数据,请求付款API并获取付款URL。 同时,node.js执行对工作人员状态的轮询,并在接收到“完成”状态时redirect用户。
谬误:这里的困难是以asynchronous的方式进行不间断的轮询。 因为我需要将用户redirect到付款url,所以我需要在“app.post('/ form',function(req,res){”方法,这样我可以将响应(“res “)来redirect用户,为此,我看了一下async.whilst(test,fn,callback),但是我不知道如何使用同步的testing函数,我的直接想法是testing函数发出状态请求和redirect用户的callback函数,但是这个testing函数是一个asynchronous操作(例如使用'request'模块)。

scheme2 – 工作人员还接收付款数据作为有效负载,处理数据,请求付款API并获取付款URL。 完成后,它通过HTTP请求将URL传回给node.js应用程序。
谬论:我如何将传递回node.js应用程序的URL绑定到请求付款的用户? 在我的理解中,具有付款URL的HTTP请求将具有比POST路由forms更独立的路由。 换句话说,这样我就不能在“app.post('/ orderform',function(req,res){”方法,因此将不能使用响应variables(“res”)redirect用户。

Tha 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 } 

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

提前致谢。

我build议使用像pubnub这样的服务( http://www.pubnub.com/ )。 当你从用户那里得到一个请求时,添加到队列中来处理它,并创build并返回一个令牌来标识这个工作请求。 将该令牌发送回客户端。 使用该标记作为pubnub频道进行监听。 当工人结束时,发送一个消息给同一个标记,让客户知道工作已经完成。

我build议在这两个select之间使用一些东西。

  1. 您收到来自用户和队列工作人员的处理请求。
  2. 您开始轮询一些内部存储(如数据库)的请求的结果。
  3. 当工作人员需要存储结果时,它将callback将数据存储在本地存储(即轮询操作查找的地方)的应用程序(不同端点)。
  4. 当数据可用时,您将能够redirect用户。