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

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

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

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

我的目标是让任务队列独立于代码库,这样我就可以在不重启任何工作程序的情况下推送新的实时版本。所以,我开始思考:为什么不像 google app engine 任务队列那样让任务可以通过 url 执行?

这个过程是这样的:

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

假设如下:

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

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

  • 服务器可能会同时受到大量请求的攻击,这些请求是由先前的请求触发的。因此,一个用户请求可能需要 10 个并发的 http 请求。我想我可以让一个 worker 在每次请求速率限制之前 sleep 。

有什么想法吗?

最佳答案

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

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

  2. 队列应该是身经百战的,而且速度很快。查看RabbitMQ使用 AMQP 协议(protocol)在 Erlang 中实现出色的队列。

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

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

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

关于django - 使用 Gearman 模拟 Google Appengine 的任务队列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2413907/

相关文章:

java - 从队列接收消息数量

google-app-engine - 谷歌应用引擎 "no module named requests"PyDev

azure - 重新提交死信队列中的消息 - Azure 服务总线

python - 数据库中缺少字段但存在于 Django 模型中

python - Django一对一字段RelatedObjectDoesNotExist

google-app-engine - Google Datastore Transactions 乐观并发控制与否?

java - Google App Engine 中的单例可能会过期,或者任何静态变量都会过期吗? ( java )

java - Java/Grails 环境中用户通知的最佳解决方案架构?

python - ** Django 中的额外字段参数

python - 请求的 session 在请求完成之前被删除。例如,用户可能已在并发请求中注销