程序员的知识教程库

网站首页 > 教程分享 正文

分享ASP.NET MVC 系统性能优化的一个实战案例

henian88 2024-08-15 05:00:04 教程分享 24 ℃ 0 评论

最近我负责了一个门店ERP项目,并负责对该项目进行系统的维护。系统使用了Asp.net mvc+EntityFramework+WCF等相关技术,系统的部署,也做了负载均衡(一共有三台应用服务器)。随着系统用户量的增多,数据库记录数的剧增,系统经常出现一些卡顿问题,系统优化变得迫在眉睫。为了改变现状,我细细的研究现有系统的源码,提出了一些系统优化方案。

关于现有系统,经常出现的卡顿现象,归根结底都是因为使用我们系统的用户增多了,数据库记录的数量变大了,而代码层面的优化与服务器的优化没有跟上所致。

在讲系统优化之前,我想说说现有框架的一些优点。

我们整个框架的核心是使用了WCF的分布式服务体系。纵观现有系统的代码,我总结一下七个优点:

1、面向服务的架构体系,网站项目不需要配置数据库连接,所有服务的请求直接访问WCF服务(数据库链接配置在WCF服务中),做到了接口服务部署与站点的部署相分离,这样大大提高了网站部署的安全性。而传统的单体网站应用,数据库链接配置通常与站点紧密结合。

2、实现了一套自定义的分布式缓存技术。使用WCF+本地缓存实现了一套集中式缓存管理的技术,其实就相当于一台redis服务器,可谓是用心良苦,之所以这样做,可能是出于对.net + redis技术不成熟的担心。

3、在分库的请求上,做到了高可用。因为分库Id存放在WCF的消息头中,在每一次请求都带上,这样的好处是不用再请求内存或者数据库。如果请求内存,则分库Id容易丢失。如果请求数据库,则性能低下。

4、实现了一套基于AOP思想的日志管理系统, 使用WCF的操作行为扩展(实现了IOperationBehavior接口),记录系统的操作日志和异常日志。

5、框架实现了一套数据库读写分离机制。数据库访问层使用了EntityFramework技术,通过数据库上下文工厂类DbContextFactory,传入一个数据库上下文类型(主库或从库)与数据库链接实现。

6、使用存储过程,减少了sql传输的网络带宽,提高了网站的吞吐量。对于一些复杂的数据列表使用了存储过程进行数据的展示,虽然存储过程的调试麻烦一些,还是利大于弊。

7、Lucene.net的使用,实现了一套快速全文检索机制。

下面是我总结了现有系统的八个优化建议:

1、引入Redis缓存技术。系统虽然自定义了一套缓存机制,到仅仅用在用户登录这块,其它核心业务几乎很少使用缓存技术,99.9%都是直接读数据库建议做到能够读缓存的,绝不读数据库,减轻数据库的压力。这样可以极大提高系统的性能,增强用户体验。虽然我们可以在数据库层面做了读写分离,但这个只是减轻了数据库层面的的压力,网络请求所需要的时间还是比较长。

2、重新引入读写分离机制,减轻数据库的压力。(建议先做缓存优化,看看效果,如果效果好可以不做读写分离。如果不好,再引入读写分离机制)。

3、数据库的SQL优化,通过执行计划的分析、对表索引的进行优化等。

4、静态资源的压缩与CDN处理,一些静态资源,例如js,css,可以做分布式请求的,尽量做分布式请求,能够压缩的,尽量压缩,减少应用服务器压力,也可以节省应用服务器的带宽。

5、部分复杂的页面,请求调用服务次数过多,会导致数据库服务器与应用服务器的压力过大,建议有些服务可以合并的,尽量合并,减少不必须要的网络请求。

6、系统框架的DTO传输对象的概念比较模糊,不太注重,很多时候直接就返回整个实体列表的分页数据,这样会大大增加带宽,而带宽本身就非常昂贵和稀缺,在多人请求的情况下,会导致网站吞吐量下滑,从而导致页面加载变慢。

7、系统有很多类的代码行数过大,一个类上万行代码的情况也非常多,可读性差,也有优化空间。

8、IIS服务器的一些设置优化。可以参考博客园创始人dudu的一篇文章,让Windows Server 2008 + IIS 7+ ASP.NET 支持10万并发请求。

结语:上面是我对公司现有的一个旧系统问题的总结,以及优化的建议,不具有广泛公用性,毕竟每个企业的项目情况有所不同,所以仅仅做一个技术的分享交流。

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表