2015-11-26 31 views
4

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

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

所以我想这样的:

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将结果发回给客户或客户应负责检查并获得结果。

回答

5

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

  1. 状态端点与轮询 - 这是最简单的解决方案。在烧瓶中公开一个终点,它返回一个工作的状态,并简单地从客户端轮询。然而,有几点需要注意,即客户数量和投票频率。如果您的客户太多或轮询频率过高,则可能会遇到性能问题。如果你有几个客户,并且不需要即时的状态更新,这是理想的。
  2. WebSockets - 打开客户端和服务器之间的WebSocket,并使用它在您的任务完成时推送更新。这种方法可以更好地满足多个客户的需求,并且可以提供近乎即时的通知
  3. 回调URL - 您提到客户端是Flask应用程序。您可以在客户端服务器上公开一个回调路由,并在启动任务时将其提供给芹菜。任务完成后,Celery可以POST到回调URL,并通知客户端。

至于最通用的解决方案,这将是两种状态端点或WebSockets的 - Android电子&的iOS内置有断点续传功能,并且可以使用库处理的WebSockets。另一方面,回调URL解决方案特定于Flask。