当前位置: 首页 > 编程日记 > 正文

解密淘宝网的开源架构(转)

淘宝网,是一个在线商品数量突破一亿,日均成交额超过两亿元人民币,注册用户接近八千万的大型电子商务网站,是亚洲最大的购物网站。那么对于淘宝网这样大规模的一个网站,我猜想大家一定会非常关心整个网站都采用了什么样的技术、产品和架构,也会很想了解在淘宝网中是否采用了开源的软件或者是完全采用的商业软件。那么下面我就简单的介绍一下淘宝网中应用的开源软件。

  对于规模稍大的网站来说,其IT必然是一个服务器集群来提供网站服务,数据库也必然要和应用服务分开,有单独的数据库服务器。对于像淘宝网这样规模的网站而言,就是应用也分成很多组。那么下面,我就从应用服务器操作系统、应用服务器软件、Web Server、数据库、开发框架等几个方面来介绍一下淘宝网中开源软件的应用。

  操作系统

  我们首先就从应用服务器的操作系统说起。一个应用服务器,从软件的角度来说他的最底层首先是操作系统。要先选择操作系统,然后才是操作系统基础上的应用软件。在淘宝网,我们的应用服务器上采用的是Linux操作系统。Linux操作系统从1991年第一次正式被公布到现在已经走过了十七个年头,在PC Server上有广泛的应用。硬件上我们选择PC Server而不是小型机,那么Server的操作系统供我们选择的一般也就是Linux,FreeBSD, windows 2000 Server或者Windows Server 2003。如果不准备采用微软的一系列产品构建应用,并且有能力维护Linux或者FreeBSD,再加上成本的考虑,那么还是应该在Linux和 FreeBSD之间进行选择。可以说,现在Linux和FreeBSD这两个系统难分伯仲,很难说哪个一定比另外一个要优秀很多、能够全面的超越对手,应该是各有所长。那么在选择的时候有一个因素就是企业的技术人员对于哪种系统更加的熟悉,这个熟悉一方面是系统管理方面,另外一方面是对于内核的熟悉,对内核的熟悉对于性能调优和对操作系统进行定制剪裁会有很大的帮助。而应用全面的优化、提升性能也是从操作系统的优化开始的。

  应用服务器

  在确定了服务器的硬件、服务器的操作系统之后,下面我们来说说业务系统的构建。淘宝网有很多业务系统应用是基于JEE规范的系统。还有一些是C C++构建的应用或者是Java构建的Standalone的应用。那么我们要选择一款实现了JEE规范的应用服务器。我们的选择是JBoss Applcation Server。JBoss AS是RedHat的一个开源的支持JEE规范的应用服务器。在几年前,如果采用Java技术构建互联网应用或者企业级应用,在开源软件中的选择一般也就是Apache组织的Tomcat、JBoss的 JBoss AS和Resin。严格意义上讲,Tomcat和Resin并不能算是一个应用服务器,他们是实现了部分J2EE规范的一个容器。而商业软件的选择就是 IBM的WebSphere和BEA的WebLogic。到了现在,除了JBoss AS外,Apache的Geronimo,Sun的Glassfish也都是很优秀的JEE应用服务器。也给现在的开发人员提供了更多的选择。具体对于目前JEE应用服务器的比较。这边就不在赘述。

  在应用服务器前端,我们采用了Web Server做了一次转发,我们选择的Web服务器是大名鼎鼎的Apache。几年前,Apache几乎是Linux系统上开源Web Server的唯一选择。那个时候虽然也有一些其他的开源的Web Server,但是从功能和稳定性上来说都无法和Apache相对。在今天来说,Lighty也会是一个非常好的选择。Lighty是一个非常轻量级、占用内存资源也比较少的Web Server。虽然功能上没有Apache强大,但是在不少场景下,性能是非常出色、强于Apache的。而微软的IIS,就只能工作在Windows的系统上了。并且使用IIS的话,基本上也就是选择了ISAPI、ASP或者ASP.NET进行Web应用的开发了。

  数据库

  说完了我们采用的操作系统、应用服务器、WebServer后,下面就来谈谈我们的数据库。在淘宝网的应用中,采用了两种关系型数据库管理系统。一个是 Oracle公司的Oracle 10g,另外一个是Sun MySQL的MySQL。Oracle是一款优秀的、广泛采用的商业数据库管理软件。有很强大的功能和安全性,可以处理相对海量的数据。而MySQL是一款非常优秀的开源数据库管理软件,非常适合用多台PC Server组成多点的存储节点阵列(这里我所指的不是MySQL自身提供的集群功能),每单位的数据存储成本也非常的低廉。用多台PC Server安装MySQL组成一个存储节点阵列,通过MySQL自身的Replication或者应用自身的处理,可以很好的保证容错(允许部分节点失效),保证应用的健壮性和可靠性。可以这么说,在关系数据库管理系统的选择上,可以考虑应用本身的情况来决定。

  一个互联网应用,除了服务器的操作系统,Web Server软件,应用服务器软件,数据库软件外,我们还会涉及到一些其他的系统,比如一些中间件系统、文件存储系统、搜索、分布式框架、缓存系统等等。在淘宝网,这些系统都是自主开发的,没有采用目前商业的或者开源的产品。有些系统,会存在着一些开源的产品或者商业产品。但是,考虑到淘宝网自己的需求和大并发量的压力,这些系统都选择了自主开发框架。

  前面谈的都是系统级的产品,下面我们说说开发框架的使用。可能有朋友想问,作为一个如此大规模的网站,淘宝网的Web展现层采用的是什么框架,是怎么实现的呢?曾经也有到淘宝的应聘者问过我这个问题,他问我说是不是用的 struts。我告诉他说不是的。其实淘宝网的Web展现层的框架用的不是struts,不是webwork,不是spring mvc等等。淘宝网的Web展现层的框架用的是集团内部自主开发的一套Web框架。这个框架能够解决一些其他Web框架不能解决的、在淘宝的应用中又会出现并需要解决的问题。在淘宝的多个应用中,也采用了一些开源的框架,比如Spring、iBatis、jBPM、Hessian、Mina等等。这些开源软件的采用为我们构建应用系统提供了很大的帮助。

  采用开源软件构建系统,我想有两个很大的好处:

  一个是降低成本。假设你有1000台应用服务器,如果你每台服务器上采用的不是JBoss AS或者其他开源的软件,而是使用商业的Oracle BEA的Weblogic或者IBM的WebSphere,那么为这1000台机器的应用购买License的费用是非常高的。

  另外一个好处(我觉得最大的好处)是你可以看到软件的源码,你可以研究了解软件内部的工作过程、原理。这对于应用设计、开发、查错、优化都是非常有帮助的。

  淘宝网的开源观

  对于开源软件的应用,有些人可能担心质量的问题,有些人可能担心软件本身发展更新的问题,等等。对于质量的问题,我想现在很多的开源软件尤其是一些很著名的开源软件都有很完善的组织,有完善的开发、测试、发布流程。在一个新版本完成前,会有多次的测试版本发布,最后才是正式版。这和商业软件是一样的。并且因为代码公开,反而更加的容易发现错误,提高质量。至于第二个问题,我想跟第一个问题一样,关键是组织和规划而不在是否开源,并且在很多著名的开源软件背后,会有厂商在进行支持。软件本身的发展应该是不会成为问题的,不太会出现软件突然停止发展的情况。

  在今后的发展中,我们还是会一如既往的关注开源软件的发展,也还会根据需要采用不同的开源软件。在选择一个开源产品的时候,我会考虑以下几点:

1. 这个软件目前的功能和它的RoadMap

2. 软件本身的架构

3. 该软件开发的活跃度

4. 该开源软件是否是遵守该领域内的国际规范的

5. 在同类产品中,要挑选有比较优势的。并且要考虑可能存在的移植代价。这个移植指的是采用了这款开源软件后现有系统的移植,或者是从这个开源软件到其他软件的移植。

  对于企业级系统、互联网应用来说,采用开源软件不仅可以降低成本,更重要的是能够真正了解软件的内部工作机制。还可以在现在的基础上进行增强和定制,也能够从开源软件中借鉴到很多好的设计和实现。希望国内能有更多的企业在使用开源软件的同时,也能开源自身的一些软件,或者能够成为一些开源软件的贡献者。而作为淘宝网,我们也会非常积极的参与到开源的活动中,也会努力为开源的发展做出我们应有的贡献。

作者简介:曾宪杰,现任淘宝网平台架构部架构师。2002年毕业于浙江大学计算机系,先后在中科院下属企业、先锋电子(中国)就职。有丰富的Windows平台、企业级系统设计经验。现主要研究领域包括消息中间件的设计开发、分布式系统、分布式存储。

转载于:https://www.cnblogs.com/tommyli/archive/2009/01/08/1371582.html

相关文章:

不上全站https的网站你们就等着被恶心死吧

2019独角兽企业重金招聘Python工程师标准>>> 测试脚本 #!/bin/sh wget \ --user-agent"Mozilla/5.0 (Linux; Android 4.0.4; Galaxy Nexus Build/IMM76B) AppleWebKit/535.19 (KHTML, like Gecko) Chrome/18.0.1025.133 Mobile Safari/535.19" \-r \-P a…

《C#精彩实例教程》小组阅读01 – MSDN是什么?

学习编程,特别是在Windows环境下的编程,当我们遇到问题时,最先想到的权威解答机构就是MSDN了。 什么是MSDN呢? MSDN – Microsoft Developer Network 是微软一个期刊产品,专门介绍各种编程技巧。同时它也是独立于Mic…

LeetCode Python题解(二)----排序

根据: githhub优秀创作者. 算法思想 1.双指针法 2.排序 3.贪心思想 4.二分查找 5.分冶 6.搜索 7.动态规划 8.数学 快速排序 用于求解 Kth Element 问题,也就是第 K 个元素的问题。 可以使用快速排序的 partition() 进行实现。需要先打乱数组&#xff…

人生快乐之道(组图)

举报 转载于:https://www.cnblogs.com/qqnnhhbb/articles/1373323.html

Codeforces Round #270

Codeforces Round #270 题目链接 A:我是筛了下素数。事实上偶数仅仅要输出4和x - 4,奇数输出9和x - 9就可以 B:贪心的策略,把时间排序后。取每k个的位置 C:贪心。每次遇到一个人尽量让他用字典序小的,假设不…

Matlab与数据结构 -- 如何获取完整文件名

本图文介绍了Matlab中获取完整文件名的函数fullfile()。

用Git上传删除本地项目到gitlab---图文解析

Git简介 Git是目前世界上最先进的分布式版本控制系统 故事起源:如果你用Microsoft Word写过长篇大论,那你一定有这样的经历: 想删除一个段落,又怕将来想恢复找不回来怎么办?有办法,先把当前文件“另存为……

正常的人|正确的作息时间

正确的作息时间 标签:健康/保健 分类:美容护肤晚上9点——11点为免疫系统(淋巴)排毒时间。此时间应安静或听音乐 晚间11点——凌晨1点,肝的排毒时间,需在熟睡中进行凌晨1点——3点,胆的排毒时间…

基于Matlab的BP神经网络在语音特征信号识别中的应用

本微信图文详细介绍了BP神经网络在语音特征信号中的应用,并给出了Matlab源码。

DSSM(DEEP STRUCTURED SEMANTIC MODELS)

Huang, Po-Sen, et al. "Learning deep structured semantic models for web search using clickthrough data." Proceedings of the 22nd ACM international conference on Conference on information & knowledge management. ACM, 2013. 该网络把两个不同的输…

TCP和UDP传输特点

1.1TCP传输特点: 端到端通信:客户应用程序在一端,服务器在另一端建立可靠连接:建立连接时会测试网络的连通性可靠交付:建立连接后会发送数据是可靠的,除非因为故障而不能可靠交付,发送方会得到…

css3之 渐变

CSS3 渐变(gradients)可以让你在两个或多个指定的颜色之间显示平稳的过渡。 以前,你必须使用图像来实现这些效果。但是,通过使用 CSS3 渐变(gradients),你可以减少下载的事件和宽带的使用。此外…

CRM:把 isv.config.xml 按钮事件移动到 entity.onload()

大家都知道在ISV.CONFIG里可以添加按钮&#xff0c;然后添加按钮事件&#xff0c;比如下面&#xff1a; <Entities><Entity name"account"><ToolBar ValidForCreate"0"ValidForUpdate"1"><Button Icon"/_imgs/ico_18_…

Matlab与线性代数 -- 均匀分布的随机矩阵

本微信图文详细介绍了Matlab中均匀分布的随机矩阵函数rand、rands、randperm。

pytest实战--参数化parametrize+前置fixture

文章目录参数化 parametrize适用场景一个典型的例子前置fixture参数化适用场景一个典型的例子示例2个人疑问&#xff1f;pytest既可以用来做单元测试&#xff0c;也可以用来做自动化接口测试&#xff0c;pytest可以结合allure生成漂亮的测试报告&#xff0c;经过一段时间的学习…

Matlab与机器学习 -- BP网络神经元上的转移函数

本图文详细介绍了BP神经网络常用的转移函数及其导数&#xff0c;单极性Sigmoid函数&#xff0c;双极性Sigmoid函数&#xff0c;线性函数。

在baidu上找到自己

在baidu上搜了我经常用的用户名&#xff0c;找到了这里&#xff0c;一看都满屋子都是灰尘&#xff0c;我打扫了一下。也清理了自己。发现那时的自己好冲动、好小孩。 其实现在也一样。我不想去否认自己的过去&#xff0c;但也不想公开这段过去。因为它在这个废弃的屋子里很安静…

selenium--iframe之模拟qq空间登录

文章目录前言分析切换iframe前言 我在模拟登录qq的时候&#xff0c;发现无论如何都定位不了qq的“账号密码登录”&#xff0c;怎么都进不去qq的登录页面&#xff0c;如下图所示 分析 打开 https://qzone.qq.com/然后点击二维码登录这块&#xff0c;背景出现了灰色&#xff…

Java读取Properties配置文件

目录1.Properties类与Properties配置文件2.Properties中的主要方法3.示例1.Properties类与Properties配置文件Properties类继承自Hashtable类并且实现了Map接口&#xff0c;使用键值对的形式来保存属性集。不过Properties的键和值都是字符串类型。2.Properties中的主要方法(1)l…

《C#精彩实例教程》小组阅读02 – Visual Studio简介与安装

本图文详细介绍了什么是Visual Studio&#xff0c;以及Visual Studio的安装过程。 上一次我们介绍了Visual Studio 2015的下载&#xff0c;以及MSDN。 这一次&#xff0c;我们说说什么是Visual Studio以及如何安装。 Visual Studio&#xff08;简称VS&#xff09;是微软公司…

从.NET寻找出路

自从成了金融危机的牺牲品之后&#xff0c;一直在寻找出路&#xff0e; 从.NET开发人员 到 待业青年&#xff0c; 再到现在的 技术支持&#xff0c;有些茫然&#xff0c;不知道未来在哪里&#xff01;&#xff01; 工作一年半&#xff0c;发现给别人打工没啥发展&#xff0c…

关于高速光耦6n137的使用总结_光耦使用中的那点事1

目前通用的隔离器件有光耦、变压器隔离、电容耦合等三大主流方式。其中光耦和变压器隔离使用的较多&#xff0c;有很多地方都可以见到。本次推送主要介绍光电耦合器的几个使用注意事项&#xff0c;以下截图数据来源于TLP785的数据手册。1、延时时间大家可以看到在5V供电情况下&…

javascript回调函数笔记

来源于&#xff1a;https://github.com/useaname/blog-study 在Javascript中&#xff0c;函数是第一类对象。意味函数可以像对象一样按照第一类被管理使用。回调函数是从一个叫函数式编程的编程范式中衍生出来的概念。简单来说&#xff0c;函数式编程就是使用函数作为变量。函数…

工厂方法模式与抽象工厂模式的区别

工厂方法模式&#xff1a; 一个抽象产品类&#xff0c;可以派生出多个具体产品类。 一个抽象工厂类&#xff0c;可以派生出多个具体工厂类。 每个具体工厂类只能创建一个具体产品类的实例。 抽象工厂模式&#xff1a; 多个抽象产品类&#xff0c;每个抽象产品类可以派生出多个具…

LSGO代码小组第18周复盘日志

LSGO软件技术团队第18周代码小组学习复盘日志。

唐山松下焊接机器人编程招聘_机器人四小家族-松下Panasonic专注焊接

在日本松下的网站&#xff0c;机器人是和焊接系统方案是在一起的。松下机器人的历史&#xff08;来源于松下公司网站&#xff09;1980年松下AW系列弧焊机器人投放上市&#xff0c;机器人系统之间采用的是单向模拟通讯方式模拟通讯的机器人1983年示教的容易化1988年减少干涉的设…

基于Matlab的BP神经网络在非线性函数拟合中的应用

本图文详细介绍了如何利用Matlab神经网络工具箱实现BP神经网络对非线性函数的拟合。

aligned_storage简单学习

#include <iostream> #include <type_traits> #include <string>/* template< std::size_t Len, std::size_t Align default-alignment >struct::type aligned_storage; 相当于一个内建的POD类型他的大小是Size他的对齐方式是Align */ template<c…

有关高级关系引擎中存在错误

SQL server2005 Analysis Services项目中出现以下错误 高级关系引擎中存在错误。 无法与 DataSourceID 为“Adventure Works DW”、名称为“Adventure Works DW”的数据源建立连接。 但是数据源测试连接是好使的&#xff0c;搜到已解决办法&#xff0c;数据源对里双击&#xf…

c#中接口的使用方法图解_C#图解教程 第十五章 接口

接口什么是接口接口是指定一组函数成员而不实现它们的引用类型。所以只能类和结构来实现接口。这种描述比较抽象&#xff0c;直接来看个示例。下例中&#xff0c;Main方法创建并初始化了一个CA类的对象&#xff0c;并将该对象传递给PrintInfo方法。classCA{public stringName;p…