14

假设我有 2 台服务器。

第一个是提供一些计算的服务,可以持续很长时间(几分钟到几小时)。

第二台服务器将使用此服务来计算一些数据。

我正在尝试为第一台服务器设计一个 REST API,到目前为止一切都很好。但我想听听一些关于如何在长期任务完成后对通知建模的意见。

到目前为止,我考虑了两种方法:

  1. 轮询 - 第二台服务器将不时询问结果。
  2. 回调 - 第二台服务器将为第一个服务器设置一个 uri,以便在完成后调用。但这在 REST API 中有点味道。

你怎么看?

4

3 回答 3

7

对于您的情况,我会选择投票。当第二台服务器发出在第一台服务器上创建作业的初始请求时,它应该得到一个包含最终状态页面 url 的响应。然后,第二台服务器每 5-15 分钟轮询一次该 url 以检查作业的状态。如果第一台服务器将该 url 设为 RSS 或 Atom 提要,那么用户也可以将其 RSS 阅读器指向相同的 url,并自行判断工作是否完成。当人和机器都可以从单一来源获取信息时,这是一个真正的胜利。

于 2010-09-07T00:05:36.957 回答
4

除了我已经在这个类似的问题中回答的内容之外,我建议使用 Atom 发布协议进行通知(您可以发布到您的第二台服务器)。

于 2010-09-06T15:46:36.423 回答
1

如果你使用 Python,你可以利用 RabbitMQ 和 Celery 来完成这项工作。Celery 允许您在队列中创建一个项目,然后暂停执行您正在运行的任何项目(即:Django),这样您就可以在队列处理器的输出可用时使用它。无需轮询或回调。

于 2010-09-06T15:36:00.363 回答