咖啡店的例子:
我拥有一家咖啡店。
费用如何计算呢?根据我的资源同比例放大的。
该咖啡店有100平方英尺的面积,一个咖啡师,一台咖啡机。
这家店的运转
一次服务一个客户,花费3分钟制作咖啡,总共服务完一名顾客需要5分钟。
因为我的咖啡师不需要休息,而且我的咖啡机是德国制造的,所以也不会坏。
那么,我的店的最大的服务能力是 每小时服务12名顾客。
Web服务器
在客流高峰期,顾客就会离开。因为一次只能服务一名顾客,没有多余的空间。
因此,对咖啡店进行升级。
花费:
一样的面积,3名咖啡师,2台咖啡机,2张椅子。
运转:
3分钟制作完一杯咖啡,大约7分钟同时服务完3名顾客,同时可以允许2名顾客在椅子上等待。
所以,并发处理顾客数量是3, 容纳顾客数量是5。
垂直扩展
业务发展太快了,又需要升级店面了。这次决定价格面积!
花费
面积升级为200平方英尺,5名咖啡师,4台咖啡机, 3把椅子。
运转能力同比例放大,一切都运转得顺利。
但是咖啡店的常态是,到了夏天顾客没那么多。因此有的时候想要把咖啡店降级,但是房东不允许这样操作。
因此,考虑下来,垂直扩展太贵了,不适合。有的时候大并不一定是好事。
水平扩展并且加上负载均衡
相对于大的咖啡师配置,较小的3个咖啡师的配置,房东更愿意接受扩大和缩小。如果提前通知好,房东愿意添加配置,或者取走配置。
只要我能够使用相同的店面并且同时管理好多个咖啡师配置就可以了。
市场上目前有一种特殊的柜台就是在做这件事情的!
这种柜台允许多个顾客同时跟一名咖啡师沟通。其实这个沟通的员工不一定是咖啡师,只要能够下单并且让后台知道即可。只要的话,咖啡师就没必要接触到顾客了。
现在我有一个方法了。如果我需要扩展,我只需要租来另外一个配置(即3名咖啡师,以及2台咖啡机),并且通知特殊柜台的员工,有单子这个新的配置也可以处理了。
虽然价格也变贵了,但是我可以处理更大的客流量了。同时,我可以横向缩小和扩张了。
资源密集型处理
我的咖啡机真的是一个通用食品制造商。许多顾客告诉我他们想买新鲜出炉的面包。因此我把它添加到菜单中。
这样会有一个问题。2台咖啡机一次只能生产1磅的面包,并且耗费的是两倍的时长。
所以,可以理解为,生产1磅的面包需要4台咖啡机。
有时候生产面包就会阻塞住我的系统!那些下单要喝咖啡的顾客就不满意了,并且责备我的咖啡店的低效。
我需要一种方法,能够按照负载来分配订单,同时更合理的分配我的资源。
基于异步队列的处理方式
我想到了一种基于令牌的排队方式。
顾客进来,下好单子,拿到一个号码然后开始等待。
接单的系统,有2个输入队列:面包队列和咖啡队列。
咖啡师可以根据当前的队列情况,以及其他的订单,决定他们接下去是生产咖啡还是面包。
一旦咖啡或者面包完成,会被放置到托盘里,并且叫号。对应的顾客就来拿走他们的食物。
输入队列和输出托盘都是新的。Otherwise the resources are the same, only working in different ways.
从客户的角度来看,用户体验完全不同了。
费用和容量计算很复杂。系统的复杂性也随之增加。基于这样的复杂性,如果出现任何问题,如何调试和修复它都是一个问题。
如果客户接受这种异步系统,并且我们可以管理复杂性,那么这就是一种扩展容量和产品种类的方法。我可以恐吓隔壁的竞争对手。
不仅仅是缩放
我们正在达到我们的Web服务器驱动,负载平衡,基于队列的异步系统的极限。接下来是什么?
接下去的分析,我已经没有办法再简单的使用咖啡店做比喻了。
如果你有兴趣了解的话,搜索下DNS轮询以及其他的动态伸缩技术吧。
如果你的刚刚接触了web服务器的缩放,去搜索下上文提到的相关技术吧。
我上文说的咖啡店的比喻过于简单了,目的是引发对web服务器动态伸缩的兴起。
如果你想要深入了解,去实现这样的系统,与具有实战经验的人好好沟通。
翻译:
原文链接
网友评论