如何处理负载较重的请求?

时间:2012-11-20 19:01:20

标签: node.js websocket redis socket.io background-process

这是一个大脑问题,可以提供哪些方案可以更智能地解决服务器端繁重情况,但为用户提供响应式用户界面的建议。

设置; 我的系统由两个服务组成(以节点编写);一个前端服务,用于监听来自用户和背景工作者的请求,这些服务执行繁重并且不会在1-2秒内完成(例如视频转换,图像大小调整,gzipping,蜘蛛等)。用户通过WebSockets(和正常的POST请求)连接到前端服务。

场景1; 当用户例如。上传视频,前端服务只进行一些简单的检查,以用户的名义创建一个作业,供后台工作者处理,并直接以状态200响应。稍后工作人员看到它的工作,完成工作并完成工作。然后它找到用户连接的套接字(如果有的话)并发送“嘿,作业完成”,其中包含与视频转换作业相关的数据(网址,长度,比特率等)。

  • 优点我看到:快速用户反馈成功上传(例如,ProgressBar可以隐藏)
  • 缺点我明白:用户会得到假的“成功”响应,没有数据可以处理/显示,需要等到作业完成。

场景2; 与场景1类似,但前端服务不响应状态200,而是订阅创建的作业“onComplete”事件,并让Request悬挂直到回调被触发,数据可以通过管道发送给用户。

  • 优点我看到:“onSuccess”,所有数据都在用户
  • 缺点我明白:根据作业的重量和活动作业数,用户请求可以超时

在写这个问题的时候,事情变得越来越清晰(方案1,但是发送了聪明的成功和更新事件)。无论如何,我想了解您使用的其他方案或进一步的优点/缺点我的方案!?

感谢您帮助我!

一些不必要的信息;对于websockets,我使用的是socket.io,用于创建kue和pub / sub redis的作业

2 个答案:

答案 0 :(得分:1)

我刚刚写了这样的东西,我用两种方法来做不同的事情。场景1最有意义的是IMO,因为它最符合现实,然后可以最准确地传达给用户。通过首先响应200“是的,我得到了请求并按照您的要求创建了'作业'”,然后您可以准确地更新UI以反映正在处理请求。然后,您可以使用推送通道根据需要通知用户更新,例如进度百分比,错误和成功,但没有UI“挂起”(显然,您不会在方案2中挂起UI,但事情就是尴尬的情况正在发生,用户界面只需要“猜测”正在处理作业。

答案 1 :(得分:0)

场景1 - 但您应该使用200 OK回复,而不是使用202 Accepted回复。来自维基百科: https://en.wikipedia.org/wiki/List_of_HTTP_status_codes

  

202 Accepted已接受请求处理,但是   处理尚未完成。请求可能会也可能不会   最终会被采取行动,因为处理时可能会被禁止   实际上发生了。

这使得大门敞开,可能会发生工人错误。你只是说你接受了这个请求,并试图用它做点什么。