云边计算
2022-07-07

边缘计算的概念差不多是和物联网一起提出的。因此一般提起边缘计算,想到的是智能家电这种用户身边的物联网设备。

然而本文要讲的,并非上面说的这种边缘计算,而是发生在边缘服务器上的计算。

edge-of-cloud

上面这张图中,左边是数据中心里的云主机,也就是亚马逊的 EC2,阿里云的 ECS,大家都很了解了。右边是用户的设备。而处于两者中间的,是边缘服务器。

所谓边缘服务器,首先它是服务器,而非终端设备。其次,它处于云的边缘上,正如图中画的位置。什么是云的边缘呢?其实也没什么神秘的,CDN 大家比较熟悉,CDN 服务器就是云的边缘。

举一个大家熟悉的例子,把文件上传到云存储(例如亚马逊的 S3 或阿里云的 OSS)作为文件的唯一源头。同时开启 CDN 功能,文件会从源头分发到不同地理位置的多个 CDN 服务器上。用户访问的时候,会把用户的请求导向离用户最近的 CDN 服务器,缩短了网络传输线路,从而缩短了时间。

通常我们在 CDN 上存放静态资源。所谓静态资源,就是像图片、视频、浏览器上执行的代码(HTML,CSS,JS)。这些资源被浏览器原封不动的下载下来,再由浏览器去解析和渲染,所以这些资源是静态的即可,不同用户访问返回的都是同样的内容。

与静态资源相对的,是动态渲染。动态渲染在服务器端发生,也就是上图中 Core Cloud 部分,然后以直给的方式,把客户该看到的页面数据直接返回给客户端。对每一次客户端请求,都要耗费服务器的计算资源。如此动态渲染,存在两个问题:一是计算集中在服务端,这个还好,可以通过加机器来解决。第二个是传输距离问题,这个就难办了,因为加机器一般是在同一个集群上加,离用户还是很远。

我们既想要 CDN 般的低延时,又想要动态渲染的灵活。既要又要,看似不可能,但用边缘服务器来做动态渲染,可以部分解决这个问题。

边缘服务器上可用的资源极其有限,例如保存大量数据的数据库、维持状态的大内存,这些在 core cloud 上才有,而边缘服务器上都没有。可以认为,边缘服务器上存放的仍然是静态资源。一段程序,本身是静态的,各 CDN 节点上的拷贝都一模一样,是不变的。那为何又能叫动态渲染?

动态,就一定有可变的部分。我们都知道,程序虽一样,输入不一样,输出就可以不一样。边缘服务器是无状态且远离数据源的,它唯一的输入数据,就是客户端请求里携带的数据,例如 URL 上的参数,HTTP Header 携带的信息,客户端的 IP 地址。这些信息虽然不多,但它回答了三个哲学终极问题:

  1. 我是谁?(HTTP Header 里的 Cookie、Authorization、User-Agent 等信息)
  2. 我从哪里来?(从 IP 分析出的地理位置信息,HTTP Header 里 Referer,带在 URL 参数上的标记)
  3. 我要到哪去?(URL 上的路径和参数)

我们对照上面三个问题,举一个具体的例子,假如你在微信里打开一个别人分享的跨国电商网站的活动页面,会发生什么:

  1. 我是谁?从 User-Agent 知道用户使用的是桌面端还是移动端,打开专为这个端适配的网页,而不是用一套响应式的代码兼容各个端。至于这样做的理由,可参考七年前我写的另一篇文章《我为什么不喜欢响应式设计》
  2. 从哪里来?根据 IP 地址知道我来自中国大陆,因此默认语言为我选择中文简体。通过 HTTP Header 的 Referer 或 URL 上的参数,知道这个用户来自哪个渠道。
  3. 要到哪去?活动页面一般会有较大的访问量,于是很适合放在 CDN 上。根据 URL 上携带的信息例如活动 ID,知道是哪个活动页。

有了上面三个答案,就能把这个用户的请求精准定向到某个特定页面上。由于这个动作前置到了边缘服务器上执行,与 Core Cloud 相比离用户更近,减少了等待时间。

更进一步,我们可以根据 HTTP Header 携带的身份信息进行鉴权。通常的鉴权做法是到 Redis 里查一下 token,但刚才说到,边缘服务器是远离数据的,Redis 一般位于 Core Cloud 上。但如果边缘服务器要访问位于 Core Cloud 上的 Redis,路径又变长了,这一切就没有意义了。

好消息是,边缘服务器上的 Redis 已经出现了。比如 upstash 就是其中一个边缘 Redis 提供商,你就像平时使用 Redis 一样去使用它,但访问到的会是离你最近的处于边缘服务上的 Redis。

边缘服务器上运行的程序,要尽量少的占用资源。因为它会被复制多份,存到 N 多个边缘服务器上。边缘 Redis 缓存的大小也会受限。而需要更多资源的数据库,放在边缘服务器上也不是不行,只是代价会更大。做技术选型时,要权衡收益和代价,若付出很大代价只换来一点点速度上的优势,可能就不值得了。

云边计算,本质是拿空间换时间。人们对延迟越来越敏感,而存储空间越来越便宜。这让我们把本来只存在于 Core Cloud 的一部分计算和数据放到了边缘服务器上。这个趋势应该还会继续下去,在 cloud first、mobile first 之后,或许将出现 edge first 的风潮,把一切可能的都往边缘放。

随着边缘的不断外扩,不断拉近服务端与用户的距离。也许十年后,用户将几乎感知不到加载时间的存在,实时的交互体验成为理所当然。

END