从咖啡馆的经营看 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 功能是指 ...
随机推荐
- HTML常用标签及约束
注释 <!--这是一段注释--> 样式表 外部样式(CSS) <head> <link rel="stylesheet" type="tex ...
- 10th 知识点学习:单元测试
1.书中所在位置:构建之法第二章,19页—28页. 2.大致内容:书中是以案例的形式引入的介绍,具体讲述什么是单元测试,即程序员小飞进行练习单元测试,经过一系列的代码更改之后,终于成功实现.通过事后小 ...
- IE盒模型与W3C盒模型区别
前两天被人问到,叫我解释一下标准盒模型与IE盒模型,额,当时只能说,知道一点,但是没有深入的去探讨过,所以下来之后就自己写了例子,亲自去验证并且查看了网上的一些资料,现将其整理如下: 一.css盒模型 ...
- D3.js 入门学习(二) V4的改动
//d3.scan /* 新的d3.scan方法对数组进行线性扫描,并根据指定的比较函数返回至少一个元素的索引. 这个方法有点类似于d3.min和d3.max. 而d3.scan可以得到极值的索引而不 ...
- HBase 架构与工作原理4 - 压缩、分裂与故障恢复
本文系转载,如有侵权,请联系我:likui0913@gmail.com Compacation HBase 在读写的过程中,难免会产生无效的数据以及过小的文件,比如:MemStore 在未达到指定大小 ...
- 小程序 获取用户的openid
wx.login({ success: res => { var code = res.code; //返回code // 小程序appid var appId = 'wxd751fc845c9 ...
- Find non-overlap jobs with max cost
Given a set of n jobs with [start time, end time, cost] find a subset so that no 2 jobs overlap and ...
- bzoj2302-Problem c
题意 有 \(n\) 个人,从 1 到 \(i\) 编号.给每个人一个值 \(a_i\) ,他们会按编号从小到大进行如下操作:查看 \(a_i\) 有没有人,若没有就坐进去,否则查看 \(a_i+1\ ...
- MT【118】利用线面角最小解题
解:如图将正四面体放到立方体中,让AB通过$\alpha$面,让$\alpha$面绕着AB动起来.问题就转化成为EF与面$\alpha$线面角$\theta$了.EF的投影为$|EF|cos\thet ...
- 【JQuery】DOM元素
一.前言 接着上一章的内容,继续本章的学习. 二.内容 .get 获得由选择器指定的DOM元素, 可输入匹配元素的index编号 $(selector).get(index) .ind ...