通过Web应用程序处理作业:实时状态更新和后端消息传递

Jan*_*cke 9 python messaging web-applications zeromq websocket

我想实现一个(开源)Web应用程序,用户通过他的浏览器向Python Web应用程序发送某种请求.请求数据用于定义和提交某种繁重的计算工作.计算工作外包给"工作人员后端"(也称为Python).在作业处理期间,作业会随着时间的推移经历不同的阶段(从"提交"到中间状态到"完成",理想情况).我想要实现的是实时向用户显示当前的作业状态.这意味着工作者后端必须将作业状态传递回Web应用程序.然后,Web应用程序必须将信息推送到用户的浏览器.我给你带了一张图片,示意性地描述了基本的想法: 示意图问题描述

红色圆圈中的数字表示事件的时间顺序."web app"和"worker backend"仍有待设计.现在,如果您可以帮助我做出一些技术决定,我将不胜感激.

我的问题,特别是:

  1. 我应该在Web应用程序和工作人员后端之间应用哪种消息传递技术? 当工作人员后端发出关于某个作业的信号(某种消息)时,它必须在Web应用程序中触发某个事件.因此,我需要某种与最初请求作业提交的客户端相关联的回调.我想我需要一些pub/sub机制,工作者后端发布,Web应用程序订阅.当Web应用程序收到消息时,它会通过向客户端发送状态更新来对其做出反应.我希望工作者后端可以扩展并与Web应用程序强烈分离.因此,我正在考虑使用Redis或ZeroMQ来完成这项任务.你怎么看?我的整个方法有点过于复杂吗?

  2. 我应该使用哪种技术将信息推送到浏览器? 出于完美主义,我希望得到实时更新.我不想以高频率进行民意调查.当工作人员后端发出消息时,我希望立即推送到客户端:-).此外,我不需要最大的浏览器支持.这个项目首先或多或少是我自己的技术.我应该去HTML5服务器发送的事件/ websockets吗?或者你会推荐否则?

非常感谢您提前提出的建议.

g19*_*tic 3

为了发挥任何作用,您的 Web 应用程序将拥有一个数据库。我会在该数据库中创建一个专门用于这些作业的表。每项工作都有一个“状态”。

这简化了您的系统,因为您只需发送启动作业的请求并将其移交给后端工作人员(在我看来,zmq 是一个很好的解决方案)。由于您使用 python 作为后端,因此让您的工作人员作业更新数据库中当前的工作作业或让另一个“更新程序”唯一的工作是更新数据库中的字段(保持逻辑独立)是非常简单的将提供更好的解决方案,如果您正在进行大量更新,则允许您启动多个“更新程序”)

然后对于您的前端,由于您不想轮询服务器,所以我会做一些“长轮询”。您本质上所做的是轮询服务器,但服务器永远不会真正“响应”,直到您感兴趣的数据发生变化。一旦发生变化,您就响应请求。在前端,您的 JS 在收到最新更新后立即重新建立连接。只要您使用跨浏览器的 JS 框架(我建议使用 jQuery),这个解决方案就是跨浏览器兼容的。


要消除 Web 应用程序数据库轮询,请执行以下操作:

使初始请求成为对 Web 应用程序的长轮询请求,Web 应用程序向后端发送 zmq 消息(可能需要使用 REQ/REP 套接字完成)并等待。它会等待,直到从 zmq 后端收到状态更改的消息。当它发生状态更改时,它会用更改响应前端。此时,前端将发送一个新的长轮询请求(该作业的当前 id 可以是其身份),并且 Web 应用程序将重新连接到后端并等待另一个状态更改。实现此功能的技巧是ZMQ_IDENTITY在最初创建套接字时(在第一个请求中)使用 ZMQ 作为套接字。这将允许 Web 应用程序重新连接到同一后端套接字并获取新的更新。当后端有新的更新要发送时,它将向 Web 应用程序发出信号,而 Web 应用程序将通过其状态更改来响应长轮询请求。这样就没有polling后端数据库,一切都是由后端工作人员的事件驱动的。

我会设置某种看门狗,如果前端消失(切换页面或关闭浏览器),后端套接字将正确关闭。当状态改变时,它们不需要无限期地阻塞。