从咖啡馆的经营看 Web 应用的扩展
我经营着一家咖啡馆。经营成本同所用的资源成正比。
我的咖啡馆店面大概有一百平方英尺(约九平方米),雇佣了一个咖啡师,一台咖啡机。
营业能力:
每次能够服务一个顾客,用三分钟泡制一杯咖啡,算下来服务一个顾客的总时间是五分钟。
如果我的咖啡师不间断的工作,并且所使用的德制咖啡机不会出问题,那么我的咖啡馆的接待量为每小时十二位顾客。
Web服务器
高峰时期顾客很多,可是我们每次只能服务一位顾客,并且没有等候区。
所以我升级了店面,新店很棒!
升级后配置:
同样地店面面积,雇佣了三个咖啡师,购置了两台咖啡机并添加了两张椅子。
营业能力:
三分钟能够泡制两杯咖啡,约七分钟能够同时(Concurrent)服务三位顾客,并且还有两位顾客可以在新加的椅子上排队等待。
并发服务的顾客量=3,顾客接待量=5。
纵向扩展
新店大受欢迎,顾客络绎不绝,所以我再次升级了店面,新店面更大!设施更好!
升级后配置:
两百尺的店面,五位咖啡师,四台咖啡机,三把椅子。
营业能力随着投入的增加而变大,一切似乎都很美好。
然而随着夏天的到来,也到了咖啡馆经营的淡季。这时候由于经营成本的压力,我想减少店面的配置。但是我的老板不会让我这么干。
由于业务的涨落,纵向扩展对于我和我的咖啡馆而言代价有些过于昂贵了。有时候更大并不意味着更好。
通过业务量负载均衡进行横向的扩展
经过商议,老板同意以三个咖啡师为一组调整咖啡馆资源的配置,如果我事先通知,他可以增加或减少这样一组资源。
要是我能够管理多个同样配置的资源组…
是的,正好有这样一种特殊的吧台!这种吧台允许一个咖啡师同时服务多个顾客,事实上为顾客服务的人并不一定非要是咖啡师,顾客只需要有人为他们下单就可以了,并且咖啡师也并不需要直接同这些难缠的顾客打交道。
所以我做出了改进。如果我有扩展业务的需求,我会额外雇佣三个咖啡师(老板说OK),并且将他们放到哪个特殊的吧台中,如果业务量下降,我就会解除雇佣合同,让三位咖啡师撤出吧台。
随着投入的增加,店面的接待能力变得更强,同时营业能力可以动态调整。
资源密集型处理
我发现我的咖啡机非常全能,能够制造各种食品。许多顾客建议我应该在菜单中加上烤面包,我就这么做了。
这时候出现了一个问题:我所用的两台咖啡机需要花两倍泡制咖啡的时间来烤一磅的面包。
这么算来,烤一磅面包所花的时间等于泡制四杯咖啡所用的时间。
这样一来,面包订单有的时候会阻塞整个系统!点咖啡的顾客很不满,大家都在议论我的经营方式太低效。
我需要一个根据营业负载分流订单的方法,使我的资源能够优化的利用。
基于处理的异步队列
我发明了一种使用号牌的队列系统。
顾客到来,点单之后会拿到一个号牌并等待。
订单被分置于两个输入队列中,分别是面包和咖啡。
咖啡师根据目前两个队列以及店面资源的状况选择是响应咖啡订单还是面包订单。
一旦咖啡或是面包准备好了,会被放置于一个输出托盘中,并且服务员会叫号,顾客会把东西端走。
- 虽然输入队列及输出托盘是新加的,但是仍旧使用这些资源,只是说服务方式不同了。
- 投入和服务能力的计算很复杂,所以整个系统的复杂性也随之增加了。所以如果这期间发生了问题,处理和解决将是很头疼的。
- 如果顾客们能够接受这种异步的服务方式,并且我们能够控制这么复杂的系统,那我的咖啡馆就能够根据业务量扩展的同时还能提供多样的服务种类。这足以吓退那些竞争对手。
写在最后
我们已经讨论了Web服务器、负载均衡以及基于队列的异步系统,那么接下来呢?
我的咖啡馆比喻已经可以结束了。
如果你真这些感兴趣,去找找经典的系统扩展的例子看看,例如循环DNS或其他相关技术。
如果你在Web应用扩展方面还是新手,那么先照着这篇文章中提到的方法先试试。
我所用的咖啡馆模拟只是一个简化的问题抽象,目的是描述Web应用扩展问题的精髓。
如果你真想学,那么仔细琢磨下这些系统,并且找个有实际经验并懂行的人讨论一下,那会很有帮助。
译文链接: http://blog.jobbole.com/63235/
本文链接:http://www.cnblogs.com/oooweb/p/showing-how-to-scale-a-web-application.html
从咖啡馆的经营看 Web 应用的扩展的更多相关文章
- 最锋利的Visual Studio Web开发工具扩展:Web Essentials详解
原文:最锋利的Visual Studio Web开发工具扩展:Web Essentials详解 Web Essentials是目前为止见过的最好用的VS扩展工具了,具体功能请待我一一道来. 首先,从E ...
- 从HTML Components的衰落看Web Components的危机 HTML Components的一些特性 JavaScript什么叫端到端组件 自己对Polymer的意见
http://blog.jobbole.com/77837/ 原文出处: 徐飞(@民工精髓V) 搞前端时间比较长的同学都会知道一个东西,那就是HTC(HTML Components),这个东西名字很现 ...
- [浪风分享]App必死 Web永生 看Web的前世今生 必会卷土重来
当我们回顾技术的演变历史时,我们也应该关注技术演变的背后逻辑. 几年前,美国的<连线>杂志发表了“Web已死,Internet永生”的文章,由于作者之一是长尾理论的提出者克里斯.安德森(C ...
- 从Spring看Web项目开发
之前简单介绍过Spring框架,本文换个角度重新诠释Spring.使用Java语言开发的项目,几乎都绕不过Spring,那么Spring到底是啥,为何被如此广泛的应用,下面从以下两个问题出发来剖析Sp ...
- 看Web视频整理标签笔记
原来观看web视频,初学html的时候发现记忆不太深刻,所以自己整理了一些笔记,加深记忆且方便忘记时查看.html的规范(遵循)1.一个html文件开始标签和结束标签<html></ ...
- 从12306网站新验证码看Web验证码设计与破解
2015年3月16日,铁路官方购票网站12306又出新招,在登录界面推出了全新的验证方式,用户在填写好登录名和密码之后,还要准确的选取图片验证码才能登陆成功.据悉,12306验证码改版后,目前所有抢票 ...
- Python之Web前端jQuery扩展
Python之Web前端: 一. jQuery表单验证 二. jQuery扩展 三. 滚动菜单 一. jQuery表单验证: 任何可以交互的站点都有输入表单,只要有可能,就应该对用户输入的数据进行验证 ...
- 最锋利的Visual Studio Web开发工具扩展:Web Essentials详解(转)
Web Essentials是目前为止见过的最好用的VS扩展工具了,具体功能请待我一一道来. 首先,从Extension Manager里安装:最新版本是19号发布的2.5版 然后重启你的VS开发环境 ...
- ABP module-zero +AdminLTE+Bootstrap Table+jQuery权限管理系统第十六节--SignalR与ABP框架Abp.Web.SignalR及扩展
SignalR简介 SignalR是什么? ASP.NET SignalR 是为 ASP.NET 开发人员提供的一个库,可以简化开发人员将实时 Web 功能添加到应用程序的过程.实时 Web 功能是指 ...
随机推荐
- AT89C51的内部4K flash,
AT89C51的内部4K flash, 是用来下载程序代码的,程序运行时只能做读取数据操作,不能写入.单片机断电时需要候保存数据,可以选择 带EEPROM的单片机 就可以,如STC 系列的单片机有内部 ...
- 优先队列的一种实现--堆ADT
二叉堆的两个重要性质: 1.结构性,为完全二叉树,可以用数组方便地表示.2.堆序性:树中每个节点的关键字值大于或等于其父节点的关键字值. 二叉堆的数据结构声明如下: struct HeapStruct ...
- 第五周PSP&进度条
团队项目psp: 一.表格 C类型 C内容 S开始时间 E结束时间 I时间间隔 T净时间(mins) 预计花费时间(mins) 讨论 讨论用户界面 9:27 10:42 18 57 60 分析 ...
- Linux上两种网络连接方式
模式一:NAT方式好处:路由器更换,或者交换机更换,网络仍然可以使用,所用使用最多 准备工作: 查看VMware服务器启动情况,五个全开模式 vmnet8开启模式 1 配置VMware交换机的ip地址 ...
- linux创建账户并自动生成主目录和主目录下的文件
# useradd -d /home/test -m test; 然后给test设置密码. # passwd test; 1. useradd 添加用户或更新新创建用户的默认信息 语法:useradd ...
- Js获取上一月份
new Date(new Date().setMonth(new Date().getMonth() - 1))
- Qt之美(一):d指针/p指针详解(解释二进制兼容,以及没有D指针就会崩溃的例子。有了D指针,所使用的对象大小永远不会改变,它就是该指针的大小。这个指针就被称作D指针)good
Translated by mznewfacer 2011.11.16 首先,看了Xizhi Zhu 的这篇Qt之美(一):D指针/私有实现,对于很多批评不美的同路人,暂且不去评论,只是想支持 ...
- Nginx和Apache区别
Nginx VS Apache 相同点: 1.都是HTTP服务器软件 2.功能上都采用模块化结构设计 3.都支持通用的语言接口,如PHP.Perl.Python等 4.支持正向.反向代理.虚拟主机. ...
- override toString() function for TreeNode to output OJ's Binary Tree Serialization
class TreeNode { int val; TreeNode left; TreeNode right; TreeNode(int x) { val = x; } @Override publ ...
- Codeforces 449B_Jzzhu and Cities
给一个无向图,外加一些特殊的连接原点的无向边.在不改变原点与所有点的最短路的情况下,最多可以删除多少条特殊边? 首先我们把所有的边夹杂在一起.spfa跑出与所有点的最短路. 接下来我们通过一次bfs来 ...