基于.net平台的Large Scale/High Performance的盈利性网站搭建(1)

题目起的很雷人,旨在分享一些经验,希望大家一起参与。

如果您面临的是以下6个核心问题,或许您可以在改系列中获得一点益处:

  1. 是个网站
  2. 是盈利性的
  3. 想做成规模比较大的,用户数在百万级别以上,但是您的boss手里没有千万的资金来挥霍。
  4. 相对低硬件设备开支限制
  5. 基于.net平台,SQL Server 2005+数据库
  6. 还没开始,或刚刚起步,或是遇到了性能问题

目标/特点/构架

当您带领您的一支还没有到达成熟配置的team开始项目的时候,第一个需要考虑的问题是什么?这个问题的答案往往比较简单:是您的boss想要您创建一个什么样的平台,这个平台可以帮助他在时间点T可以为他赚到M单位的利益。

互联网日新月异,竞争激烈,而且模仿能力极强是竞争对手最大的特点。创建一个Killer Application而4,5年衣食无忧的这种情景在剧烈的减弱,更多的网站在走一条不断的创造各种High Lights的路线。互联网产品的推广需要各种好的宣传手段,导致用户的增长往往是阶段性的爆炸式增长。

所以,作为要实现这个产品的负责人,最先需要考虑这3个问题:

  1. 不断的快速开发新功能
  2. 程序的性能时刻都在接受考验

如何去架构这个要不断的扩展功能,不断的增加新玩意,性能要求时刻都让你感到心里没底的项目呢?

web项目要保持尽可能的简单,不断的重构不是互联网产品开发过程的最大特点,遇到问题的时候往往是大规模的重写。

这点是很重要的,相对灵活又不影响性能和增加项目复杂度的架构能很好的支撑每次的革命。

围绕上面这些话题,这个系列将会从以下几个方面展开:

  • 架构中的“度”
  • web服务器端
  • 缓存服务
  • SQL Server数据库的优化
  • web前台

废话少说,进入正题:

(一)架构中的“度”- 思维模式陷阱(概括)

也许很多人在想这里为什么不说是asp.net,而说成是.net。问题在于大家在国内所能看到的讲asp.net的书籍将它给大家上了一个“思维模式锁”,所以我们从全局考虑,来说.net。

是用asp.net mvc也好,用mvp也好,还是asp.net也好,都离不好那几个东西。asp.net2.0的出现,变革了很多,但是用他做个B/S结构的OA之类的产品还好,要实现我们现在的目标,是不可以的。

像membership,Role之类的东西,这绝对不是你想要的。虽然asp.net给我们准备了充足的可扩展能力,但是做过custom membership的都体会过他的复杂之处。抄起Reflector去看看Identity和IPriciple吧,用最简单的方式把用户搞定。

这时候遇到数据访问了,这个问题讨论的太多了,从最早的SQLHelper,到EntLib的DAAB,到我们改进他们或实现自己的,google一下已经是一大把了。但是.net 3.5毕竟到来了,而且我们要面临这快速开发的问题,虽然Linq to Sql不是那么完美,但是Linq to entity还真不适合我们。Linq to Sql的拖拽方式生成的DBML文件是将你拖入深渊的第一步,跳出来,custom it。他帮助我们完成大部分的Insert/update/delete操作是便捷的,但是select操作您估计绝大多数情况下不想使用它,ok,再加一层,这一层我们可以使用DAAB来overrride那些custom linq to sql不方便做到的。

基于接口设计完这些之后,用户相关操作的原型就出来了,我们在单元测试了通过了之后,别忘记了可是要有页面的。有页面就是说asp.net要处理我们的页面,这时候要考虑考虑.config的问题了。

除了大家熟知的web.config外,还有个machine.config。如果想做好,别忽略了它。除了您现在的w3wp.exe不能使用2G内存(32位平台默认设置)外,还有一堆可能用不着的HttpModule,这些都要去看看。

OK,现在可以回过头来看看我们的项目了,以后要怎么做,要做成什么,开始对项目改造和丰富吧,但是在这之前,保持一个思路:任何东西,如果是第二次要实现他,那么要把它拿出来,封装。谁也不知道哪天这个东西会让你头疼。但是不要过度封装,开发速度第一位的,够用就好。

开始写组件了,看过N多.net的设计相关的书,有些地方需要注意了:

Exception是.net里精心设计的,关于他也有很多文章了,他是.net里的一种体现问题的方式,但是我们需要极力的避免它,因为它对性能的影响可能会非常的大,有时您的网站遇到了High CPU,或许就是它的功劳。除了我们可以throw的,还有我们调用.net的Method时会顺便产生的。

类型的选用。完全的面向对象,不是说所有的东西都是class。从另一个角度来看,一个东西做成struct会比做成class有更好的性能,作为参数传递,值类型有时候也会让你倍感头疼,但是class有些场景下也好不了哪里去。

你可能感兴趣的:(performance)