0

我必须实现一个架构来解决下图所代表的问题:

云到本地 API

基本上,我必须在云 (Azure) 中部署公共 API,但数据位于本地机器中。本地机器公开提供数据的 Swagger API。每台本地机器都有一个唯一标识符(安装标识符),允许我们路由请求。

我按照以下链接中建议的方法,基于 Azure Service Bus 的 Relay 模块开发了一个解决方案:

对本地 API 的安全 Internet 访问

基于 Azure Service Bus 的 Relay 模块的解决方案解决了我的问题,满足了我的大部分需求,但它有一个问题,延迟很糟糕。

我在同一个地理区域部署了公共 API 和服务总线端点,一个简单的请求 GET /companies 平均需要 1.5 秒,本地 API 的处理时间非常短,只有几毫秒..

为了保持低延迟,我一直在考虑使用网络套接字,但我不知道是否是考虑到这种情况的最佳方法,因为对于公共 API 的每个请求,我都必须打开一个网络套接字通道到 ApiController 内部的本地 API 并处理它的生命周期(在返回响应之前关闭它)。

显然,在这种场景下,on-premise API 中的每个 ApiController 都应该同时提供对 web sockets 和 http 的支持。

另一种解决方案是实现一个 http 代理,将原始请求从公共 API 中继到本地 API,但从我的角度来看,可能的最佳延迟是使用没有连接管理器的通信 P2P 实现的,因此我现在的重点是网络套接字。

我想尽可能地满足标准,因此我想使用“纯”网络套接字,这意味着不使用 Signalr。

有一次,我暴露了我的问题,解决方案和替代方案,我的问题如下:

  1. 如何在 ApiController 类的操作方法中打开 Web 套接字并将原始 http 请求从公共 API 中继到本地 API?

  2. 如何在本地 API 中为 HTTP 和 WebSockets 协议提供支持。本地 API 应该能够处理 HTTP 请求以及 WebSocket 请求。

  3. 我的第一个赌注是使用 System.Net.WebSockets,但我想知道是否存在与 ASP.NET Web API 集成时发光的任何 websockets 库。

4

1 回答 1

0

一个简单的请求 GET /companies 平均需要 1.5 秒,在本地 API 中的处理时间非常短,只有几毫秒

您正在使用 Azure Relay 服务将服务安全地暴露给公共云,据我所知,由于许多因素的影响(例如,客户端必须首先向服务总线继电器)。

此外,本文还举例说明了如何创建自定义 HTTP 处理程序来接受客户端 WebSocket 请求,您可以参考它来修改您的 API 应用程序以处理 WebSocket 请求。

于 2017-07-03T07:56:50.243 回答