长连接HTTP服务器(Python)
我正在设计一个网络应用程序,目的是处理来自不同异步流程的大量大文件,这些文件可能是混合媒体文件。每个流程可能需要几分钟才能完成。
这些文件要么通过POST请求上传,要么根据提供的源URL由网络服务器拉取。文件可以通过多种外部工具进行处理,处理方式可以是同步的也可以是异步的。
我需要能够对这个应用进行负载均衡,这样我就可以同时处理多个大文件,尽可能多地扩展处理能力。
我觉得Python是这个项目的最佳选择,但除此之外,我对任何解决方案都持开放态度。这个应用可以将文件直接返回,或者依靠消息通道通知客户端处理完成。
我考虑过的一些方法:
1) 使用像Tornado这样的非阻塞网络服务器,它会保持连接直到文件处理完成。外部处理命令会被启动,网络服务器会等待文件准备好,然后将结果直接传回给返回它的网络应用。由于发送请求的流程是异步的,它们可能会耐心等待(除非出现内存或其他问题)。
2) 使用像Cherrypy这样的常规网络服务器(我对这个更有信心),让网络应用通过消息通道报告处理进度。网络服务器在收到文件后,会立即返回HTTP响应,验证文件并将其发送到后台处理。与此同时,它会发送一条消息通知处理开始。后台处理会负责将文件送到一个可用的位置,并发送另一条消息到通道,通知新文件的位置。这个方案看起来比第一种更灵活,但需要编写一个单独的脚本来处理网络应用外的消息,以及为临时文件提供一个单独的存储空间,这些临时文件需要在某个时点清理。
3) 使用上述任何网络服务器的内部消息功能,我对此不太熟悉……
编辑:像CherryPy的发布-订阅引擎(http://cherrypy.readthedocs.org/en/latest/extend.html?highlight=messaging#publish-subscribe-pattern)可能是一个不错的解决方案。
有什么建议吗?
谢谢,
gm
1 个回答
我遇到过类似的情况,涉及到我们团队实现的一个大规模数据处理引擎。我们想在Flask中构建API调用,有些调用可能需要几个小时才能完成,但我们希望能实时通知用户发生了什么。
简单来说,我想到的解决方案就是你提到的第二种选择。在我用Apache提供Flask应用的同一台机器上,我创建了一个Tornado应用,它通过WebSocket向最终用户报告进度。一旦我的主页面加载完成,它就会与Tornado服务器建立WebSocket连接,Flask应用会定期向Tornado应用发送更新,然后再传递给最终用户。即使在长时间运行的应用过程中关闭了浏览器,Apache仍然会保持请求的活跃和处理,等我重新登录后,仍然可以看到当前的进度。
我在这里详细写了这个解决方案:
http://jonfeatherstone.com/2013/08/01/mongo-and-websockets-for-application-logging/
祝好运!