浅谈易讯网架构
经历了最近几个月易讯网新版本的紧张开发及上线调试之后,总算能够暂时静下心来考虑网站的下一步计划及如何通过网络来如何吸引用户。
本来很早就想与朋友们一起分享下自己在开发易讯网过程中对网站架构和设计和经验和看法,但那时因为上一版本许多东西还欠缺考虑只好做罢。现在,终于有时间能够分享下自己的经验并大家交流和探讨。
什么是易讯网(econfeed.com)?如果您知道国外的DIGG网站,那么您也就知道了什么是易讯网。它是分享互联网资讯内容的社交网站。创建易讯网的灵感就源自于DIGG网站,而我那时也想自己开发个社区型的网站以积累和了解网站架构方面的经验。
平台
ASP.NET(.net framework 3.5)
Sql Server 2005
Windows Service
.Net Task Service - 作业计划服务
TaskFarmer - 分布式的任务系统服务
Lucene.Net
Memcached
Arachnode.net - .NET下的搜索引擎,基于Lucene搜索
下面这张图能够描述易讯网内部如何运作。
如何创建一个好的架构一直是一件让人头疼差事,因为您必须要考虑许多因素,包括性能,可扩展性,稳定性等以及如何从这中间取一个平衡点。
网站逻辑架构
易讯网的 网站逻辑架构依照了CS(Community Service)的架构,特别是采用模块(插件),皮肤的方式。我一直是CS架构的拥护者,从最早的AspnetForums到现在的Community Service。易讯网最初版本是采用CS的数据库,虽然它的数据库设计为应用程序提供了很大的扩展性,但也牺牲了性能为代价,以至后来性能成为问题,不 得不放弃完全按自己网站的需求来设计。
下面这张是网站的配置和设计逻辑图。
网站的性能优化
网站的性能的优化主要有针对的从几个大的方面进行优化。
1. ASP.NET
一篇很有帮助的文章:10个ASP.NET性能和可扩展性的秘密
2. 压缩页面文件大小
压缩文件的大小是减少带宽的使用以及用户的浏览体验。
1.主要使用HttpModule的方式压缩页面文件大小。
2.针对不需要回发的页面移除了Form表单标签和ViewState。
3. 改善了控件自动生产的ID。如果您是个有心人,您会发现在登录页控件呈现的ID名称是“S1_S1_S1_S5_S2_S1_S1_S2”,而原本应该呈 现的内容大概是:"Ctr1_Ctrl1_SiteMaster_MainContainer_Ctrl1_TxtLogin“(当然,真正呈现的要比这 个长,这里只是做个假设,它应该是总共带8个控件编号,这也是我为什么不喜欢ASP.NET的一个原因)。如果您也想压缩控件ID,您可以参考这篇文章:改善控件的自动生成的ID
3. 压缩CSS,JS,Image
图像压缩的方式您只有一种选择,使用图像工具。笑。
我使用YUI Compressor来压缩CSS,JS。因为我觉得它在准确率和压缩率在所有一些压缩工具中是最好的一个。
4. 缓存
合理的使用浏览器缓存和应用程序缓存是关键。针对用户头像,新闻的略缩图使用浏览器缓存。关于图像及略缩图,关于采用略缩图的原则将会在后面提到。
网站的缓存使用
采用缓 存主要还是为了减轻数据库IO的压力以及提高网站的性能。可以说,缓存的使用在易讯网中无所无在。易讯网采用是分布式缓存与本地缓存以及线程缓存相结合的 策略。像配置的基本采用本地文件依赖缓存。但是一些更频繁使用的数据采用的分布式缓存>>本地缓存方式。
易讯网采用的是 Memcached做为分布式的缓存服务。网站的大部分缓存都是采用分布式缓存的方式缓存数据。根据需求,我将数据缓存分成二类,一类是基本不会更新数 据,像新闻内容,一类是时时可能会变化的数据,像新闻统计。因此,对新闻的缓存将独立分成二份,一份是基本信息的缓存,一份是统计的缓存。假设现在您为某 个资讯提交新的评论或者投票的时候,那么,统计的缓存会将马上变化。为了压缩缓存数据的大小提交传输速度,易讯网采用了自定义序列化的方式,它将 比.NET默认自定义序列化能够减少2/3大小(没有详细测试过)并具有更高的序列化性能。当然,它牺牲灵活性,意味着如果我更改缓存数据的实体类,必须 重启缓存服务,否则,将会触发异常。部分内容采用了控件缓存的方式。
数据库
到目前为止,除了对数据库查询优化之外,并没有对数据库进行过多的优化。用了聚焦索引和非聚焦索引是关键。数据库优化是长期的过程。
略缩图
上面有提到过图像的略缩图处理。易讯网对略缩图的原则就是:
on-the-fly image resizing with Disk-caching
也说是说,动态生成图像略缩图并进行硬盘缓存。为什么采用这原则呢?当初采用哪种原则
是 有很考虑,当然现在只考虑下面几点, 一考虑到略缩图的大小可能会随以后网站的设计改变而改变,二是生成略缩图之后在将来很长很长的时间内不会变化。使用HttpModule模块的方式代替 HttpHandler生成略缩图。因为HttpHandler扩展性上远远没有HttpModule灵活。
TaskFarmer
创 建这个组件的灵感源自Gearman以及Digg网站架构介绍。它是一个分布式任务执行服务,您可以在本地服务器上执行的任何分配给B服务器并等待返回B 返回值。目前主要是邮件发送和资讯的内容抓取采用这种方式。现在TaskFarmer只是一个简单的组件,自己依照Memcached协议开发的服务端, 这样一来,我原本使用的Memcached的客户端组件只需要简单修改就可以马上使用,目前TaskFarmer并不会返回处理的值,但对易讯网目前来说 已经足够了。除了那个等待处理的页面无法精确判断是否抓取内容处理成功之外,其它还是非常理想。呵。
Lucene.net
Lucene 早期是应用在易讯网的网络蛛蜘(后面我会提到这个系统)上面。采用了MMSEG中文分词,目前主要应用在相关资讯搜索方面。现在正考虑将易讯网上面的用户 好友日志或者DIGG的日志移到Lucene上查询。Lucene索引分成二部分,一部分是:WorkingIndex或ActivityIndex,前 者用于索引易讯网新的内容,当全部索引全部完成之后自动添加到ActivityIndex中,这样保证当working index的索引库异常也不会影响正常环境下的索引库。Lucene何时开始索引是基于Task Schedule服务的配置。
在这里提一个非常有意义的.net下的搜索引擎项目:ArachNode.Net。 当时它一出来就开始注意到了,现在也已经非常成熟。易讯网也经历了一段时间搜索方面开发,早期创建易讯网的时候,是想结合搜索引擎的技术结合用户DIGG 的方法提高用户网上阅读的体验。但是因为Arachnode.net太过完美及复杂,另外就是特别吃内存,不得不放弃。另外一原因在于服务器根本就没有太 多的硬盘空间来存放WEB网页数据。如果您对Arachnode.net感兴趣,可以关注我的BLOG,下次会详细介绍,目前正打算移植它的核心代码根据 自己的需求创建一个小型灵活的搜索引擎。
现在网上流行AJAX技术,易讯网并没有大量的使用AJAX,特别是那种一打开页面就显示 Loading效果的技术。一是出于SEO考虑,二是没有觉得有特别适合那种非要AJAX才可的地方。 合适的使用AJAX确实能为用户提高更好的体验,我自己更倾向于大部的js加上部分的ajax的方式来达到用户的体验。
在新版本开发之 初,原来有意想为易讯网采用异步多线程任务的方式提高IO的密集处理。网上也看到一些比较优秀的文章和成熟的组件, 但是自己一因为不太了解,二是不习惯ASP.NET自带的那种异步注册方式,另外一点自己的要求比较特殊,就是它的多线程不应该使用Asp.net默认线 程池中的线程。也许以后有机会还是会考虑异步的方式,特别是显示资讯的详细页的时候。
整个易讯网前后经历了差不多近一年时间,目前的新版本花了近三个多月时间,当然这几个月也是收获最大的几个月,自己也为易讯网完成了几个自己的组件,包括上面提到的TaskFarmer,MMSEG.NET以及新闻内容的提取,这些,也算是易讯网自己拥有自己的特色吧。
如果您想更好的理解易讯网,建议您可以访问易讯网亲自体验下。您可以通过http://www.econfeed.com访问。
原创文章,转载请注明出处和链接。谢谢配合。