更新芹菜任务已完成的客户端

时间:2015-11-26 09:57:52

标签: python flask celery

我有以下要求。我正在创建一个将接收发布和获取请求的Web应用程序(无前端)。它的功能如下。客户端将在URL上发布一个帖子,触发大量且耗时的任务。客户还可以发出Get请求并检索tak的结果。

我正在考虑使用Celery来启动任务。任务是一个非常大的算术计算。我的问题是如何通知客户他触发的任务已经完成,他可以检索结果。

所以我这样想:

client ->posts to web app -> web app starts task to celery -> request closed

web app notifies -> client triggered task  # what is the proper way

client -> get request to web app -> web app returns result

我知道没有一个正确的方法,所以我'会更具体一点。暂时,任务将由另一个烧瓶应用程序自动触发。是否有一种方法可以自动通知烧瓶应用程序任务已完成并获取结果并将其存储在自己的数据库中?第二个问题是什么是最通用的解决方案,即使客户端是烧瓶应用程序,Android应用程序和IOS应用程序等也可以工作。

我之所以提出这个问题的原因是因为我讨论了api将结果发回给客户或客户是否应负责检查并获得结果。

1 个答案:

答案 0 :(得分:8)

我过去不得不做出类似的决定,客户需要在完成长期运行的芹菜任务后更新。设计系统有许多不同的方法来解决问题:

  1. 有轮询的状态端点 - 这是最简单的解决方案。在flask中暴露一个端点,它返回一个作业的状态,只需从客户端轮询。但是,有几点需要注意,即客户数量和投票频率。如果您拥有太多客户端或过于频繁地轮询,则可能会遇到性能问题。如果您有一些客户并且不需要即时状态更新,这是理想的选择。
  2. WebSockets - 在客户端和烧瓶服务器之间打开一个WebSocket,并在任务完成时使用它来推送更新。这种方法可以更好地扩展到多个客户端,并允许近乎即时的通知。
  3. 回调网址 - 您提到客户端是Flask应用。您可以在客户端服务器上公开回调路由,并在启动任务时将其提供给芹菜。任务完成后,Celery可以POST到回调URL,这将通知客户端。
  4. 对于最通用的解决方案,可能是状态端点或WebSockets - Android& iOS内置了HTTP功能,可以使用库处理WebSockets。另一方面,回调URL解决方案特定于Flask。