托管长 运行 Web 服务操作

Hosting Long Running Web Service Operations

我正在创建一个 Web 服务来处理文件(这可能很耗时),我正在尝试通过确保 Web 服务器最终不会在内存中存储太多文件来证明它一次。

为此,我允许用户上传文件,我立即将其放入 Azure blob 存储并为用户提供该文件的 ID。

与此同时,文件已添加到后台的处理队列中(由单独的应用程序处理),完成后会将输出文件添加到 Azure 中并更新数据库以反映已完成的操作.

我希望用户做的是使用我在他们成功上传文件时给他们的 ID,调用网络服务说 "Is my file ready yet? if so, please give it to me"。

这是可以接受的做法吗?

最初我有它,所以用户必须等待整个操作完成,这样更干净,但感觉它不能很好地扩展。

我的想法是,如果我从请求中分离出文件处理组件,并且文件进入处理队列,它可能会立即得到处理,但也可能需要几分钟(取决于繁忙程度Web 服务得到 - 最坏的情况,如果我不实现自动缩放,可能需要几个小时),而且我担心让 Web 请求可能停留很长时间。

我是不是设计过度了,或者这是一个明智的方法?

这是一个非常明智的做法。事实上,REST 专门用 202 Accepted 响应代码来解决这个问题。

有关详细信息,请参阅 Asynchronous REST

总结一下:

  1. 当用户提交原始请求时,不要只给他们一个文件 ID,return 状态码 202 Accepted 并将位置 header 设置为他们可以轮询以获得请求状态的临时资源
    1. 此临时资源的 body 可能包含预计完成时间,或者只是 'in progress'
  2. 请求完成后,此 URI 应 return 303 See Other 并将位置 Header 设置为他们可以实际获取文件的 URI。