使用Gearman模拟Google Appengine的任务队列

时间:2010-03-10 01:28:46

标签: django google-app-engine message-queue gearman

我最喜欢Google的任务队列的一个特点是它的简单性。更具体地说,我喜欢它需要一个URL和一些参数,然后在任务队列准备好执行任务时发布到该URL。

此结构意味着任务始终执行最新版本的代码。相反,我的齿轮工人都在我的django项目中运行代码 - 所以当我推送新版本时,我必须杀死旧工作者并运行一个新工具,以便它使用当前版本的代码。

我的目标是让任务队列独立于代码库,以便我可以在不重新启动任何工作人员的情况下推送新的实时版本。所以,我开始思考:为什么不像url app引擎任务队列那样使用url执行任务?

这个过程会像这样工作:

  1. 用户请求进入并触发一些不应阻止的任务。
  2. 每个任务都有一个唯一的URL,因此我将一个gearman任务排队到POST到指定的URL。
  3. gearman服务器找到一名工人,传递网址并将数据发布给工作人员
  4. 工作人员只需使用数据发布到网址,从而执行任务。
  5. 假设如下:

    1. 齿轮工人的每一个请求都以某种方式签名,以便我们知道它来自一个齿轮服务器,而不是恶意请求。
    2. 任务仅限于在不到10秒的时间内运行(没有可能超时的长任务)
    3. 这种方法有哪些潜在的缺陷?这是让我担心的问题:

      • 服务器可能会被前一个请求触发的所有请求同时敲定。因此,一个用户请求可能需要10个并发的http请求。我想在每次提出限速请求之前,我都可以让一个工人睡一觉。

      有什么想法吗?

1 个答案:

答案 0 :(得分:4)

作为Django和Google AppEngine的用户,我当然可以欣赏你所获得的。在工作中,我正在使用一些非常酷的开源工具来完成相同的场景。

  1. 看看Celery。它是一个使用Python构建的分布式任务队列,它公开了三个概念 - 一个队列,一组工作者和一个结果存储。它可以插入每个部件的不同工具。

  2. 队列应该是战斗硬化的,而且速度很快。使用AMQP协议在Erlang中查看RabbitMQ是否有一个很棒的队列实现。

  3. 工作者最终可以是Python函数。您可以使用队列消息触发工作人员,或者可能与您描述的内容更相关 - 使用 webhooks

  4. 查看Celery webhook文档。使用所有这些工具,您可以构建一个生产就绪的分布式任务队列,以实现上述要求。

    我还应该提一下,关于你的第一个陷阱,芹菜使用Token Bucket算法实现任务的速率限制。