【发布时间】:2020-04-08 07:34:32
【问题描述】:
通过实时通知长时间操作来组织 REST API 的最佳做法是什么?
我假设我可以检索到operationID,然后通过WebSockets接收实时运行状态。
但是获得结果的最佳选择是什么? 我想这不是混合通知和检索结果的好习惯。
因此,我需要对另一个端点上的结果执行轮询或长轮询。 这是一个好习惯吗?
【问题讨论】:
标签: rest api websocket polling long-polling
通过实时通知长时间操作来组织 REST API 的最佳做法是什么?
我假设我可以检索到operationID,然后通过WebSockets接收实时运行状态。
但是获得结果的最佳选择是什么? 我想这不是混合通知和检索结果的好习惯。
因此,我需要对另一个端点上的结果执行轮询或长轮询。 这是一个好习惯吗?
【问题讨论】:
标签: rest api websocket polling long-polling
对于长操作还有一些额外的选择:
webhooks(操作完成后触发某个端点)。push notifications 完成后(如果从客户端触发了长时间运行的操作)。queues 进行长时间运行的操作(操作完成后将消息发送到队列)。【讨论】:
这取决于具体情况。因为你的问题很笼统,所以我也给出一个笼统的回答:越简单越好。
我想这不是混合通知和 检索结果。
我在这里没有看到任何不好的地方,您可以为每个响应使用具有如下格式的相同频道:{"status":"in-progress","workload":"72%"} 和 {"status ":"完成","结果":"ok"}
如果您没有任何明显的理由使用不同的通知和结果渠道,只需使用一个渠道来处理各种响应。
【讨论】:
Consequently, I need to perform polling or long polling for the
results on another endpoint. Is that a good practice?
它不在实际生产中。
每个 long 轮询都会在您的服务器上打开一个线程,这是 CPU 密集型的。
长轮询点很容易成为各种自动化DDOS attacks 的目标。
大多数 DDoS 攻击的潜在有效性来自 发动攻击所需的资源数量差异 相对于吸收或缓解所需的资源量 一。虽然 L7 攻击仍然是这种情况,但 同时影响目标服务器和网络需要更少的总 带宽达到同样的破坏效果;应用层 攻击会以更少的总带宽造成更大的损害。 https://www.cloudflare.com/learning/ddos/application-layer-ddos-attack/
您的服务器将很容易被关闭,恶意连接很少。
使用适当的wss websockets 架构,通过tls 加密的全双工通信通道,这是要走的路。
在数据消耗和电源使用超时方面非常有效。这是考虑到,根据我的测试,如果您的客户使用智能手机,电池真的很喜欢 websockets 而不是 api 调用循环。
请记住,它仍然是 2011 年的新协议。
The WebSocket Protocol RFC6455
但我们的浏览器现在拥有可靠的原生 WebSocket 功能。
(javascript) WebSocket API 是一种先进的技术,可以 打开用户的双向交互通信会话 浏览器和服务器。使用此 API,您可以将消息发送到服务器 并接收事件驱动的响应而无需轮询 服务器回复。
https://developer.mozilla.org/en-US/docs/Web/API/WebSockets_API
打开wss websocket 并从本机javascript 发送一些jsonRPC 数据的示例:
let socket = "wss://echo.websocket.org:443";
let jsonRPC= {
"method": "my_call",
"id": 123
}
Wsock = new WebSocket(socket)
Wsock.onopen = function(event) {
this.onclose = function(event) {
console.log("CLOSED SOCKET")
}
this.onmessage = function(e) {
console.log(e)
}
this.send(JSON.stringify(jsonRPC), function(response){
console.log(response)
});
}
用上面的脚本捕获网络标签,输出101 Web Socket Protocol Handshake
【讨论】:
【讨论】: