这是一个大脑问题,可以提供哪些方案可以更智能地解决服务器端繁重情况,但为用户提供响应式用户界面的建议。
设置; 我的系统由两个服务组成(以节点编写);一个前端服务,用于监听来自用户和背景工作者的请求,这些服务执行繁重并且不会在1-2秒内完成(例如视频转换,图像大小调整,gzipping,蜘蛛等)。用户通过WebSockets(和正常的POST请求)连接到前端服务。
场景1; 当用户例如。上传视频,前端服务只进行一些简单的检查,以用户的名义创建一个作业,供后台工作者处理,并直接以状态200响应。稍后工作人员看到它的工作,完成工作并完成工作。然后它找到用户连接的套接字(如果有的话)并发送“嘿,作业完成”,其中包含与视频转换作业相关的数据(网址,长度,比特率等)。
场景2; 与场景1类似,但前端服务不响应状态200,而是订阅创建的作业“onComplete”事件,并让Request悬挂直到回调被触发,数据可以通过管道发送给用户。
在写这个问题的时候,事情变得越来越清晰(方案1,但是发送了聪明的成功和更新事件)。无论如何,我想了解您使用的其他方案或进一步的优点/缺点我的方案!?
感谢您帮助我!
一些不必要的信息;对于websockets,我使用的是socket.io,用于创建kue和pub / sub redis的作业
答案 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已接受请求处理,但是 处理尚未完成。请求可能会也可能不会 最终会被采取行动,因为处理时可能会被禁止 实际上发生了。
这使得大门敞开,可能会发生工人错误。你只是说你接受了这个请求,并试图用它做点什么。