一、引言
通常我们认为静态网页html的网站速度是最快的,但是自从有了动态网页之后,很多交互数据都从数据库查询而来,数据也是经常变化的,除了一些新闻资讯类的网站,使用html静态化来提高访问速度是不太现实的方案。我们不得不在代码与数据库之间寻求一种更合适的解决方案。
减少数据库访问次数,文件和数据库分离,大数据分布式存储,服务器的集群负载均衡,页面缓存的使用,nosql内存数据库代替关系型数据库,这些方案措施都是提高系统高并发性能的关键,下面一一分解。
二、分解
(1) 分布式服务器集群
A) 文件服务器集群
图片、视频、其他下载文件,它们的下载通常是占用网络带宽的罪恶魁首,这些资源一定要独立放在带宽好的文件服务器上,能提供http协议访问地址使用,不至于在下载文件时影响web服务器的cpu运算。
文件服务器最好使用磁盘阵列中心存储,比如阿里云提供的文件云服务器,这样使用简单,使用多大带宽多大存储空间选择就好了。
如果没有中心存储,也可以做文件服务器集群,如下图
说白了就是每个文件服务器都安装一个简单的web api作为文件传输和访问的接口,可以手动分配服务器地址给 web 程序使用,当然也可以做一层简单的负载均衡器供web程序统一接口调用。
需要注意的是:web api 接口上传文件结果一定要返回特定服务器完整的http文件下载地址,这个地址要存入数据库。
文件服务器的数量:文件服务器之间都相对独立,没有数据关联,因此数量的多少主要是看带宽的承载量和硬盘空间的大小,动态扩展服务器后,只需把服务器地址加入 web程序的调用列表即可达到无限扩展容量的机制。
B) Web服务器集群
不管是windows系统,还是linux系统,单台服务器的性能和资源都是有限的,支持的连接并发数都有上限,因此必须采用多服务器集群的方法才能提高连接并发数。连接并发数的容量计算也很容易:
连接并发数= 服务器1并发数+服务器2并发数+……+ 服务器n并发数
当然,我们不能都给每台web服务器分配一个域名地址访问,肯定是同一个域名同一个入口,例如百度后面有成百上千台web服务器,但是我们都是使用 www.baidu.com 一个入口,至于这个入口会自动给我们分配一台web服务器访问,我们不会在意这台web服务器的具体地址是多少,这就是负载均衡器的作用。
但是,web服务器集群并不像文件服务器集群那么简单,因为web服务器的程序使用的数据是共享的,具有一致性和实时性的要求。
如果获取数据时都从数据库读取数据,可以保证数据的一致性,但数据量大时,影响性能而又不能保证实时性,这就是我们后面说到的使用缓存技术解决这个问题。
Web服务器类型:微软的.net iis ,阿帕奇 tomcat 都是出名的轻量级web服务器
C) 数据库服务器集群
通常大型的关系型数据库 oracle ,mysql , sqlserver 都已经提供了集群的功能,但是,由于磁盘读写速度的限制,难以胜任高并发实时性的要求,我们建议使用带有集群功能的内存数据库。
Mongodb内存数据库:
Mongodb是一个开源的nosql 内存数据库,基于json格式的文档存储,数据对象通过json的序列化与反序列化传输。在服务器内存足够大时,把所有的数据装载到内存中,便于快速访问;当内存不够大时,把不常使用的数据持久化到磁盘文件;最新版本的mongodb 3.0 已经提供了服务器集群的功能,并且引入了hadoop大数据的mapreduce并行运算模式,这让海量数据全部存储与多台服务器的内存上提供很好的解决方案。
现在服务器内存的硬件价格已经十分低廉,配置128G内存的服务器已经很普遍,但是我们还是建议一台服务器存储数据量不要超过1亿条记录,便于提高并行计算的效率。
在硬件充裕的情况下,mongodb集群建议采用多副节点的集群模式,不仅提高访问性能,也保证了数据安全完整性能。
Gemfire内存数据库
Gemfire是很多年前就已经商业化了的nosql内存数据库,经过了多家大型机构的使用考验,更幸运的是,在2015年4月发布其开源版本Geode,可能在不久的将来得到更广泛的使用。
除了开源nosql内存数据库,国内外的巨头都已经在研究自己的内存数据库,比如oracle, ibm , 阿里等等,nosql内存数据库大有代替关系型数据库的趋势。
朋友们可以去研究每个内存数据库的优劣势,不管使用那种产品,我们无非就是解决两个问题:1、内存数据库保证快速访问;2、服务器集群存储大数据。至于如何搭建环境大家可以查找相关资料。
(2) 负载均衡器
负载均衡服务器分为硬件均衡服务器和软件均衡服务器,目的就是统一提供一个访问入口来访问服务器集群,并且能够动态监控每个服务器的负载,把新的用户请求转给负载小的服务器。
硬件服务器就是直接购买独立的服务器作为负载均衡服务器,例如阿里云已经提供。
软件服务器使用具有代理功能的软件作为转发服务器,比如Nginx,HAProxy,LVS 等等,具体安装部署大家可以搜索相关资料。
(3) 缓存技术
从上面我们可以看出,web服务器与数据库服务器是分布在不同的服务器上的,也就是web程序从数据库获取数据时,通过网络tcp/ip协议进行网络数据传输,当查询的数据量过大时,网络带宽速率很可能变为瓶颈,高并发在线时,将会很大影响整体系统的效率。
我们使用缓存技术解决这个问题。这里就涉及到相关业务了,一般来说,我们根据具体的业务,把数据分为两类:
1、 一类是不经常变的数据,比如表结构,公共设置数据,省市县名录等等,这些数据我们将会作为永久缓存数据,我们将会一次性读取数据库全部记录缓存到web服务器本地长久保存,并且定时检测数据库是否有更新的数据,如果有更新,则再更新本地缓存数据;
2、 另一类是经常变的数据,对于这种数据,需要每次读取时都从数据库读取,往往这类数据也包含海量的数据,读取数据库时将不能一次性读取,只能分页读取,缓存数据保存的时间也不宜太长。
缓存的工具也很多,比如 .net里自带的MemoryCache,java 的有 ehcache ,都是比较出名的缓存。
三、综合
综上所述,我们就可以设计我们的整体方案图如下:
四、开发框架
ErpCore是一套强大的快速开发框架,集数据库设计、软件建模、模型自动生成、界面可视化设计、业务流可自定义、全自动生成用户所需系统于一体。在此框架上扩展出所有行业的业务系统,它让软件工程师从“建模——写代码——测试”所有繁琐重复的工作变为全自动化生成,大大简化了企业软件的开发时间和成本。
1、自动建模
框架内部带有虚拟数据库系统,用户可在虚拟数据库上创建表、字段、表间关联,企业根据自己的具体业务需求构建合适的数据库架构,即通过自动化实现销售业务人员将能完成DBA的工作。业务流程将变成企业自定义。
2、自定义对象
对应于虚拟数据库上创建表、字段、表间关联,用户可自定义对象、对象属性、对象关联。奠定了可以扩展出符合所有行业所有业务系统可能性。
3、窗体表单可视化设计
通过拖拽拉的方式,业务人员即可创建软件使用界面,把界面关联起来即可实现不用编码就能创建所需的业务系统。
4、全自动创建子系统
管理员在后台通过创建对象、创建窗体,并集成成一个子系统,普通使用人员就能使用子系统进行工作,不需额外开发工作。
五、开源产品下载
请访问 http://www.8088net.com 下载开发框架源码