Python框架也是蜜罐!
因此你开始使用Bottle框架、Falcon框架或Flask框架…并且你会发现自己需要安装任务队列和调度模块(例如, Celery、RQ )。为什么需要呢?因为,在web2.0中超过500ms的每一次请求都必须是有状态的(stateful)!这是一个不成文的规定。你需要给用户提供一些长时间等待请求的状态。而不能让客户在计算过程中一直等待。你需要把发送邮件、转换图片一类的沉重负担放置在Celery框架中(或者自己定制开发的多进程队列)。又有什么问题呢?我们来看看:
假设你有一个流媒体服务。客户要上传20Gb的4K raw视频文件,你把文件转换成10个不同的分辨率并给他(她)发邮件说结果已准备好。
你使用有40个工作者(workers)的celery框架。视频开始转换,服务器变得超载,越来越慢。这时你会找到一个巧妙的解决办法!安装另一个带有流媒体代码和工具的服务器,使用Celery作为一个工作者。好了,问题得以解决!不!没有那么快!到了半夜,你会发现其中有5个或6个服务器的CPU利用率为0,而第6个却达到100%。为什么呢?事实证明Redis和Celery一起使用时有时序的问题,目的是防止工作者挑拣工作。(有一个很显然的解决方案:欢迎来到扇出模式和能见度超时的世界),安装 RabbitMQ可以解决问题(还会产生另外一些新的奇怪的问题)。(如果你开发了这样一个系统,它不存在任何所提及的问题,那么恭喜你!你是世界上最幸运的家伙!)。你找到了蜂蜜却没有被蜜蜂叮咬。