InfoQ上最近有一篇采访MySpace网站架构师Dan Farino的视频,介绍了一些关于MySpace的网站架构信息,与所有关于这些大型网站的架构资料一样,并没有涉及到什么细节,但还是有一些信息值得作为参考。

MySpace的架构现在大概是一个两层的结构,这里的两层指的是Web Server和Database,而缓存则更多的以一种插件的形式存在,而不是通常一些资料里所描述的单独作为一层,这其实更符合实际的情况。在前端,MySpace现在拥有3000多台Windows 2003 IIS 6的服务器,主要是使用.NET 2.0和.NET 3.5进行开发,同时还有自己定制的缓存。

数据库方面,主要是64-bit的SQL Server 2005,以用户为基准进行分割,大概是100万用户一台数据库。其它方面,MySpace有自己实现的一套分布式文件系统,运行在Linux上,负责处理文件的上传和一些负载均衡。

基本的信息也就这些了,这样的一个整体情况还是比较常见的,然后看一些细节的问题吧,.NET 2.0向.NET 3.5的过渡其实是比较容易的,Dan Farino也提到,.NET 3.5主要是对.NET 2.0的扩展,核心部分基本没有什么变化,所以升级时并不需要对原有程序做出什么改动。另一方面,当问到是否现在MySpace对LINQ的使用情况时,Dan Farino说了一番比较有趣味的话,先是对LINQ表示了赞赏,之后说到:

LINQ is actually what I am impressed more and more with every day. So, I don’t see any reasons for us not to upgrade all the servers and let developers use it, because it looks like a really neat technology and even for someone like me that I like writing SQL queries, there is something really cool about a LINQ query that works across XML, objects and memory, database, maybe some day a custom provider for us, who knows? Very neat stuff and I hope to see that there soon on our web servers.

从这个回答里基本可以推断MySpace在目前的应用开发中其实并没有太多的使用LINQ。这是可以理解的,因为若是重新做一个新的项目,那么可以考虑使用LINQ,可能对开发效率有所帮助,但LINQ,尤其是LINQtoSQL这样的应用,缺点也很明显,执行效率有损失是理所当然的,而且在针对一些复杂的查询逻辑和调试Bug时,LINQ就显得不是那么方便了。

在管理众多的服务器方面,MySpace主要使用了PowerShell,并针对自己的服务器的Vitual IP做了一些定制的命令和脚本来处理。这应该还是值得借鉴的。对于MySpace这样的大型应用,Debug Tools也是很关键的东西,他们主要使用了Profiler和Detours library来做性能监控方面的一些事情,尤其是后者值得关注一下,这还是微软研究室里的东西,除了微软和MySpace,没看到其它更多的应用情况,但对于需要监控大型系统的需求来说,既然他们用这个做一些事情,也算是一个参考的方向。

数据库方面,MySpace在使用了64-bit的SQL Server后,性能得到不少提升,这至少说明在想方设法使用其它手段来提高数据库性能时,首先可以考虑一下硬件升级这个简便的做法。

关于扩展性方面,cache是一个关键点,MySpace的Cache是自己基于.NET 2.0实现的,比较值得注意的有两点,第一点在于MySpace添加缓存的操作是异步的,第二点是他们自定义了缓存的Socket通信。关于第一点,一般的应用里,不会把添加缓存这项操作异步进行,我不知道是在面对了怎样的情况下MySpace做了这个调整,但可以肯定的是,大量使用缓存的情况下,缓存服务器的性能也会成为瓶颈。第二点因为没说出任何技术细节,我也无从推断自定义socket通信是出于何种考量。值得一提的是,由于他们是基于.NET来实现unmanaged cache store的,所以其中遇到的难题之一是.NET的GC机制似乎比较难以扩展,所以他们仔细研究了CLR和其中的C++的runtime,最终自己定制了一些核心库来克服这个问题,而Dan Farino也多少承认了他们通过reflector来查看.NET的底层实现并自己重写了一些。

另一个对扩展性比较重要的方面在于一个好的Failure Isolation System,这是一个容易被忽视的问题。对于一般应用来说,这点并不突出,因为最后需要做到数据库分割的应用本身也就寥寥无几。但当做到这一步时,这个问题就暴露出来了,因为即便FrontEnd的服务器很容易横向扩展,但如果后端的某台数据库down掉呢?这个情形想像一下就会知道,如果没有一个Failure Isolation System,最终前端的Web服务器也会一台台的down掉,而你很可能还找不到问题出在哪里。这也时为什么数据库分割这样的技术,总是作为性能优化中最后一步的原因,因为那个时候,会出现更多新的工作需要去做。

MySpace对缓存的发展方向还是倾向于逐渐由纯粹的dump object storage转变为Cache Database,新浪在这方面似乎已经走在了前面,memcachedb这个东西不知道究竟使用起来如何?

大概的信息也就这些了,本身使用.NET构建的大型web应用并不多,但MySpace在发展过程中遇到的问题基本都不是.NET平台本身的问题,所以无论采用何种平台,其实在稳定,扩展和性能方面并没有太大的差异,主要还是取决于开发者对该平台的掌握程度和开发水平了。不过Dan Farino提到Java在Web应用方面领先.NET不少,而MySpace这种级别的应用中,使用.NET似乎也就唯一是MySpace这一家了。这当然有历史的原因,毕竟在有那么多免费的选择的情况下,哪个startup会愿意去购买微软昂贵的工具和服务器操作系统呢?但平台迁移的成本是个必须慎重考虑的问题。

使用Java做为Web应用的架构基础在今天看来已经是比较保守的作风了,那么.NET该算做什么呢?这当然是玩笑话,对于非常大型的应用而言,所需要解决的技术问题绝大部分并不会出于这些已经成熟的框架平台上。