【问题标题】:Simulating Google Appengine's Task Queue with Gearman用 Gearman 模拟 Google Appengine 的任务队列
【发布时间】:2011-01-25 17:08:54
【问题描述】:

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

这种结构意味着任务总是执行最新版本的代码。相反,我的 gearman 工作人员都在我的 django 项目中运行代码——所以当我实时推送新版本时,我必须杀死旧工作人员并运行一个新工作人员,以便它使用当前版本的代码。

我的目标是让任务队列独立于代码库,这样我就可以推送新的实时版本而无需重新启动任何工作人员。所以,我开始思考:为什么不让任务像谷歌应用引擎任务队列一样通过 url 执行?

流程如下:

  1. 用户请求进入并触发了一些不应阻塞的任务。
  2. 每个任务都有一个唯一的 URL,因此我将一个 gearman 任务排入队列以 POST 到指定的 URL。
  3. gearman 服务器找到一个 worker,将 url 传递给 worker
  4. worker 只需将数据发布到 url,从而执行任务。

假设如下:

  1. 来自 gearman 工作器的每个请求都以某种方式签名,以便我们知道它来自 gearman 服务器,而不是恶意请求。
  2. 任务被限制在 10 秒内运行(不会有可能超时的长任务)

这种方法的潜在缺陷是什么?让我担心的是:

  • 服务器可能会同时受到许多由先前请求触发的请求的影响。因此,一个用户请求可能需要 10 个并发 http 请求。我想我可以在每次请求限速之前让一个工作人员睡觉。

有什么想法吗?

【问题讨论】:

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


    【解决方案1】:

    作为 Django 和 Google AppEngine 的用户,我当然可以理解您的理解。在工作中,我目前正在使用一些非常酷的开源工具处理完全相同的场景。

    1. 看看Celery。它是一个用 Python 构建的分布式任务队列,它公开了三个概念——队列、一组工作人员和一个结果存储。每个部分都可以使用不同的工具进行插拔。

    2. 队列应该是久经沙场的,而且速度很快。查看 RabbitMQ 了解 Erlang 中使用 AMQP 协议的出色队列实现。

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

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

    我还应该提到,关于您的第一个陷阱,celery 使用Token Bucket 算法实现了任务的速率限制。

    【讨论】:

      猜你喜欢
      • 2017-04-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多