反向使用的上游/下游术语? (例如 nginx)

我一直认为上游或下游是沿着一条真实的溪流流动的,在那里信息的流动就像水一样。因此,上游是水/数据的来源(例如 HTTP 请求) ,下游是水/数据的去向(例如服务请求的底层系统)。

我最近一直在研究 API 网关,并注意到其中一些网关使用了与此定义相反的定义。当时我把它当作一种奇怪的东西对待。然后我发现,一些 API 网关所基于的 nginx 也以与我预期相反的方式使用术语。Nginx 调用它向“上游服务器”发送请求的服务器,因此传入的请求可能是“下游客户机”。

从概念上看,如果发送到“上游服务器”,nginx 似乎会把请求推向“上坡”,这完全是违反直觉的... ... 显然,在反向代理和 API 网关的土地上,重力是相反的!

我看到过其他讨论关于上游/下游表示系统之间的依赖关系,但是对于坐落在系统之间的中间件或基础设施组件来说,依赖关系的概念有点松散,我发现从信息流的角度来考虑更有帮助——因为那通常是你的依赖关系的来源。

我对流类比的理解从根本上是错误的,还是这些软件组件把概念倒过来了?

31462 次浏览

在 HTTP 世界中,“上游服务器”一词是在 HTTP/1.0规范 RFC 1945中引入的:

502 Bad Gateway

服务器在充当网关或代理时接收到无效的 来自 上游服务器的响应 满足你的要求。

后来在 RFC 2616中增加了正式的定义:

上游/下游

上游或下游描述信息的流程: 所有 信息从上游流向下游。

根据这个定义:

  • 如果您正在查看一个请求,那么客户端在上游,服务器在下游;
  • 相反,如果您正在查看响应,那么客户端在下游,而服务器在上游。

同时,在 HTTP 中,大部分数据流不是用于请求,而是用于 回应。因此,如果考虑响应流,那么“上游服务器”这个术语听起来非常合理和符合逻辑。这个术语在502响应代码描述(与 HTTP/1.0 one 相同)以及其他一些地方也被使用。

同样的逻辑也可以在自然语言的术语“下载”和“上传”中看到。大多数数据流是从服务器到客户端的,这就是为什么“下载”意味着从服务器加载到客户端,而“上传”意味着从客户端到服务器。

Nginx 说得对。传统上,“上游/下游”类比用于表示 依赖性的方向,而不是消息的方向。因此,当一个时序图将一个请求描述为——不可否认的——“下游”遍历时,实际上它所传递的服务才是被依赖的(而不是依赖于其他服务)。

当你在水里尿尿时,冲击力会顺流而下。类似地,如果一个服务决定更改其 API,调用它的服务将受到影响。