查询三角剖分

Query triangulation

我有以下使用模式,我想知道是否有已知的方法来处理它。

假设我有一个网站,用户可以在其中针对远程数据库构建 运行 查询。远程数据库是安全的,用户将无法访问它。因此,查询,类似于:SELECT * FROM myTable 将被发送到我们的 Web 服务器,我们的 Web 服务器将查询另一台服务器上的远程数据库,接收结果并在 HTTP 响应中将它们传回。所以,流程是:

假设我无法控制这三个位置,我们可以看到如果结果集的大小很大,可能会有很多数据传输延迟。我想知道是否有任何方法可以改为执行以下操作,如果可以,该怎么做:


总而言之,如果我们假设结果集的大小为 50MB,在第一种情况下,50MB 将来自:

Asia (DB) -> US (Server) -> Europe (Client)

在第二种情况下,它将来自:

Asia (DB) -> Europe (Client)

您可以将身份验证与授权分离,以允许所有三个实体之间更灵活的连接:浏览器、HTTP 服务器和数据库。

要使第二个示例正常工作,您可以这样做:

  • HTTP 服务器(美国)向数据库(亚洲)异步提交查询并为其请求授权令牌。
  • HTTP 服务器(美国)将身份验证令牌发送回浏览器(欧洲),而现在的查询是 运行。
  • 浏览器(欧洲)现在使用身份验证令牌对数据库(亚洲)发起第二次 HTTP 调用,也可能使用查询 ID。
  • 数据库可能需要实施一个简单的令牌授权协议。这应该:
    • 验证传入的身份验证令牌。
    • 检索会话。
    • 开始将查询结果集流式传输回调用方。

对于数据库服务器,有很多开箱即用的超薄 docker 图像,您可以在几秒钟内旋转这些图像来实现授权服务器,并且可以使用 nginx 监听浏览器。

如您所见,可以制定架构。然而,亚洲的数据库服务器需要改造以实现某种令牌授权。最简单和普遍的策略是使用OAuth2,现在很流行。

基于@TheImpalers 的回答:

如何向您的远程数据库添加另一个 table 以仅用于检索查询结果?

当客户端向后端服务请求数据库查询时,后端服务将生成一个 UUID 或其他安全令牌,并告诉数据库 运行 查询并将其存储在给定的 UUID 下。后端服务还 returns 客户端的 UUID,客户端可以直接从数据库中检索相关数据。

TLDR:

Europe (Client) -> US (Server) -> Asia (Server) -> Asia (DB)

在亚洲打开一个 HTTP 服务器(如果不能访问相同的 DC/server - 租一个不同的服务器),然后从 HTTP US -> HTTP Asia 重定向请求,它将连接到本地数据库并流式传输响应。

重定向可以是 public 一个 (302) 或通过 VPN 的私人代理,如果您关心延迟并且有这种可能性。

前端直接与 DB 对话不是一个很好的模式,因为您不能执行任何长期需要的中间件操作(中断更改、分析、授权、重定向、速率限制、可扩展性) ...)

如果您的 SQL 非常重并且您无法通过持久的 TCP 连接执行同步请求,请在 websocket 服务器(也在亚洲)上设置流式传输。