python - 通过 Web 应用程序处理作业 : real-time status updates and backend messaging

标签 python web-applications websocket messaging zeromq

我想实现一个(开源)网络应用程序,用户通过他的浏览器向 Python 网络应用程序发送某种请求。请求数据用于定义和提交某种繁重的计算作业。计算工作外包给“ worker 后端”(也是 Python)。在作业处理过程中,作业会随着时间的推移经历不同的阶段(理想情况下从中间状态的“已提交”到“完成”)。我想完成的是实时向用户显示当前的作业状态。这意味着工作后端必须将作业状态传回 Web 应用程序。然后,Web 应用程序必须将信息推送到用户的浏览器。我为您带来了一张图片,示意性地描述了基本思想: schematic problem description

红色圆圈中的数字表示事件的时间顺序。 “web app”和“worker backend”还有待设计。现在,如果您能帮助我做出一些技术决策,我将不胜感激。

我的问题,特别是:

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

  2. 我应该使用哪种技术将信息推送到浏览器? 出于完美主义,我想要实时更新。我不想以高频率进行轮询。当工作后端发出消息时,我想立即推送到客户端:-)。另外,我不需要最大的浏览器支持。这个项目首先或多或少是我自己的一个技术演示。我应该选择 HTML5 服务器发送的事件/websockets 吗?或者您会推荐其他方式吗?

非常感谢您提前提出建议。

最佳答案

一个选项是使用 WebSocket。如果你走那条路,你可能会看看 Autobahn ,其中包括用于 Python (Twisted) 的客户端和服务器,以及基于 WebSocket 的 RPC+PubSub 协议(protocol)(带有用于 Python、JavaScript 和 Android 的库)。使用 RPC+PubSub 订阅可以保护重要工作,并且可能满足您的需求(作业提交 => RPC,作业工作更新 => PubSub)。

AutobahnPython 在 Twisted 上运行,它还可以充当 WSGI 容器,从而可以运行 Flask(或其他基于 WSGI 的 Web 框架)。您可以在 1 个端口/服务器上运行所有内容。 GitHub Autobahn 存储库上有一个针对后者的示例。

免责声明:我是 Autobahn 和 WAMP 的原作者,并为 Tavendo 工作。

详细信息: 我假设您的工作人员执行 CPU 密集型和/或阻塞任务。

首先,您的 worker 是纯 Python 还是外部程序?

如果是后者,您可以使用 Twisted 进程协议(protocol)实例,这些实例通过 stdio 管道(以非阻塞方式)从主 Twisted 线程进行通信。如果是前者,您可以使用 Twisted 后台线程池并使用 Twisted deferToThread(参见:http://twistedmatrix.com/documents/current/core/howto/threading.html)。

Autobahn 在主 Twisted reactor 线程上运行。如果您的工作人员也这样做(请参阅之前的评论),那么您可以直接调用 WebSocket/WAMP 工厂/协议(protocol)实例上的方法。如果不是(worker 在后台线程上运行),您应该通过 callFromThread 调用这些方法。

如果您使用 WAMP,主要的事情是为每个工作人员获取 WampServerFactory 的引用。工作人员然后可以通过调用适当的工厂方法向所有订阅者发送 PubSub 事件。

关于python - 通过 Web 应用程序处理作业 : real-time status updates and backend messaging,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12733985/

相关文章:

java - 在jsp中显示数组值

http - 只有通过 https 的 uname/pwd 验证 - http 中的所有其他内容

javascript - 无效的帧头

python - scrapy - 项目加载器 - 默认处理器

python - Windows错误: [Error 5] Access is denied using boto/python

python - scikit-learn:SVM 给我零错误,但无法预测

javascript - webSocket 握手期间出错意外响应代码 : 400

python - 在 Windows 上使用鼠标、键盘和语音检测事件

java - 检查用户登录情况

c# - Websocket 服务器,客户端无法握手