查询三角剖分
Query triangulation
我有以下使用模式,我想知道是否有已知的方法来处理它。
假设我有一个网站,用户可以在其中针对远程数据库构建 运行 查询。远程数据库是安全的,用户将无法访问它。因此,查询,类似于:SELECT * FROM myTable
将被发送到我们的 Web 服务器,我们的 Web 服务器将查询另一台服务器上的远程数据库,接收结果并在 HTTP 响应中将它们传回。所以,流程是:
- 位置 1(欧洲):User/browser 提交包含 SQL 查询的 HTTP POST。
- Location2(美国):HTTP 服务器收到请求,运行s SQL 针对数据库:
- 位置 3(亚洲):数据库 运行s 查询,returns 数据
- 位置 2(美国):HTTP 服务器收到 SQL 结果集。发送响应。
- 位置 1(欧洲):User/browser 在呈现的网页中接收返回的数据。
假设我无法控制这三个位置,我们可以看到如果结果集的大小很大,可能会有很多数据传输延迟。我想知道是否有任何方法可以改为执行以下操作,如果可以,该怎么做:
- 位置 1(欧洲):User/browser 提交包含 SQL 查询的 HTTP POST。
- Location2(美国):HTTP 服务器收到请求,立即发回 QueryID,运行s SQL 针对数据库,异步。
- 位置 3(亚洲)数据库 运行s 查询
- 位置 1(欧洲):User/browser 收到来自数据库的响应。 (如何?它不能直接从数据库中拉取)
总而言之,如果我们假设结果集的大小为 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 服务器(也在亚洲)上设置流式传输。
我有以下使用模式,我想知道是否有已知的方法来处理它。
假设我有一个网站,用户可以在其中针对远程数据库构建 运行 查询。远程数据库是安全的,用户将无法访问它。因此,查询,类似于:SELECT * FROM myTable
将被发送到我们的 Web 服务器,我们的 Web 服务器将查询另一台服务器上的远程数据库,接收结果并在 HTTP 响应中将它们传回。所以,流程是:
- 位置 1(欧洲):User/browser 提交包含 SQL 查询的 HTTP POST。
- Location2(美国):HTTP 服务器收到请求,运行s SQL 针对数据库:
- 位置 3(亚洲):数据库 运行s 查询,returns 数据
- 位置 2(美国):HTTP 服务器收到 SQL 结果集。发送响应。
- Location2(美国):HTTP 服务器收到请求,运行s SQL 针对数据库:
- 位置 1(欧洲):User/browser 在呈现的网页中接收返回的数据。
假设我无法控制这三个位置,我们可以看到如果结果集的大小很大,可能会有很多数据传输延迟。我想知道是否有任何方法可以改为执行以下操作,如果可以,该怎么做:
- 位置 1(欧洲):User/browser 提交包含 SQL 查询的 HTTP POST。
- Location2(美国):HTTP 服务器收到请求,立即发回 QueryID,运行s SQL 针对数据库,异步。
- 位置 3(亚洲)数据库 运行s 查询
- Location2(美国):HTTP 服务器收到请求,立即发回 QueryID,运行s SQL 针对数据库,异步。
- 位置 1(欧洲):User/browser 收到来自数据库的响应。 (如何?它不能直接从数据库中拉取)
总而言之,如果我们假设结果集的大小为 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 服务器(也在亚洲)上设置流式传输。