- 浏览: 44069 次
- 性别:
- 来自: 北京
最新评论
-
pujing:
start G:\8娱乐\舞蹈\xiju..\
建立一个别人不能接触的文件夹 -
ivywong:
楼主你好!公司准备做样一个业务平台,看到这篇文章收益匪浅。我想 ...
业务基础平台的设计
原文:http://hi.baidu.com/thinkinginlamp/blog/item/6f969f3d44556d02baa167b9.html
所谓“Just soso”,翻译成中文大致是“马马虎虎,还算凑合”的意思。所以,如果你想搞一个新浪,搜狐之类的门户的话,估计这篇文章对你没有太大用处,但是就像80/20原则所叙述的一样,大多数站点其实都是“Justso so”的规模而已。
那么如何架构一个“Just so so”的网站呢?IMO(在我看来:In MyOpinions),可以粗略的分为硬架构和软架构,这个分类是我一拍脑袋杜撰出来的,所以有考证癖的网友们也不用去搜索引擎查找相关资料了。简单解释一下:所谓硬架构主要是说网站的运行方式和环境等。所谓软架构主要是说在代码层次上如何实现功能等。下面就分别看看Howto do。
一:硬架构
1:机房的选择:
在选择机房的时候,根据网站用户的地域分布,可以选择网通或电信机房,但更多时候,可能双线机房才是合适的。越大的城市,机房价格越贵,从成本的角度看可以在一些中小城市托管服务器,比如说北京的公司可以考虑把服务器托管在天津,廊坊等地,不是特别远,但是价格会便宜很多。
2:带宽的大小:
通常老板花钱请我们架构网站的时候,会给我们提出一些目标,诸如网站每天要能承受100万PV的访问量等等。这时我们要预算一下大概需要多大的带宽,计算带宽大小主要涉及两个指标(峰值流量和页面大小),我们不妨在计算前先做出必要的假设:
第一:假设峰值流量是平均流量的5倍。
第二:假设每次访问平均的页面大小是100K字节左右。
如果100万PV的访问量在一天内平均分布的话,折合到每秒大约12次访问,如果按平均每次访问页面的大小是100K字节左右计算的话,这12次访问总计大约就是1200K字节,字节的单位是Byte,而带宽的单位是bit,它们之间的关系是1Byte= 8bit,所以1200K Byte大致就相当于9600Kbit,也就是9Mbps的样子,实际情况中,我们的网站必须能在峰值流量时保持正常访问,所以按照假设的峰值流量算,真实带宽的需求应该在45Mbps左右。
当然,这个结论是建立在前面提到的两点假设的基础上,如果你的实际情况和这两点假设有出入,那么结果也会有差别。
3:服务器的划分:
先看我们都需要哪些服务器:图片服务器,页面服务器,数据库服务器,应用服务器,日志服务器等等。
对于访问量大点的网站而言,分离单独的图片服务器和页面服务器相当必要,我们可以用lighttpd来跑图片服务器,用apache来跑页面服务器,当然也可以选择别的,甚至,我们可以扩展成很多台图片服务器和很多台页面服务器,并设置相关域名,如img.domain.com和www.domain.com,页面里的图片路径都使用绝对路径,如<imgsrc="http://img.domain.com/abc.gif"/>,然后设置DNS轮循,达到最初级的负载均衡。当然,服务器多了就不可避免的涉及一个同步的问题,这个可以使用rsync软件来搞定。
数据库服务器是重中之重,因为网站的瓶颈问题十有八九是出在数据库身上。现在一般的中小网站多使用MySQL数据库,不过它的集群功能似乎还没有达到stable的阶段,所以这里不做评价。一般而言,使用MySQL数据库的时候,我们应该搞一个主从(一主多从)结构,主数据库服务器使用innodb表结构,从数据服务器使用myisam表结构,充分发挥它们各自的优势,而且这样的主从结构分离了读写操作,降低了读操作的压力,甚至我们还可以设定一个专门的从服务器做备份服务器,方便备份。不然如果你只有一台主服务器,在大数据量的情况下,mysqldump基本就没戏了,直接拷贝数据文件的话,还得先停止数据库服务再拷贝,否则备份文件会出错。但对于很多网站而言,即使数据库服务仅停止了一秒也是不可接受的。如果你有了一台从数据库服务器,在备份数据的时候,可以先停止服务(slavestop)再备份,再启动服务(slavestart)后从服务器会自动从主服务器同步数据,一切都没有影响。但是主从结构也是有致命缺点的,那就是主从结构只是降低了读操作的压力,却不能降低写操作的压力。为了适应更大的规模,可能只剩下最后这招了:横向/纵向分割数据库。所谓横向分割数据库,就是把不同的表保存到不同的数据库服务器上,比如说用户表保存在A数据库服务器上,文章表保存在B数据库服务器上,当然这样的分割是有代价的,最基本的就是你没法进行LEFTJOIN之类的操作了。所谓纵向分割数据库,一般是指按照用户标识(user_id)等来划分数据存储的服务器,比如说:我们有5台数据库服务器,那么“user_id% 5 +1”等于1的就保存到1号服务器,等于2的就保存到2好服务器,以此类推,纵向分隔的原则有很多种,可以视情况选择。不过和横向分割数据库一样,纵向分割数据库也是有代价的,最基本的就是我们在进行如COUNT,SUM等汇总操作的时候会麻烦很多。综上所述,数据库服务器的解决方案一般视情况往往是一个混合的方案,以其发挥各种方案的优势,有时候还需要借助memcached之类的第三方软件,以便适应更大访问量的要求。
如果有专门的应用服务器来跑PHP脚本是最合适不过的了,那样我们的页面服务器只保存静态页面就可以了,可以给应用服务器设置一些诸如app.domain.com之类的域名来和页面服务器加以区别。对于应用服务器,我还是更倾向于使用prefork模式的apache,配上必要的xcache之类的PHP缓存软件,加载模块要越少越好,除了mod_rewrite等必要的模块,不必要的东西统统舍弃,尽量减少httpd进程的内存消耗,而那些图片服务器,页面服务器等静态内容就可以使用lighttpd或者tux来搞,充分发挥各种服务器的特点。
如果条件允许,独立的日志服务器也是必要的,一般小网站的做法都是把页面服务器和日志服务器合二为一了,在凌晨访问量不大的时候cron运行前一天的日志计算,不过如果你使用awstats之类的日志分析软件,对于百万级访问量而言,即使按天归档,也会消耗很多时间和服务器资源去计算,所以分离单独的日志服务器还是有好处的,这样不会影响正式服务器的工作状态。
二:软架构
1:框架的选择:
现在的PHP框架有很多选择,比如:CakePHP,Symfony,ZendFramework等等,至于应该使用哪一个并没有唯一的答案,要根据Team里团队成员对各个框架的了解程度而定。很多时候,即使没有使用框架,一样能写出好的程序来,比如Flickr据说就是用Pear+Smarty这样的类库写出来的,所以,是否用框架,用什么框架,一般不是最重要的,重要的是我们的编程思想里要有框架的意识。
2:逻辑的分层:
网站规模到了一定的程度之后,代码里各种逻辑纠缠在一起,会给维护和扩展带来巨大的障碍,这时我们的解决方式其实很简单,那就是重构,将逻辑进行分层。通常,自上而下可以分为表现层,应用层,领域层,持久层。
所谓表现层,并不仅仅就指模板,它的范围要更广一些,所有和表现相关的逻辑都应该被纳入表现层的范畴。比如说某处的字体要显示为红色,某处的开头要空两格,这些都属于表现层。很多时候,我们容易犯的错误就是把本属于表现层的逻辑放到了其他层面去完成,这里说一个很常见的例子:我们在列表页显示文章标题的时候,都会设定一个最大字数,一旦标题长度超过了这个限制,就截断,并在后面显示“..”,这就是最典型的表现层逻辑,但是实际情况,有很多程序员都是在非表现层代码里完成数据的获取和截断,然后赋值给表现层模板,这样的代码最直接的缺点就是同样一段数据,在这个页面我可能想显示前10个字,再另一个页面我可能想显示前15个字,而一旦我们在程序里固化了这个字数,也就丧失了可移植性。正确的做法是应该做一个视图助手之类的程序来专门处理此类逻辑,比如说:Smarty里的truncate就属于这样的视图助手(不过它那个实现不适合中文)。
所谓应用层,它的主要作用是定义用户可以做什么,并把操作结果反馈给表现层。至于如何做,通常不是它的职责范围(而是领域层的职责范围),它会通过委派把如何做的工作交给领域层去处理。在使用MVC架构的网站中,我们可以看到类似下面这样的URL:domain.com/articles/view/123,其内部编码实现,一般就是一个Articles控制器类,里面有一个view方法,这就是一个典型的应用层操作,因为它定义了用户可以做一个查看的动作。在MVC架构中,有一个准则是这么说的:RichModel IsGood。言外之意,就是Controller要保持“瘦”一些比较好,进而说明应用层要尽量简单,不要包括涉及领域内容的逻辑。
所谓领域层,最直接的解释就是包含领域逻辑的层。它是一个软件的灵魂所在。先来看看什么叫领域逻辑,简单的说,具有明确的领域概念的逻辑就是领域逻辑,比如我们在ATM机上取钱,过程大致是这样的:插入银联卡,输入密码,输入取款金额,确定,拿钱,然后ATM吐出一个交易凭条。在这个过程中,银联卡在ATM机器里完成钱从帐户上划拨的过程就是一个领域逻辑,因为取钱在银行中是一个明确的领域概念,而ATM机吐出一个交易凭条则不是领域逻辑,而仅是一个应用逻辑,因为吐出交易凭条并不是银行中一个明确的领域概念,只是一种技术手段,对应的,我们取钱后不吐交易凭条,而发送一条提醒短信也是可能的,但并不是一定如此,如果在实际情况中,我们要求取款后必须吐出交易凭条,也就是说吐出交易凭条已经和取款紧密结合,那么你也可以把吐出交易凭条看作是领域逻辑的一部分,一切都以问题的具体情况而定。在Eric那本经典的领域驱动设计中,把领域层分为了五种基本元素:实体,值对象,服务,工厂,仓储。具体可以参阅书中的介绍。领域层最常犯的错误就是把本应属于领域层的逻辑泄露到了其他层次,比如说在一个CMS系统,对热门文章的定义是这样的:每天被浏览的次数多于1000次,被评论的次数多于100次,这样的文章就是热门文章。对于一个CMS来说,热门文章这个词无疑是一个重要的领域概念,那么我们如何实现这个逻辑的设计的?你可能会给出类似下面的代码:“SELECT... FROM ... WHERE 浏览 > 1000 AND 评论 >100”,没错,这是最简单的实现方式,但是这里需要注意的是“每天被浏览的次数多于1000次,被评论的次数多于100次”这个重要的领域逻辑被隐藏到了SQL语句中,SQL语句显然不属于领域层的范畴,也就是说,我们的领域逻辑泄露了。
所谓持久层,就是指把我们的领域模型保存到数据库中。因为我们的程序代码是面向对象风格的,而数据库一般是关系型的数据库,所以我们需要把领域模型碾平,才能保存到数据库中,但是在PHP里,直到目前还没有非常好的ORM出现,所以这方面的解决方案不是特别多,参考Martin的企业应用架构模式一书,大致可以使用的方法有行数据入口(RowData Gateway)或者表数据入口(Table DataGateway),或者把领域层和持久层合二为一变成活动记录(ActiveRecord)的方式。
发表评论
-
记不准确的linux命令
2011-04-21 01:24 773Linux命令老是记不住,列出来就方便多了 1.wget ... -
linux上启动服务
2011-04-21 01:23 8351.apache /etc/rc.d/init.d/httpd ... -
mysql创建用户和忘记root密码
2011-04-21 01:21 12591.创建mysql用户 引用grant all on myi ... -
linux下修改系统时间
2011-04-21 01:19 667修改系统时间为:2007-01-19 12:30:00 # ... -
在本地模拟外部环境
2011-04-21 01:18 882修改文件: C:\WINDOWS\system32\drive ... -
linux下查看cpu和memery信息
2011-04-21 01:16 9821.查内存 #more/proc/meminfo cat ... -
linux下查看cpu和memery的个数
2011-04-21 01:15 8521.CPU数量 # cat /proc/cpuinfo | g ... -
mysql数据库定期备份脚本
2011-04-21 01:14 8651.mysqldatabak.sh文件(/root/) d ... -
有效配置MySQL参数
2011-04-21 01:09 5721.获取当前配置参数 ... -
优化mysql性能的几个参数的介绍
2011-04-21 01:07 626(1)、back_log: 要求 MySQL ... -
mysql的master/slave数据同步配置
2011-04-21 01:06 672mysql数据同步备份 A服 ... -
网站开发中用到的工具(2007)
2011-04-21 01:02 8781.基本工具 mysql :数据库 smarty:分离php程 ... -
(转)大型网站的架构-2007年
2011-04-21 01:00 663小型的网站,比如个人 ... -
(转2007)思考高并发高负载网站的系统架构
2011-04-21 00:58 724下面是我10月中旬的想 ... -
mysql数据库参数show status(2007-04-25)
2011-04-21 00:53 573mysql> show status like '%ta ... -
BIND+Mysql实现DNS轮询泛解析和IP视图
2011-04-21 00:51 2486文档内容: 1.关于本文档 2.Bind+Mysql+Mysq ... -
这次开发中会用到的ZendFrameWork模块
2011-04-21 00:47 939Zend_Db Zend_Controller Zend_Vi ... -
处理提示信息常用的js
2011-04-21 00:46 616一、controller里 1.返回前一页面并刷新 ec ... -
网站性能测试工具ab(Apache Bench)
2011-04-21 00:44 792进入ab.exe根目录 ab -n 1000 -c 10 h ... -
在linux上搭建postfix邮件系统
2011-04-21 00:43 1491一、基本概念 1.MTA:(Mail TransportAge ...
相关推荐
最后,我们可以将表转 excel 添加到模型中,并输出名为%名称%。在模型构建器中,我们需要多次保存模型,以免出现问题。 使用 ArcGIS 模型构建器我们可以实现批量操作,例如批量提取转角点坐标。这将极大地提高我们...
在计算机图形学中,多边形的拓扑构建与左转算法是两个关键概念,尤其在二维几何处理和游戏开发中扮演着重要角色。本文将深入探讨如何利用实验数据实现多边形左转算法,以及如何自动构建多边形。 首先,让我们了解...
标题中的“前端构建尝试1-demo网站”表明这是一个关于前端开发实践的项目,主要涉及的是构建流程的探索和演示。在前端开发中,构建过程是为了优化和自动化代码的编译、打包、压缩等步骤,以便于项目的管理和部署。在...
【标题】:“纯手动构建项目”通常指的是在没有自动化构建工具如Maven或Gradle的情况下,开发者通过手动操作完成项目的构建过程。这种构建方式虽然较为原始且效率较低,但在特定场景下,例如学习项目结构、理解编译...
构建基准面和旋转增料练习.构建基准面和旋转增料练习.构建基准面和旋转增料练习.
例如,从句子“Mac将放弃Intel处理器转而使用ARM处理器。在不考虑功耗的情况下,ARM处理器的性能无法与Intel处理器相提并论。但在相同功率消耗的情况下,ARM处理器的性能优于Intel处理器。”中,我们可以抽取出以下...
从图像构建 2D 符号距离场、从点云构建 3D 符号距离场、从 Octomap 构建 3D 符号距离场,提供轻量级符号距离场库、符号距离场的消息类型以及压缩符号距离场以进行传输的工具。 Python 绑定 这些将默认构建,并且...
国有企业数字化转型加快构建新发展格局视频会议纪要
论文研究-利用旋转算法构建DEA模型生产前沿面.pdf, 传统数据包络分析模型的生产前沿面构造方法较为复杂,为了解决这一问题,提出了一个新的构建DEA生产前沿面的算法,...
虚拟链接是指代表两种运输方式间衔接关系的链接,例如,从公路运输转到铁路运输的过程。这类链接是综合运输网络模型中必不可少的组成部分,因为它们能够表示运输方式之间的转换。虚拟链接与实链接(代表单一运输方式...
基于深度学习的信息技术翻转课堂的构建.pdf
"可靠可重复地构建 Debian 软件包" 可靠可重复地构建 Debian 软件包是指在 Debian 软件包的构建过程中,确保从源代码到二进制软件包的对应关系和安全性。本节将详细介绍 Debian 软件包的现状、存在的问题、目标描述...
转基因生物相关平台的构建.pdf
此源码为开发者提供了一个快速构建类似58转转二手市场网站的基础框架。 【描述】描述中的“仿58转转二手商品PHP网站源码”表明这是一个用于搭建在线二手交易网站的程序代码,使用PHP作为主要编程语言。这样的源码...
标题 "IQtree:使用 SNP 数据(vcf file)构建系统发育树(数据)" 描述了一个使用IQtree软件处理SNP(单核苷酸多态性)数据来构建系统发育树的过程。这篇描述可能来自于一个关于生物信息学的博客文章,它详细介绍了...
该工具使用 Electron + Vue + ElementPlus + Vite 构建,并能将文字转换为语音 MP3 文件。 ## 功能特点 - 语音合成:将文字转换为语音 MP3 文件。 - 多语言支持:支持多种语言的语音合成,包括中文、英文等。 - ...
目前,ebuild已不再使用Go语言开发,转而使用C#基于.NET6开发,关于此的原因请参见使用C#+.NET6重写ebuild,为后续开发打基础。特性可根据需要选择完成需要自动化管理的易语言源文件可排除特定源文件批量完成e2txt/...
为此,《资本市场的层次构建与转板管理制度》这篇文献深入探讨了如何通过构建多层次的资本市场和实施转板管理制度来解决这些问题。 首先,信息不对称是资本市场的一个普遍现象。在单一资本市场上,由于投资者难以...