【问题标题】:Real-time notification and result receiving实时通知和结果接收
【发布时间】:2020-04-08 07:34:32
【问题描述】:

通过实时通知长时间操作来组织 REST API 的最佳做法是什么? 我假设我可以检索到operationID,然后通过WebSockets接收实时运行状态。

但是获得结果的最佳选择是什么? 我想这不是混合通知和检索结果的好习惯。

因此,我需要对另一个端点上的结果执行轮询或长轮询。 这是一个好习惯吗?

【问题讨论】:

    标签: rest api websocket polling long-polling


    【解决方案1】:

    对于长操作还有一些额外的选择:

    • webhooks(操作完成后触发某个端点)。
    • push notifications 完成后(如果从客户端触发了长时间运行的操作)。
    • 使用queues 进行长时间运行的操作(操作完成后将消息发送到队列)。

    【讨论】:

      【解决方案2】:

      这取决于具体情况。因为你的问题很笼统,所以我也给出一个笼统的回答:越简单越好。

      我想这不是混合通知和 检索结果。

      我在这里没有看到任何不好的地方,您可以为每个响应使用具有如下格式的相同频道:{"status":"in-progress","workload":"72%"} 和 {"status ":"完成","结果":"ok"}

      如果您没有任何明显的理由使用不同的通知和结果渠道,只需使用一个渠道来处理各种响应。

      【讨论】:

        【解决方案3】:
        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

        【讨论】:

        • 不同意你的看法。 ASP.NET Core 可以使用异步控制器保持连接而无需保持线程。
        【解决方案4】:

        【讨论】:

        • 您的链接是 2011 年的教程。
        猜你喜欢
        • 1970-01-01
        • 2023-02-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-01-21
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多