计算机中有很多概念和思想看上去很抽象,在生活中都可以找到对应的场景,反过来也是,只不过生活中的场景比较形象,当你把计算机中的概念和生活场景联系起来,其实发现解决问题的思路都很相似。

负载均衡

以 Nginx 负载均衡为例,将大量请求通过反向代理分布到不同的服务器上,以减轻单台服务器的压力,提高吞吐量。当然,计算机中各个层次的负载均衡的场景有很多。

生活中最常见的例子就是电梯了,一个大型商场,一个办公楼,都有 7,8 个电梯,这样把人群分散开来,“平均”到每个电梯上。

反向代理

Nginx 的负载均衡将请求分发到不同的服务器,就是用的反向代理,假设有 A,B,C,D 四台服务器,一个 HTTP 请求,可能由这几台服务器中的一个处理,对于客户端来说,隐藏了真实的服务端。

这个跟 400 客服电话一样,大家拨打的都是同一个号码,400-XXX-XXXX,但是接电话的客服人员是不同的,对你来说,你并不知道最终接电话的是哪一个客服,这就是反向代理。这样你不需要直接跟具体的客服沟通,对于系统来说也只需要增加客服人员就可以应对大量的电话咨询。

CDN

CDN(Content Delivery Network),即内容分发网络,我们会把 CSS,JS,图片,视频等资源放到 CDN 上,这样不同地方的人访问都可以获得很快的速度,这也是一种负载均衡的方法。

生活中类似的连锁店,比如麦当劳,肯德基,耐克等就是典型的“CDN餐厅”,大家可以去就近的餐厅就餐,吃到同样的食物。

信号量

信号量是 IPC(进程间通信) 的一种方式,为了防止多个进程/线程同时访问一个共享资源而引发问题,通过信号量协调进程对共享资源的访问。

有的停车场出入口,上面会有一个牌子,显示“剩余车位XX个”,如果是0,那么你就必须等待,直到有车辆出去,计数器数字就会增加,你就可以进去了。还比如红绿灯。

同步和异步

计算机中经常有“同步”和“异步”的概念,同步就像生活中的各种排队,你必须等前面的人完成,并且是一个个按顺序进行,再轮到你,而异步就像是去银行办业务叫号,取完号你不用排队等着,有多个窗口在处理不同的业务,等到你的时候再通知你。