一开始你只是参与一个小项目,架构好像对你来说并不是什么重要的事,大家讨论下就马上开发,一台服务器轻松搞定操作系统+开发语言+应用程序+数据库。可是,突然有一天你的项目突然由于什么不可知的原因你的项目收到广泛专注!!!使用人数激增!!!
于是就很容易涌现各种性能问题、负载问题,如果处理不当也许就错失风投良机了。。。(就快要成为下一个facebook了!)
所以,你说架构重不重要!
但是你也许会说,我只是一只产品狗子,做架构有架构师啊~~但是,我要说的是,很多初创的小团队并没有架构师,而且就算有,人家讲话的时候你一脸懵逼也不合适啊。。。
既然这样,快点来看看架构的小知识!!!
(这里讲的架构并非传统产品经理喜欢研究的那种信息架构或者业务架构)
web前端
运行环境:
其实就是提供程序运行环境的Web服务器,可以向浏览器等Web客户端提供文档文件让全世界浏览和下载。使用最多的 web服务器软件有两个:微软的信息服务器(iis),和Apache。
Facebook采用的技术架构LAMP(Linux、Apache、MySQL、PHP),其中就有Apache。Apache是目前世界使用排名第一的Web服务器软件,它可以运行在几乎所有广泛使用的计算机平台上。
编码开发:
这个很容易引起 “哪种编程语言是最好的?”世界之争。。。大家可以直接看2016编程语言排行榜,但并不代表本主编立场。
值得一提的是,Facebook作为开源第一大厂,自家开发并且开源了HipHop for PHP,(yoyoyo很嘻哈么)这是一个PHP到C++的转换程序,目的是旨在加速和优化PHP,HipHop for PHP 比纯PHP有高一倍的效能,从而大大减少了服务器的需求,流弊啊。。。
类库框架:
类库解决代码或者是模块级别的复用或者对复杂度的封装问题。框架则是对模式级别的复用和对程序组织的规范。常用的框架有,Spring Framework (Java开源 J2EE框架)Struts (Java开源 Web框架)Hibernate (Java开源 持久层框架)。
而facebook使用的是Thrift框架,对了,也是他们自己开发的。。。thrift是一个软件框架,用来进行可扩展且跨语言的服务的开发。 如 C++, Java, Python, PHP, Ruby, Erlang, Perl, Haskell, C#, Cocoa, JavaScript, Node.js, Smalltalk, and OCaml 可以在这些编程语言间无缝结合、高效的服务。
负载均衡
硬件负载均衡:
是一种把网络请求分散到一个服务器集群中的可用服务器上去,通过管理进入的Web数据流量和增加有效的网络带宽的硬件设备。能够直接通过智能交换机实现,处理能力更强,但问题就是:贵!如图传说中的f5
软件负载均衡:
价格低,甚至有免费开源的负载均衡策略,但效果肯定不如硬件,但一般中型网站够用。目前使用最为广泛的负载均衡软件是Nginx、LVS、HAProxy。
数据库和缓存
数据库方案:
选择数据库需要考虑数据的量级、计算场景和处理数据的频次来选择。
facebook使用MySQL、Memcached、Hadoop’s HBase实现持久化。memcached是一套分布式的快取系统通过缓存数据库查询结果,减少数据库访问次数,以提高动态Web应用的速度、提高可扩展性。
分布式存储服务器:
分布式存储系统,是将数据分散存储在多台独立的设备上。分布式网络存储系统采用可扩展的系统结构,利用多台存储服务器分担存储负荷,利用位置服务器定位存储信息,它不但提高了系统的可靠性、可用性和存取效率,还易于扩展。
Facebook用户所发布的照片数以亿计,其存储由Haystack这个ad-hoc存储解决方案(由Facebook开发)来处理——包括对其进行低级别优化与只扩展写入方式。
TAO是Facebook一种用来处理社交图形信息的分布式数据库。针对读取进行优化的数据存储机制,并以单一地理分布实例的方式部署在Facebook当中。 Tao系统的设计初衷在于为“数PB级别”的庞大数据集提供每秒超过十亿次读取操作。
Facebook拥有超过6万台服务器。最近发布的数据中心位于俄勒冈州普赖恩维尔市,硬件完全自行设计,并被归为Open Compute Project。
源代码管理和版本控制
源码管理工具是一种记录代码更改历史,可以无限回溯,用于代码管理,多个程序员开发协作的工具。几种常用的有:svn、cvs、hg、git、vss。
作为工程师的天堂(产品经理的火葬场),facebook是这样做的:
“
有非常牢靠的安全体系,以免有人不小心/故意做了些不好的事。
每个工程师可以修改facebook的任何代码,随时可以迁入。
所有的代码修改都要进行审核(通过一个或多个工程师),但News Feed是个例外,因为太重要了,Zuckerberg会亲自review。
所有的修改至少要被一个人审核,而且这个系统可以让任何人很方便地审核其他人的代码,即使你没有邀请他。
工程师负责测试,代码修复,和维护自己的项目。
运维组是受过严格训练,倍受尊敬,而且有商业意识的。他们的工作包括分析错误日志,负载和内存状态等等。还包括用户行为。
另外:
“
产品经理与工程师的比例大约为1-7到1-10。
浓厚的工程师驱动文化。"产品经理基本可以被忽略",这是facebook一名员工的话。工程师可以修改流程的细节,重新安排工作任务,随时植入自己的想法。
对于某个特性是否值得开发的争论,通常是这么解决的:花一个星期的时间完成他,并在小部分人群中(如1%)进行测试。
参考:http://www.yixieshi.com/21053.html