译注:这是一篇有趣的文章,作者是Vistaprint的工程师SriramDevadas,他以如何经营一家咖啡店为例解释Web应用程序面临的扩展问题。文章生动有趣,讲解通俗易懂。我经营一家咖啡店。运营成本与使用的资源成正比。我的咖啡店大约有一百平方英尺(约九平方米),雇用了一名咖啡师和一台咖啡机。业务能力:冲泡一杯咖啡需要三分钟,每次服务一位顾客,服务一位顾客的总时间为五分钟。如果我的咖啡师不停地工作,而我使用的德国咖啡机工作正常,那么我的咖啡馆每小时可以接待12位顾客。网络服务器高峰期客户很多,但我们一次只能服务一个客户,没有等候区。所以我升级了店面,新店很棒!升级配置:店面面积不变,聘请咖啡师三人,购置咖啡机两台,增加两把椅子。业务容量:三分钟可冲泡两杯咖啡,七分钟左右可同时服务三位顾客,新增加的椅子上可有两位顾客排队等候。同时服务的客户数=3,接待客户数=5。设施更棒!升级后配置:200尺店面,五名咖啡师,四台咖啡机,三把椅子。经营能力随着投资的增加而增加,似乎一切都很好。不过,随着夏季的到来,也是咖啡馆的淡季。这时由于经营成本的压力,想降低门店的配置。但是我的老板不会让我这样做。由于业务的潮起潮落,扩大规模对我和我的咖啡馆来说有点太贵了。有时更大并不意味着更好。通过业务负载均衡横向扩展经过商量,老板同意调整咖啡师三人一组的咖啡厅资源配置。如果我提前通知,他可以增减这样一组资源。要是我能用相同的配置管理多个资源组就好了……是的,就是这么特别吧!这种酒吧允许咖啡师同时为多个顾客服务。事实上,为顾客服务的人不一定是咖啡师。顾客只需要有人为他们下单,咖啡师不需要直接与这些难缠的顾客打交道。所以我做了改进。如果我需要扩大我的业务,??我会额外雇用三个咖啡师(老板说可以),并把他们放在一个特殊的酒吧里。如果业务量下降,我将终止雇佣合同,并让三名咖啡师滚出酒吧。随着投入的增加,门店的接待能力越来越强,营业能力可以动态调整。资源密集型加工我发现我的咖啡机用途广泛,能够制作各种食物。许多顾客建议我应该在菜单中加入吐司,我也照做了。这时问题出现了:我使用的两个咖啡机冲泡咖啡的时间是烤一磅面包的两倍。因此,烘烤一磅面包所需的时间与冲泡四杯咖啡所需的时间一样长。结果,面包订单有时会阻塞整个系统!点咖啡的顾客很不满意,大家都在议论我的经营方式效率低下。我需要一种根据业务负载分配订单的方法,以便我的资源得到最佳利用。基于进程的异步队列我发明了一个使用车牌的队列系统。顾客来了,点完单,拿个号牌等着。订单被分成两个输入队列,一个用于面包,一个用于咖啡。咖啡师根据当前两个队列和门店资源状况,选择是响应咖啡订单还是面包订单。咖啡或面包准备好后,将其放在输出托盘上,服务员会拨打电话,顾客会将物品取走。虽然新增加了输入队列和输出托盘,但这些资源仍在使用,只是服务方式不同。输入和服务能力的计算复杂,因此整个系统的复杂度也随之增加。所以如果这期间出现问题,处理和解决起来会很头疼。如果客户能够接受这种异步的服务方式,而我们能够控制这样一个复杂的系统,那么我的咖啡馆就可以根据业务量进行扩展,提供多种服务类型。这足以吓退那些竞争对手。写在***我们已经讨论了Web服务器、负载均衡和基于队列的异步系统,那么接下来呢?我的咖啡馆比喻已经结束了。如果您真的对此感兴趣,请查找经典系统扩展的示例,例如循环DNS或其他相关技术。如果您不熟悉Web应用程序缩放,请先尝试本文中提到的方法。我使用的咖啡馆模拟只是一个简化的问题抽象,用于描述Web应用程序扩展问题的本质。如果您真的想学习,那么浏览系统并与具有实际经验和知识的人讨论它们会很有帮助。原文链接:highscalability翻译:伯乐在线-小熊凯文翻译链接:http://blog.jobbole.com/63235/
