我最喜欢Google的任务队列的一个特点是它的简单性。更具体地说,我喜欢它需要一个URL和一些参数,然后在任务队列准备好执行任务时发布到该URL。
此结构意味着任务始终执行最新版本的代码。相反,我的齿轮工人都在我的django项目中运行代码 - 所以当我推送新版本时,我必须杀死旧工作者并运行一个新工具,以便它使用当前版本的代码。
我的目标是让任务队列独立于代码库,以便我可以在不重新启动任何工作人员的情况下推送新的实时版本。所以,我开始思考:为什么不像url app引擎任务队列那样使用url执行任务?
这个过程会像这样工作:
假设如下:
这种方法有哪些潜在的缺陷?这是让我担心的问题:
有什么想法吗?
答案 0 :(得分:4)
作为Django和Google AppEngine的用户,我当然可以欣赏你所获得的。在工作中,我正在使用一些非常酷的开源工具来完成相同的场景。
看看Celery。它是一个使用Python构建的分布式任务队列,它公开了三个概念 - 一个队列,一组工作者和一个结果存储。它可以插入每个部件的不同工具。
队列应该是战斗硬化的,而且速度很快。使用AMQP协议在Erlang中查看RabbitMQ是否有一个很棒的队列实现。
工作者最终可以是Python函数。您可以使用队列消息触发工作人员,或者可能与您描述的内容更相关 - 使用 webhooks
查看Celery webhook文档。使用所有这些工具,您可以构建一个生产就绪的分布式任务队列,以实现上述要求。
我还应该提一下,关于你的第一个陷阱,芹菜使用Token Bucket算法实现任务的速率限制。