我正在尝试设计一个Web应用程序来处理来自异步进程的大量大型混合媒体文件。每个过程可能需要几分钟。
文件可以作为POST正文上传,也可以根据提供的源URL由Web服务器提取。这些文件可以通过各种外部工具以同步或异步方式处理。
我需要能够对此应用程序进行负载平衡,这样我就可以同时处理多个大文件,因为我可以负担得起扩展。
我认为Python是这个项目的最佳选择,但除此之外,我对任何解决方案持开放态度。应用程序可以传回文件或依赖消息传递通道来通知客户端进程完成情况。
我认为可以使用的一些方法:
1)使用非阻塞的Web服务器(如Tornado)保持连接打开,直到文件处理完成。启动外部处理命令,Web服务器等待,直到文件准备就绪,并将生成的IO流直接传送回返回它的Web应用程序。由于发送请求的进程是异步的,因此它们可能会等待(除非出现内存或其他一些问题)。
2)使用像Cherrypy这样的常规Web服务器(我更有信心)并让webapp使用消息传递通道来报告处理进度。 Web服务器在收到文件后立即返回HTTP响应,验证它并将其发送到后台进程。同时它发送一条消息通知进程启动。然后,后台进程负责将文件传递到可用位置,并向通道发送另一条消息,通知新文件的位置。此解决方案看起来比1)更灵活,但需要编写单独的脚本来处理Web应用程序外部的消息,以及为必须在某一点清理的临时文件创建单独的存储空间。
3)使用上面提到的任何webserve的一些内部消息传递功能,我不熟悉...
编辑:像CherryPy的pub-sub引擎(http://cherrypy.readthedocs.org/en/latest/extend.html?highlight=messaging#publish-subscribe-pattern)这样的东西可能是一个很好的解决方案。
有什么建议吗?
谢谢,
克
答案 0 :(得分:1)
我遇到了类似的情况,我的团队实施了一个非常大规模的数据处理引擎。我们想在Flask中构建我们的api调用,其中一些可能需要很长时间才能完成,但是有办法实时通知用户发生了什么。
基本上我提出的是你所描述的选项2.在我通过apache服务烧瓶应用程序的同一台机器上,我创建了一个龙卷风应用程序,它提供了一个向最终用户报告进度的websocket。一旦我的主页面被提供,它就建立了与龙卷风服务器的websocket连接,并且烧瓶应用程序定期向龙卷风应用程序发送更新,并向下发送给最终用户。即使浏览器在长时间运行的应用程序期间关闭,apache也会保持请求处于活动状态并进行处理,并且在重新登录后,我仍然可以看到当前的进度。
我在这里更详细地写了这个解决方案:
http://jonfeatherstone.com/2013/08/01/mongo-and-websockets-for-application-logging/
祝你好运!