为长期任务创建REST API的最佳方法?

时间:2010-09-06 15:33:00

标签: rest callback api-design

假设我有2台服务器。

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

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

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

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

  1. 轮询 - 第二台服务器会不时询问结果。
  2. 回调 - 第二个服务器将为第一个服务器设置一个uri,以便在完成后调用。但这在REST API中有点含糊。
  3. 您怎么看?

3 个答案:

答案 0 :(得分:7)

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

答案 1 :(得分:4)

already answered中我this similar question之外,我建议使用Atom发布协议进行通知(您可以发布到第二台服务器)。

答案 2 :(得分:1)

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