程序员能亲自架构全国各地上万人同时访问的高并发大数据量的软件程序应该是职业生涯的荣幸
2011-05-20 11:33 通用C#系统架构 阅读(10409) 评论(84) 编辑 收藏 举报好长一段时间总是开发企业内部信息管理系统性质的软件项目,往往是有几个人在用的系统就能卖出几万元,例如只有一个人用的系统,往往可以卖1.5万-2万左右,若是有20来个人用的系统往往可以卖出20万的价格。若商务谈得好可以卖出更高的价格。
我们开发人员在学习软件开发阶段往往容易过度设计、往往会忽略客户的真正实际工作上的操作需求、数据的各种方便输入、统计查询的需求,而是更多的精力往往会放在系统架构上、系统的优化上等等,往往喜欢逃避真实的客户残酷的现实需求,其实真正达到客户的理想状态是相当困难的。
曾经有一段时间很没有成就感,辛苦开发出来的程序往往只有几个人偶尔用用,有些失落,但是一直没放弃努力,一直不断优化程序,希望有一天我们开发出来的系统有上万人同时在线使用。
2011年终于这个梦想实现了,有一个国家部委级的系统需要全国各地的每个省都上报数据、同时在线录入需求调查数据的开发任务,软件是否经得起上万人的并发访问?
其实很多时候,最难的是让别人相信你能把这么高并发高压力的系统能搞定,相信你的实力,然后让你来架构这样的系统,能说服客户你有这样的能力其实很难的,客户不会让我们来拿他做实验的,客户是经不起这个折腾,在全国上万用户面前若丢人了,领导是很没面子的,这不是关系和钱能解决的问题,必须需要有硬功夫多年的积累,需要拿事实来证明你有这个实力,可以搞定这个技术问题,就算出了问题也有能力马上解决好,让客户相信你有这个实力其实比其他什么都重要。
1:首先需要有非常良好的网络带宽,若有上万人同时录入数据的普通的Web信息管理系统,至少需要10M左右的网络带宽,而且网通、电信的主干网都有接入比较好,否则全国各地的网络情况都不太一样,有的城市录入数据时可能会遇到网络非常缓慢的情况,甚至到无法忍受的程度。
2:须有一台牛X的Web服务器 + 一台牛X的数据库服务器(备注接近顶配的奢侈硬件服务器非个人PC),由于是需要录入1000万条以上数据,最好采用Oracle数据库比较理想一些,经得起考验一些。
3:需要进行适当的内存缓存优化策略,不能所有的数据库都依靠SQL数据库的方式把压力放在数据库服务器上,尽量多使用内存的方式处理数据。
4:需要一个牛X的,经得起考验的数据库访问层,因为每秒都有可能成千上万的人在访问,若是质量不良好的数据库访问组件、或者不稳定的数据库访问组件,更容易导致系统崩溃、或者占用非常庞大的内存,最后容易导致整个系统的崩溃。
5:需要优化分页存取数据功能,应为有可能会有1000万条数据,若分页读取数据的功能没能优化到最高,也很容易导致系统的崩溃,因为上万人万一在同一时间,或者接近同一时间点了查询某页数据时,那系统就真崩溃了,分页存取数据一定需要做到极致才可以。
6:需要进行数据库索引优化,有索引和没索引的性能差距有时候会是100倍,大数据量时可能会有1000倍都有可能,数据库索引优化到极致了更容易得到运行顺畅的信息管理系统。
7:严谨高效的数据库事务处理,由于高并发,并且有些单据是需要同时写入多个表,需要保证数据库的一致性,要么全部成功,要么全部失败重新录入数据,所以需要一个高效的数据库事务处理机制的配合。
8:所有的系统的操作日志、异常信息都需要完整的记录下来,当系统发生一些故障时,可以快速排查问题,对正确诊断系统发生的故障的原因做分析参考用。
9:需要经常检测系统的各项指标、例如各服务器的内存使用情况、CPU使用情况、网络带宽使用情况,高峰时的各个参数是什么情况、系统不繁忙时的情况等,若服务器快承受不了压力了,就得马上增加负载均衡的服务器,网络带宽不够了需要增加等等,总不能等系统崩溃了再去做这些事情。
10:每个页面的HTML、JS都进行优化,若某个页面多余发了100个字符的垃圾HTML代码,那1万人每天获得100次,那得占用多少网络带宽,100×100×1万个字符的多余HTML被网络上传输了,要知道接入主干网的网络资源是多么宝贵,费用是多么昂贵。
11:HTML、JS等都可以考虑用压缩模式传输,那样网络传输效率会更高一些。
12:由于全国各地上万人,会有各种各样的人,这些人也未必全是好人,可能某些人心情不好,或者其他什么的,可能就会攻击我们的软件系统破坏数据,这些也可能是由于好奇心导致的,所以系统需要有严格的权限管理控制,不应该进入的页面绝对不能进入,不应该看的数据绝对不让看,不能操作的功能绝对不让多操作,一方面防止没必要的多余的麻烦,另一方面也可以减少系统被攻击破坏的可能性。
有时候我们觉得上万人同时访问有啥了不起的,并不觉得珍惜这个机会。
1:若我们想让全国各地,每个省市、甚至每个县都同时有人在输入数据,而且要输入大批量的数据,其实没几个人有这么大的组织能力及号召力的,若全是你自己雇佣的员工,上万个人的辛苦费你要支付多少,每个月至少需要支付上千万,而且还需要持续录入好几个月,普通人是没这个财力、也没这个号召力、强迫力的,很多程序员可能以辈子也难遇到这样的情况。
2:上万人同时在线使用的系统,其中的核心组件都是你一手编写出来的,精心维护的代码,那是有多么自豪感?这个是充分能验证你编码精湛、思维严谨的宝贵机会,也是显示一下你高超精湛技艺的表现机会,至少给了你一个这样的大舞台。很多人才虽然也很有才华,但是可能经常缺少展示才华的机会。
3:拿上万人验证的高质量的代码,将来可以一直重复应用于开发各种软件应用系统,可以放心用,最起码有个定心丸,不管遇到什么情况,这部分软件绝对不会遇到问题,可以放心大胆的用,经过接近10年精心维护的组件的最大价值就体现出来了。
经过这次上万人的同时在线使用,总结了一个深刻的体会,Oracle 的序列 NEXTVAL在高并发下会有重复问题,以前虽然知道这个事情,但是从没有过深刻的教训,基本上在少数人实用时几乎不会遇到重复问题,但是上万人使用时会遇到重复问题,需要程序里进行精心处理才会不重复。
先写到这里吧,其实可写的东西还很多,这只是属于其中的比较明显的一部分吧,还有服务器负载均衡、服务器安全、数据备份等等蛮多环节。