我最喜欢 Google 的任务队列的特点之一是它的简单性。更具体地说,我喜欢它接受一个 URL 和一些参数,然后在任务队列准备好执行任务时发布到该 URL。
这种结构意味着任务总是执行最新版本的代码。相反,我的 gearman 工作人员都在我的 django 项目中运行代码——所以当我实时推送新版本时,我必须杀死旧工作人员并运行一个新工作人员,以便它使用当前版本的代码。
我的目标是让任务队列独立于代码库,这样我就可以在不重新启动任何工作人员的情况下推送新的实时版本。所以,我开始思考:为什么不让任务像谷歌应用引擎任务队列一样通过 url 执行?
该过程将像这样工作:
- 用户请求进来并触发了一些不应阻塞的任务。
- 每个任务都有一个唯一的 URL,因此我将一个 gearman 任务排入队列以 POST 到指定的 URL。
- gearman 服务器找到一个 worker,将 url 和 post 数据传递给一个 worker
- 工作人员只需将数据发布到 url,从而执行任务。
假设如下:
- 来自 gearman worker 的每个请求都以某种方式签名,以便我们知道它来自 gearman 服务器而不是恶意请求。
- 任务被限制在 10 秒内运行(不会有可能超时的长任务)
这种方法的潜在缺陷是什么?这是我担心的一个:
- 服务器可能会同时受到许多由先前请求触发的请求的冲击。因此,一个用户请求可能需要 10 个并发 http 请求。我想我可以在每次请求限速之前让一个工作人员睡觉。
有什么想法吗?