技術的學習和研究-以人類社會的需求為導向

来源:百度文库 编辑:神马文学网 时间:2024/04/25 15:36:57
  常常在论坛里看到大家为编程语言孰优孰劣争个你死我活,很多想从事计算机和互联网技术的人还在为选择什么样的计算机技术而犹豫不决,今天跟大家一起探讨一下,我们该怎么考虑这个问题?另外,应大家的要求,谈一下我看到的在大型的互联网技术公司里,需要什么样的技术。技术不一定要最好的,能满足用户需求就好相信很多人都用过诸如265网址导航之类的站点,很多做技术人的对此不屑一顾,不就一个简单的导航页面吗,有什么了不起的;但是你可知道这个站点可是很多中国网民每天必上的网站!它通过网址的分类导航方式,让那些记不住英文域名和不清楚互联网上有什么好玩的人,快速的到达目的地,就是这样一个看似简单的网站,却能在Alexa全球网站排名2000多,而且被谷歌高价收购。所以,今天想跟各位做技术的人分享一个观点,也是一个非常浅显的道理,就是人类社会的所有科学技术,最终是为使人类更好的生活服务的;对于任何想掌握互联网技术和软件编程技术的人来讲,考虑问题的出发点是,现在人们在使用互联网和软件时碰到了什么问题,而不是首先考虑哪门技术更强悍、用的人更多,“简单就是美”,“未必最好,合适就好”也是软件系统设计的一些重要原则。 构建大型互联网站点,需要什么样的技术?         如之前所述,需要什么样的技术,关键在于我们要了解作为大型互联网站点,它要为用户提供优质的软件系统体验,面临着什么样的问题和挑战。希望通过今天的分享,对于那些想从事软件和互联网技术的新人,有一些启发,能挑选到适合自己的技术路子。         我现在服务的这家公司,现在面临的挑战是每天有上几千万用户、上亿次的页面访问、几十个G的数据插入,面对如此庞大的访问量和数据吞吐量,如何保证网站快速、稳定,让用户拥有良好的访问体验,是这个阶段的主要挑战,而要解决这种挑战,光靠某种优秀的编程语言是解决不了的,这个阶段往往需要多种技术参与解决,那下面就谈谈构建大型网站的一些常用技术和思想:1、缓存技术:主要分为前端缓存技术和后端数据缓存技术前端缓存技术,主要是把一些用户经常访问但更新又不太频繁的页面(或者页面中的某一部分,比如一些大型论坛中坛子分类导航部分)进行缓存,在用户每次访问到这些页面时可以直接从缓存里加载信息,这样做既提高了用户访问速度,又减轻了对后端服务器的访问压力,常用的前端缓存技术有SquidESI(Edge Side Includes)等;后端数据缓存技术,主要是针对数据库做的缓存,随着用户访问量的增加,数据库的链接开销和运算量越来越大,这个时候可以把一些用户访问频繁的数据,放到本地内存,用户请求进来先到本地内存里拿数据,只有内存里找不到数据时才会请求数据库,这样可以大大降低数据库压力。 2、CDN(Content Delivery Network)内容分发网络技术这是一种网站内容的分发技术,通过CDN技术,可以将网站内容发布到离用户最近的网络。一家大型网站往往在全球通过不同的电信运营商(在中国主要为电信和网通)托管上千个机房,通过CDN技术,可以让用户每次在访问网站时,由离用户最近的、最匹配的运营商的节点为用户供内容。比如你家在东北,使用电信网络,访问在杭州的一家网站,在这个网站没有使用CDN技术之前,你要访问到这家网站的内容,你发出一个请求可能需要经过山东、江苏、浙江等几个省市的电信、网通的的交换机、路由器,最终到达杭州;但有了CDN技术后,你的请求发出后,它会在东北找一个离你最近的节点响应你的请求,这样可以大大缩短响应时间和减少网络出错的机会。CDN主要用到的技术为Web Cache技术和DNS负载均衡技术。 3、集群技术:主要分为前端WebServer的集群和后端DB数据库集群。通过集群技术,让多台计算机完成同一个工作,以提高网站的性能和可用性。通常一个网站一天有几百个用户、上万次的页面请求、少量的数据库读写时,基本上用一台廉价的PC Server就可以撑得住,人数再多点时可以换台好点的设备基本上也能撑得住,另外这个时候由于用户数不大,服务器偶尔停几次机,影响面也不大;但是如果有一天网站访问的用户达到千万、页面请求次数上亿,有频繁的数据读写时,一台性能再好的服务器,也往往撑不住这么巨大的访问量,这个时候通过对单台设备硬件升级进行做垂直扩展(增加内存、CPU等)用处已经不大,另外即使单台设备能撑得住这么大的用户访问,但却无法避免设备出故障,在这种访问量下,设备出1秒钟的故障往往都是不可接受的,毕竟访问用户数太大了,这个时候就要考虑利用集群技术,做水平扩展,通过不断的增加设备,用多台设备提供同样的计算服务来分担用户的请求,大大提高了计算效率,也避免了某个单点出故障网站便不能提供服务的问题,网站可用性大大提高。大型网站,web server跟DB物理上是分开部署的(一般我们平常做程序练习时才会部署在同一台计算机上),这样的好处是二者相互不影响,避免应用出问题时,数据库也受影响;它们的分开,就意味着我们既可以做web server的集群,也可以做DB的集群,在早期数据库一般是集中式的,多台web server访问一台数据库,但是随着web server的不停增加,数据库链接开销越来越大,单台DB往往撑不住这么多的请求,这时候就要考虑DB的集群了,像MySql数据库,对集群支持的就非常不错。要构建web服务器集群,涉及到的关键技术有:负载均衡技术(包括硬件负载和软件负载)、Session、cookie的复制和保持技术(主要解决在分布式环境里,在不同的服务器间,用户的临时请求信息能得以保持,而不至于请求分发到不同的服务器上造成数据丢失的问题);数据库的集群,往往跟特定的数据库集群技术有关,这个需要对特定的数据库进行研究。 4、数据库的分库、分表和读写分离技术分库技术,不是所有的数据库对集群支持的很好,随着数据量的增加,数据库的空间和表的空间越来越大,读写速度也会越来越慢,如果数据库不支持集群的话,就要考虑另一种替代方案——数据库的分库、分表策略,把同一个数据库,拆成几个结构完全相同的数据库,把同一张表,拆成几张结构完全相同的表,程序可以按照某种规则直接到特定的库和表里进行读写,这样可以大大提高数据库的响应时间。实现数据库的分库、分表,除了要对数据库动手术意外,往往也要对程序进行调整,这个时候往往会去实现一个DAL框架,由它负责在接到web服务器请求后,按照某种规则路由到特定的库(表)进行数据读写和合并。读写分离技术,采用这个技术的原因,是很多大型网站统计发现,数据库的读写比例相差悬殊,比如ebay的读写比例为260:1,这也就意味着在这样网站中,数据库主要工作在忙着应付用户查询,而不是写入,而我们知道,由于数据库的锁机制和事务性一致策略,在执行插入和更新操作时,读取速度会变慢;基于这个原因,很多大型站点会采用读写分离技术,让主库处理事务性查询,让从库处理SELECT查询,这样的话可以大大提高数据库的响应速度,如果你对这部分感兴趣的话,可以研究一下Oracle 的logical standby、MySql的Replication、MysqlProxy。          5、J2EE技术J2EE是一套全然不同于传统应用开发的技术架构,它是使用java技术开发企业级应用的一种事实的工业标准,是Java技术不断适应和促进企业级应用过程中的产物,由于后面还会对JAVA技术跟大家做分享,今天就不对J2EE技术在这里展开详细讨论了,大家感兴趣的话,后面可以持续关注我的文章。 上面这些是我接触到的大型互联网站点的一些重要技术,时间的关系,不能一一列全,通篇看下来,并没有提到到用什么样的编程语言去构建这样大型的互联网站点,今天也就是想通过这篇文章的分享,让大家转变一个固有的观念,技术能力的高低,不在于你掌握的编程语言难度的高低和功能是否强大,而在于你对现实问题的了解程度、处理问题的方法和手段的多寡以及处理问题的速度,等你掌握了一门编程语言以后,你会发觉差不多花前面语言一般的时间就可以掌握一门新的语言,这也说明了语言不是阻挡你技术进步的门槛。