为持久任务创建 REST API 的最佳方法?

发布于 2024-09-17 21:09:52 字数 315 浏览 7 评论 0 原文

假设我有 2 台服务器。

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

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

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

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

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

你怎么认为?

Suppose I have 2 servers.

The first is a service that provides some computations, which can last long time (minutes to hours).

The second server will use this service to have some data computed.

I'm trying to design a REST API for the first server and so far so good. But I'd like to hear some opinion on how to model notifications when the long lasting task is finished.

I considered 2 approaches so far:

  1. Polling - the second server will ask every now and then about the result.
  2. Callback - Second server will setup an uri for the first one to call after it is done. But this smells a bit in REST API.

What do you think?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

喜爱纠缠 2024-09-24 21:09:52

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

For your situation I would choose polling. When the second server makes the initial request to create the job on the first server, it should get a response that has the url of the eventual status page. The second server then polls that url every 5-15 minutes to check the status of the job. If the first server makes that url an RSS or Atom feed, then users could also point their RSS readers at the same url and find out themselves if the job is done. It's a real win when both people and machines can get information out of a single source.

辞旧 2024-09-24 21:09:52

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

In addition to what I've already answered in this similar question, I'd suggest using the Atom Publishing Protocol for the notification (you could publish to your second server).

疧_╮線 2024-09-24 21:09:52

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

If you use Python, you can take advantage of RabbitMQ and Celery to do the job. Celery lets you create an item in a queue and then pause execution of whatever you're running it through (i.e.: Django) such that you can consume the output of the queue processor as it becomes available. No need for polling OR callbacks.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文