【对.NET系统架构改造的一点经验和教训】的技术要点的看法
| 张巍

也 10 年前的一篇文章,针对《对.NET 系统架构改造的一点经验和教训》一文的技术要点看法。

对.NET 系统架构改造的一点经验和教训】里面的几条对 CSDN 的改造的技术要点如下:

  1. 数据层放弃 SQL Server 数据库和存储过程,全部迁移到 Linux 平台上的 MySQL 数据库上;
  2. 缓存不再依赖 .NET 自身提供的缓存机制,迁移到部署在 Linux 平台上的分布式的 Redis 上;
  3. 服务之间的调用,避免使用 .NET 自身专有协议,改成 Restful 的 HTTP Web API 调用;
  4. 静态资源请求,不再让 IIS 自己处理,分离到 Linux 平台上的 Nginx 去处理;
  5. 需要读取的文件系统,也改成访问 Linux 平台上的分布式文件系统;
  6. 部署 .NET 代码的 Windows 服务器放在 LVS 后面,用 LVS 做负载均衡和故障切换。

1. 数据库应该采用 SqlServer 还是 Mysql

作为 web 程序 web 端从来都不是瓶颈,瓶颈从来都是在数据端。按照正常的逻辑,.net 的执行速度要比 php 快,原因是.net 是编译性的,php 是解释性的。但是目前很多大型网站都部署在 php 下面。主要是 php 的现成的解决方案比较多。

如果一个系统出现问题从来都不是语言的问题,而是架构的问题,或者说是架构者的问题。作为 web 服务,大部分时候的瓶颈都是在数据库上。有童鞋说到 sqlserver 数据库授权贵的问题,大家可以去 qinfo 上找一下大众点评一个讲座,他们用的是 asp.net 和 mysql 数据库。本质上 SqlServer 和 MySQL 都是作为结构化数据库,对开发人员来讲没有太大的不同。而数据库的可扩展性大致就是 1)数据库读写分离 2)业务水平分区 3)大表垂直分区 。其他的就是细节上的实现了

2. 缓存是用自身缓存还是分布式缓存

CSDN 将缓存迁移到 Redis, 个人觉得这个并不是.net 自身缓存机制的问题,如果做分布式缓存,不管是用 Memcache 还是 Redis,中间都间隔着机器,肯定没有 web 服务器缓存快,如果业务量小的话,采用缓存服务器来替代 web 自身的缓存机制其实是不划算的。当系统访问量达到一定程度,自身的缓存机制已经不能够满足系统的要求了,是肯定要切换到缓存服务器的。当然我想没有人会用 windows 服务器来做缓存服务器。不管是.net 还是 java 或者 php。用 memchace/Redis 的时候难道还有性能上的差别么。CSDN 最先改版的应该是博客系统,和博客园的博客系统用的都是一家,不过现在修修改改已经早就不是原版的样子了。不过很难想想当年 CSDN 的博客那么大的用户量用.net 自身的缓存是怎么撑过来的。看博客园云路的文章就知道博客园用的是 memcached 缓存的。

我的理解是,作为缓存当用户量小的时候可以用 web 自身的缓存机制,当达到一定数量级后,自身缓存机制无法满足大量数据缓存的需求的时候就需要切换到分布式的缓存组件上去。而遵循的原则就是,让数据更加的靠近用户。现在很多互联网服务,使用 memcached 或者类是的 key-value 数据库将所有的数据都放到缓存里面,而 mysql 等结构化的数据库只是用来作为数据库的备份,当缓存失效等才会从数据库里面读取数据。

3. 系统协议的选择

微软是一个很喜欢将一些协议里面加入自己的东西,并且也只有自己的那一套解决方案可以用,对于选择全套微软的产品来说确实是很方便,但是当我们需要用到非微软的东西的时候就拙计了。在 web 服务上主要是有 webservice 或者 wcf 的 http 服务。webservice 是一套公开的标准,xml 格式的一套协议。

Web Service 是一项新技术, 能使得运行在不同机器上的不同应用无须借助附加的、专门的第三方软件或硬件, 就可相互交换数据或集成。依据 Web Service 规范实施的应用之间, 无论它们所使用的语言、 平台或内部协议是什么, 都可以相互交换数据。Web Service 是自描述、 自包含的可用网络模块, 可以执行具体的业务功能。Web Service 也很容易部署, 因为它们基于一些常规的产业标准以及已有的一些技术,诸如 XML 和 HTTP。Web Service 减少了应用接口的花费。Web Service 为整个企业甚至多个组织之间的业务流程的集成提供了一个通用机制。

在 web 传输中 json 是比 xml 格式更加简短,并且能够被 js 原生支持的格式,而且第三方的支持也不少,选择 json 作为载体要比 xml 好。而 Restful 对我而言更向是一种数据访问风格。让 url 请求更加清晰。而不是协议。所以在 web 系统中,做 api 我更加的倾向用 Restful 风格的 api 和 json 作为载体。如果全套都是微软的产品,我认为 wcf 微软出品还是最好的选择。

4. 文件系统的选择

文件服务器放到 linux 下是比 weindows 好的,最起码 linux 不用去处理各种文件碎片,好吧文件服务我也没有玩过,不好评说。

5. 静态资源请求是 IIS 还是单独出来

我们知道 iis 是只能够处理静态文件的如果访问动态比如.aspx 文件,iis 会交给 aspnet_isapi 来处理请求,然后将结果返回给 iis。作为静态文件的处理,Nginx 比 iis 是有优势的。静态文件处理的时候,我们通常会做的事情就是将 js、css 文件进行合并压缩,开个一个或多个单独的二级域名来作为图片服务器。减少前端的等待过程。或者是将图片服务交给又拍、七牛等来处理。前段时间研究过又拍一下,提供 REST 和表单 Api 的接口,可以很方便的集成过去。而且提供 CDN 加速,比自己搞静态文件服务器要便宜。

6. 均衡负载。。。

当 web 服务器不够用的时候,这个时候需要对 web 服务器部署均衡负载,当然部署均衡负载的方法很多。俺也没有部署过这玩意,不好说,当单台 web 服务器无法支持业务需求的时候,均衡负载是必须滴。

总结

所以上面 6 点中除了第二点,我认为是作者对系统理解的不够外,其他的都是支持的。系统出现了问题,重来都不是语言的问题,而是架构的问题。当然这只是个人想法,也许我所认知的都是错了。

作者:张巍 出处:http://beixiu.net/

网站统计
网站创建
5年
文章分类
7个
文章总计
471篇
文章原创
106篇(22.51%)