先定个小目标, 使用C# 开发的千万级应用

dotNET跨平台

微信号 opendotnet

功能介绍 在这里你可以谈微软.NET,Mono的跨平台开发技术,也可以谈谈其他的跨平台技术。
在这里可以让你的.NET项目有新的思路,不局限于微软的技术栈,横跨Windows,Linux 主流平台

话说昨天的港股发生了一件大事,腾讯成为亚洲市值最高的公司,在这历史性的一刻,作为在鹅厂工作的C# 程序员,也应该让世人了解下C# 并不是那么没有市场。在鹅厂,代码构成中60%以上是C++, C#也有10%左右的份额,后续的文章中我会和你继续分享,当然如果你有兴趣加入鹅厂会更快获取类似信息,需要可以找我内推。小二计划写几篇文章来让大家正确的认识下C#。

当我们还没来得及把自己的梦想捂热的时候,伟大的王老师一语惊醒了所有吃瓜的围观群众——人嘛,光着眼于梦想是不行滴,还是要先定一个能达到的小目标。一个一天处理5000万级别的应用,换算成每秒578个请求,当然应用不会这么平淡,有高峰有低谷,不过这也不是很难达到的目标,我们就来看看这样的一个小目标如何实现,这里分享的是我的一个真实案例:腾讯OA基础服务,简称TOF。

首先给出一个直观的数据,让大家有个初步的印象。

2015-11-5 这天的组织架构API的请求数达到36535867,超过了三千万的请求,这天的总请求数48922122,接近五千万的请求。

你很难想象到TOF使用的是.NET技术构建的,能够在每天几千万请求,可以媲美同样是.NET技术构建的StackOverflow社区,不过确实我也使用了大量StackOverflow开源的.NET技术,架构上也非常像StackOverflow。下面列下硬件列表:

·6台数据库服务器(6台SQL Server),其中3台SQL Server 2012 Always集群式核心数据库使用的是物理服务器

·12台Web服务器(IIS7.5),服务器是IT云VD-6机器(8核32G内存)

·2台分布式缓存服务器(Redis),服务器是IT云VD-5机器(4核16G内存)

·8台应用服务器(处理TOF的核心业务,使用WCF服务构建),服务器是IT云VD-6机器(8核32G内存)

·IT云提供的负载均衡服务器(LVS集群)

这些服务器都是虚拟化的服务器,腾讯IT有个内部的私有云平台的机器,比StackOverflow的服务器比起来要弱很多。但是我在程序的架构和性能优化方面做了很多,程序架构上采用微服务架构的思想,一图胜千言,下面给出TOF的架构图:

上面是总体的架构图,那么每个具体的服务又遵循了单体应用的架构,使用的是N层服务,一图胜千言,下面给出TOF的服务架构图。

负载均衡(LVS

负载均衡使用的LVS和tlinux,负载均衡器使用的是IT云的LVS集群,通过IT云进行管理

Web层架构(IIS 7.5ASP.Net MVC 5.2.1,和.Net 4.5.2

TOF经过负载均衡层导入流量到12台Web服务器, 分区域部署在2个地区,Web层通过WCF服务同后端的业务服务交互。

服务层(WCF 4.5 Net 4.5.2

在整体逻辑架构图上可以清晰的看到,紧挨着Web层的是服务层(部署在Window服务器Windows 2008 R2上)。服务层基于WCF实现的微服务架构。为了提升这服务做了非常多的冗余,每个服务都有至少3个实例。

缓存(Redis

TOF在缓存层用Redis,Redis服务器16G内存,采用master/slave结构部署,尽管每天2500万的ops,每个实例的CPU使用率也在2%之下。

Redis所在服务器有L1/L2高速缓存,Web服务的HTTP缓存设置在一级缓存L1中,Redis缓存在二级缓存L2。当用户访问在一级缓存L1中未命中后会去二级缓存中的Redis取值,如果web服务在L1和L2两级缓存都未命中,则会直接去原始数据源获取(比如,数据库查询,API回调等),然后并把获取到的结果缓存到本地和Redis中,这时其它服务未命中L1高速缓存便会去二级缓存L2/Redis中获取,节省了调用数据库查询或者API回调的访问时间。

OA登陆和组织架构都有自己的L1/L2高速缓存,通过L1缓存Key前缀、L2/Redis缓存数据库ID。

贴张Redis缓存服务已经运行445天,处理了110亿的请求的监控图:

数据库(SQL Server)

SQL Server是TOF唯一的源数据库,所有Redis的数据都来自SQL Server。使用微软的SQL Server监控组件AlwaysOn Availability Groups部署了一个SQL Server集群。服务器集群的配置也比较低4核32G 的A5机器。 

所有数据库过去24小时CPU监控图如图所示,大部分情况CPU使用率较低,偶尔做下缓存任务时会高些。

细心的朋友可能看出上图就是使用StackOverflow开源的Opserver所采集的数据。

.NET应用程序性能优化

TOF系统属于高并发的系统,使用系统默认的配置是不行的,需要对操作系统和.NET框架做优化:

  • Windows优化:调整tcp连接数,保证系统层面保证服务的不受限于操作系统,调整操作系统的TCP/IP参数,比如把Time_Wait 时间窗口2分钟à45秒,可用的端口数调整到65535,默认才5024个,对一个大并发的系统来说远远不够。
  • Web服务器优化:根据服务器的CPU核数调整进程数和HTTP层相关配置。
  • WCF框架的参数优化:
  1. 采取NETTCP绑定,保证框架通信的高效率
  2. 序列化:xml -> rest\json ->protobuf,适配器模式,使用protobuf替代wcf默认的二进制序列化,这里就可以6倍的性能提升。
  3. 根据服务流量调整WCF流量限制配置的值 

总体来说,TOF整体架构并没有采用那些非常高端的技术,使用的都是非常普通的.NET技术,混合使用Windows/Linux和开源技术照样可以打造高性能高并发的应用系统。

相关文章:

时间: 2024-08-05 22:21:46

先定个小目标, 使用C# 开发的千万级应用的相关文章

先定一个小目标,自己封装个ajax

你是否发现项目中有很多页面只用到了框架不到十分之一的内容,还引了压缩后还有70多kb的jquery库 你是否发现项目中就用了两三个underscore提供的方法,其他大部分的你方法你甚至从来没有看过 你是否发现fetch好像比ajax好用那么一点 你是否想过自己封装个ajax.... 纯前端写得久了,便想折腾点事情.比如先定一个小目标,年前自己写个类jquery轻量级库.... 那么就从自己封装一个ajax切入吧,首先我整理的一个思维导图,一目了然 解析参数数据 通常我们的请求后面会有一些参数,

先定个小目标,免费360度评价反馈系统上线,开放部分源码

前言 记得去年有次回老家,躺在卧铺位上听到临近铺位的几个中年妇女闲聊,听她们聊,大概知道她们是重庆的,刚从韩国旅游回来.她们聊到一个话题说人过了40慢慢感觉身体每况愈下,现在眼睛也开始花了.其中一个听起来有经验的总结道:可不是嘛,告诉你们个规律"四十八,眼睛花",到了那一岁,基本上准的很. 听到她们这一说,不禁想起这两年,妈妈做针线穿针时好几次叫我帮忙.是的,不觉间父母已接近半百,感觉一切不能再等,等不及了. 更重要的是我们成立组合是每位队友互相承载着对方的前途与梦想,这更不能等,等一

【先定一个小目标】在Windows下的安装Elasticsearch

ElasticSearch是一个基于Lucene的搜索服务器.它提供了一个分布式多用户能力的全文搜索引擎,基于RESTful web接口.Elasticsearch是用Java开发的,并作为Apache许可条款下的开放源码发布,是第二最流行的企业搜索引擎.设计用于云计算中,能够达到实时搜索,稳定,可靠,快速,安装使用方便. 1.准备工作 下载Elasticsearch,地址:elasticsearch.org/download 下载jdk,百度搜索jdk下载即可 配置JAVA_HOME变量,配置

【先定一个小目标】Windows下安装MongoDB 3.2

1.MongoDB 安装 官网提供了三个版本下载: - MongoDB for Windows 64-bit 适合 64 位的 Windows Server 2008 R2, Windows 7 , 及最新版本的 Window 系统. - MongoDB for Windows 32-bit 适合 32 位的 Window 系统及最新的 Windows Vista. 32 位系统上 MongoDB 的数据库最大为 2GB. - MongoDB for Windows 64-bit Legacy 

【先定一个小目标】Asp.net Core 在IIS上的托管运行

1.安装 .NET Core Framework 下载.net core地址:官网地址 2.Install IIS 在控制面板->程序与功能->Internet Infomation Services 3.站点部署 实例: https://github.com/aspnet/mvc 在IIS管理器,新建站点->物理路径Path:为项目的根目录. 网站绑定: 在host文件中添加127.0.0.1 mvcsanbox.cn,刷新dns缓存:cmd->ipconfig /flushdn

【先定一个小目标】dotnet core 命令详解

本篇博客来了解一下dotnet这个神奇的命令.我会依次对dotnet,dotnet new,dotnet restore,dotnet build,dotnet test,dotnet run,dotnet pack,dotnet publish这些个命令的用法做个简单的介绍以及演示. 1.基本的信息命令 dotnet命令主要是用来查看一些基本的信息,如平台.版本号等.经常会用到的参数有–version,–info,–help,下面依次运行下看看输出 dotnet –version 1.0.0-

【先定一个小目标】Redis 安装成windows服务-开机自启

1.第一步安装成windows服务的,开机自启动 redis-server --service-install redis.windows.conf 2.启动\关闭 redis-server --service-start redis-server --service-stop 3.可安装多个实例 redis-server --service-install –service-name redisService1 –port 10001 redis-server --service-start

新生的一个小目标

来到马帮后,先定一个小目标 这是我个人比较喜欢的一个动漫里的人物,名字叫做黑崎一护,不仅是因为他卍解的时候很帅,更多的是从最初的弱鸡,到最后的尸魂界最强,经历了很多的磨练.在现实生活中也不例外,每个人也需要不断地让自己变强,才能保护自己想要保护的人,这也是我来马哥教育的初衷,不想再碌碌无为,当一个平凡的人,想要保护自己爱的人,当然也是为了赚更多的钱. <img src="1.jpg" width = "80%"/> 学习注定是痛苦的,这也是毋庸置疑的事情

新生的小目标

来到马帮后,先定一个小目标   这是我个人比较喜欢的一个动漫里的人物,名字叫做黑崎一护,不仅是因为他卍解的时候很帅,更多的是从最初的弱鸡,到最后的尸魂界最强,经历了很多的磨练.在现实生活中也不例外,每个人也需要不断地让自己变强,才能保护自己想要保护的人,这也是我来马哥教育的初衷,不想再碌碌无为,当一个平凡的人,想要保护自己爱的人,当然也是为了赚更多的钱. https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&