如何使expressjs像facebook一样支持批量请求

我有一套不同方法的路线。 我想让expressjs支持与Facebook, Facebook Batch Request非常相似的批量请求 。 有人知道该怎么做吗? 而我不想让3回送连接处理批处理请求。

如果您不想进行回送连接,那么最简单的解决scheme是使用假请求手动调用您的服务器。

你将不得不重新实现IncomingMessage 。 你也应该使用Async#map来等待所有的请求被处理。

这是基本的想法:

 //您可能需要做更多的工作来重新实现http基本API。
函数FakeRequest(request){
   this.url ='/'+ request.relative_url;
   this.method = request.method;
   this.headers = request.headers;
 }

函数FakeResponse(){
   Stream.call(本);

   this.statusCode = null;
   this.body ='';
 }

 FakeResponse.prototype.write = function(chunk){
   this.body + = chunk.toString('utf8');

  返回true;
 };

 util.inherits(FakeResponse,Stream);

 app.post('/',function(req,res){
   var requests = JSON.parse(req.body.batch);

   async.map(requests,function(request,done){
     var fakeReq = new FakeRequest(request),
         fakeRes = new FakeResponse();

     //手动调用Express“中间件
    应用程序(fakeReq,fakeRes);

     //当响应准备就绪时会触发。
     fakeRes.once('end',function(){
       //不要泄漏听众
       fakeRes.removeAllListeners();
      完成(null,fakeRes);
     });

     fakeRes.once('error',function(err){
       fakeRes.removeAllListeners();
       DONE(ERR);
     });
   },函数(err,responses){
    如果(err)
      返回res.send(err);

     res.send(响应);
   });
 });

 http.createServer(app).listen(app.get('port'),function(){
   console.log('Express server listen on port'+ app.get('port'));
 });

UPDATE

实际上我不确定你的回环是什么意思,但是你有两个select:

  • 为批处理中的每个请求打开一个HTTP连接,这比较容易实现,但速度较慢。

  • 上面概述的解决scheme:直接调用Express中间件而不打开HTTP请求。

我的印象是,你不想要第一个解决scheme。 不过,那就是我会先试一下,即使速度较慢:

  • 在缩放时,更容易将批量连接分散到多个实例中。
  • 您不会绕过您可能具有的任何负载调节机制(这会阻止单个Express实例同时处理太多的请求)。

一定要禁用HTTP代理 。