首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用Websockets更新REST请求状态

如何使用Websockets更新REST请求状态
EN

Stack Overflow用户
提问于 2016-09-29 11:05:30
回答 1查看 1.9K关注 0票数 5

我使用内部AngularJS SPA,基于REST,问题是一些REST请求持续很长时间(~5-10秒)。

它是脊椎动物,但这与它无关-服务器需要从不同的源获取大量数据,并在响应前一起计算数据。

很好的解决方案是向用户显示请求状态,下面是WebSockets。

向用户显示请求状态的示例

  1. 请求发出
  2. 接受请求
  3. 从DB1获取数据
  4. 从DB2获取数据
  5. 处理数据
  6. 准备反应

但也有很多问题。

目前尚不清楚如何获取哪个API用户发送通知其状态的请求。可能的解决方案是拥有字典“API客户端”--“Websocket连接”,但是它可以在每一个重新连接上爆炸,并导致内存泄漏。不是吗?

也许解决方案是将整个REST转换为Websockets。但看起来这里有很多工作要做,但我仍然需要重新发明缓存之类的东西。

从任何角度看都是一团糟。这里有什么更好的解决方案?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-09-30 09:13:44

最好同时提供REST和Websocket,这样web页面就可以使用websocket和自动化客户端,而不需要websocket支持,仍然可以使用API。您可以异步处理这些请求,并使用REST异步模式

休息:

  1. 客户端向API发送请求。
  2. API获取请求并:
    • 为此处理任务创建唯一id。
    • 在数据存储中记录此任务的详细信息。
    • 向消息总线发送消息,请求具有要处理的id的任务。
    • 将带有HTTP 202 Accepted头的Location返回给提供任务状态的队列端点/queue/<taskid>

  1. 客户端获取响应,并可以定期在Location标头中指示的端点上轮询此类处理的状态。
  2. 如果任务仍未处理,队列端点将返回HTTP 202 Accepted
  3. 消息总线另一端的后台工作人员选择消息和:
    • 转到数据存储区,以获取该任务id的详细信息。
    • 做处理。
    • 完成后,使用该id更新任务状态。

  1. 此时,队列端点返回带有重定向客户端到处理结果位置的HTTP 303 See Other头的Location

Websocket:

  1. 在会话开始时建立websocket连接。
  2. websocket服务器将传入的消息转换为订阅消息总线中的操作,并将订阅消息转换为websocket中的消息。例子:

  1. 在REST步骤3,而不是对时间间隔进行轮询,使用websocket发送应用程序定义的消息来订阅对此类任务id的更改。确保您可以知道如何从Location头中获取任务id,或者只需在另一个标头中提供任务id。
  2. websocket服务器应该向服务总线指示这种连接订阅了标识该任务id中更改的主题。
  3. 当后台工作人员完成数据处理后,在更新任务状态后,还会向服务总线发出一条带有标识该任务id的主题的消息。
  4. websocket服务器将获取消息,然后将其发送到客户端。
  5. 然后,客户端可以向队列端点请求,以查找处理结果的位置。您也可以通过websocket发送该位置,但根据我的经验,有时很困难,因为websocket服务器可能是一个简单的Windows服务,不了解URL或资源位置。
票数 8
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39768548

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档