引言
由于最近LZ负责的业务系统频繁宕机,导致LZ疲于本命,上一个星期(因为现在是周一了,0.0)连续加了五天班,其中还包括周末,就是为了出一套应急方案。宕机的根本原因,现在已经渐渐真正的明晰了,最早的一次是因为消息发送与数据库操作的顺序错误导致的数据库宕机,目前已经通过顺序的调换解决了数据库的压力。然而数据库的问题解决之后,则开始是应用服务器出问题。最近频繁宕机的原因是连接数经常爆满,完全无法应付nginx的疯狂攻击。
经过与公司领导与业务人员的交流,最终才知道,由于业务模式的变化,导致LZ负责的业务系统用户剧增。因为高并发的原因,LZ的系统现在已经频繁的不堪重负,数次被压垮,提升服务器的响应速度已经迫在眉睫。最终定制的解决方案是比较主流的解决方案,也就是将前端采用集群部署,而后台与其它业务系统的交互,则会采用独立的服务器处理。不过这个方案并不能一解燃眉之急,集群的部署和前端与后台的分割都需要不短的时间进行部署和测试,因此只能安排到这周一(其实就是今天,0.0)才开始推行。
为了避免在系统向集群转换的过程中再出现问题,LZ与各位领导商量之后就制定了一个简单的应急方案,而LZ则担任了编写应急方案的职责。最近的几天,LZ就是在忙于编写这个应急方案(除此之外,还要边应付业务人员和其它同事对系统的不满,0.0),怎一个焦头烂额可以形容。
并发的意识
应急方案采用的方式是,增加用户数限制以及优先级的功能。用户数限制的功能类似于火车站之前的抢登陆,简单的说,就是这个系统只能若干个(比如1000个)用户登陆,后面来的用户将被拒绝登陆。优先级的功能,则是指在人数达到一定数目时,需要将某些角色的用户踢掉,让另外一部分角色的人优先使用系统(这是因为那些被踢的角色查询的数据量较大且对系统的依赖性不高,容易给服务器造成不必要的压力)。这个功能LZ一开始觉得挺简单的,但是当LZ真写起来的时候,才发现真的没有想象中的那么简单。
最开始的难度在于用户数的精确统计,因为用户数与session数量并没有直接关系,要想统计精确的用户数,必须按照用户名去重。这一点在找到适合的监听器(LZ使用的监听器是存在于web服务器中的HttpSessionAttributeListener,但这不一定适用于所有项目)之后被解决,方案就是记录每个用户的session数量,为0则代表该用户已退出,否则代表正在使用系统(也就是会算作1个用户)。
然而最难的地方却不是用户数的精确统计,而是并发所导致的难度。因为用户数是在高并发的情况下统计的,因此必须考虑并发的情况,在代码中添加适当的同步,即要保证统计数据的正确性,又得保证足够的性能。如果因为这个数量统计而影响性能,那就与这个功能的意义背道而驰了。
这还是LZ第一次在高并发的情况下编程(以前其实也有,只是由于功能并不核心,所以从未考虑过性能,只是无脑的在方法上使用synchronized),每写一句代码,都要考虑如果有成百上千个线程同时运行会如何。这每一句代码似乎都成了美女,每一个都可能有成百上千个大爷翻牌,而且还是同时,因此到底如何同时伺候N(N>1)个大爷,自然就成了一个问题。这也算是LZ第一次在编程的过程中,真真切切的产生了并发的意识。
书中自有黄金屋
或许是老天开眼,也或许是LZ运气尚且说的过去,在这之前的几个星期,LZ刚买了一本关于并发编程的书籍,一直都没有看。这下可好了,刚好派上用场,因此拿起这本书不到两天,LZ就一口气读了将近一半。最终也算是临时抱佛脚,将这个应急方案给应付过去了。
由于LZ只是为了应付当前的情况,所以并没有细读,尽管读的过程中都读懂了,也与作者有深深的共鸣,但过后其实印象并不深。不过这足以让LZ度过当前的难关了,在编写这段并发代码时,LZ主要采取了以下几种小技巧(基于书中的思想)。
1、将原本存在于监听器和过滤器的属性全部提出,使得两者不再需要考虑线程安全的问题。
2、提出的属性放在单独的两个类(session有效列表和session无效列表,无效列表其实就是可能要被踢的session)当中,这两个类都是单例,并确保这两个类是线程安全的。
3、由于需要遍历一个装满session的集合实现踢人的功能,因此采用备份的方式。如此一来,在遍历session并使得session失效时,并不会锁住失效session的列表,这样可以极大的提高性能(前提是限制的用户数并不高)。
4、在监听器与过滤器使用这两个单例类时,坚决杜绝各种竞态条件或者复合操作。
5、重构现有的代码,让需要同步的地方集中在一起,减少性能的损耗。
这算是LZ从书中紧急领略的几个方式,今天LZ的应急方案已经正式上线,是否能顶住高并发还有待考量。不过LZ是领略了书中的一部分真谛才下的手,而非一时臆测,因此还是有一定把握的。(希望明早一上班不会被业务部门炮轰,0.0)
黄金屋的诱惑
由于这次事件,LZ已经彻底爱上了这本并发编程(前几天还说爱上了深入理解那本书,有点花心啊)。这本书并不厚,才200多页,LZ用了一天半不到的时间看了80页,准备直接趁热打铁,等看完这本书之后,再继续深入理解和设计模式这两本书。因此最近的计算机系统原理系列可能要延迟一下了。
本文写的十分匆忙(今晚其实刚加过班,0.0),因此难免漏洞百出,各位猿友如果遇到过类似高并发的问题,可以畅述己见,让LZ等一届屌丝得以一窥天机。时间已经不早了,各位猿友明早见分晓吧。
相关推荐
在Java编程领域,跃达创新是一家知名的教育机构,致力于提供高质量的Java培训课程。这份"跃达创新Java培训课堂笔记"是学习Java技术的重要资源,尤其对于初学者和希望深入理解Java的开发者来说,它提供了详实的学习...
Nginx 是一款高性能的 HTTP 服务器,它以其轻量级的内存占用和高并发能力而著名。作为一款反向代理服务器,Nginx 不仅能提供静态文件服务,还能进行动态请求的转发,实现负载均衡,以及隐藏真实服务器地址等功能。 ...
它主要关注系统在高负载或大量并发用户访问时的行为。这篇性能测试教学笔记,基于一位有着十年经验的教师的实践,提供了丰富的知识和指导,旨在帮助读者深入理解和应用性能测试。 1. **Web_link 与 URL 的依赖关系*...
对于需要处理大量并发连接和高流量的场景,LVS提供了强大的支持。 ##### 1.1 为什么选择LVS? - **并发处理能力强**:当单一服务器无法应对大规模并发访问时,LVS可以有效地将流量分发到多台服务器,提高整体系统...
- **移动应用测试:** 测试移动应用在高并发情况下的稳定性和响应速度。 - **企业级应用测试:** 如ERP、CRM等系统,在上线前进行性能验证。 - **数据库性能测试:** 检测数据库在大量数据处理时的表现。 #### 二、...
3. **反向代理**:Nginx作为反向代理服务器,可以隐藏后端真实服务器,提高系统安全性,同时进行负载均衡。 **二、Nginx安装与配置** 1. **安装**:在Linux系统中,可以通过包管理器(如apt-get或yum)或者源码...
在现代网络架构中,负载均衡是提高服务可用性和扩展性的关键技术之一。随着互联网业务的不断扩展,...掌握了这些技术,可以有效地提升服务的处理能力,保证用户访问的稳定性和速度,满足业务高并发和高扩展性的需求。
同时,NIO(非阻塞I/O)提供了一种更高效的数据传输方式,适用于高并发的系统设计。 在【Java笔记图解7】中,你可能还会接触到泛型、反射、枚举、注解等高级特性。泛型增加了类型安全,反射提供了运行时操作类的...
在高并发环境下,了解锁的类型(共享锁、独占锁)和死锁处理是必要的。 五、备份与恢复 DB2提供了多种备份和恢复策略,如全备、增量备、日志备份等。在出现故障时,可以通过这些备份进行数据恢复,确保业务连续性。...
【LoadRunner学习笔记】 LoadRunner是一款强大的性能测试工具,它主要用来模拟真实用户负载,测试系统在各种压力下的性能...学习LoadRunner可以帮助我们更好地进行系统性能调优,确保软件在高并发场景下的稳定运行。
性能测试是IT行业中一个至关重要的领域,特别是在软件开发和运维过程中,它用于评估系统、应用程序或网络在高负载和压力条件下的性能、稳定性和可扩展性。这份“性能测试笔记”压缩包文件很可能是对这一主题的深入...
CVS是最早的开源版本控制系统之一,它可以跨平台使用,并支持并发版本控制。虽然CVS功能强大,简单易用,但其部署过程相对复杂,且随着技术发展,许多开发者转向了SVN。 SVN(Subversion)是CVS的改良版,它解决了...
《LoadRunner11操作手册笔记》是对HP的性能测试工具LoadRunner 11全面而深入的解析,旨在帮助用户熟练掌握这...通过深入理解和实践这些知识点,可以有效地评估和优化软件系统的性能,确保其在高并发环境下的稳定运行。
1. **NoSQL数据库**:非关系型数据库,适用于大规模数据集和高并发场景,提供了更灵活的数据模型和更高的扩展性。 2. **云数据库服务**:提供按需付费的数据库托管服务,减轻了本地部署和维护的压力,同时支持弹性...
### LVS部署笔记 ...通过以上配置步骤,可以实现LVS在不同模式下的基本部署,从而达到高并发的服务需求。值得注意的是,在实际应用中还需要考虑更复杂的网络拓扑结构和故障转移机制,以确保系统的稳定性和可靠性。
《LoadRunner测试工具详解》 LoadRunner是一款由Micro Focus公司开发的企业级负载和性能测试工具,广泛应用于...通过深入理解和熟练运用这些知识点,可以确保我们的应用在高并发环境下依然能保持良好的性能和稳定性。
【LoadRunner 8.1 操作笔记】 LoadRunner 8.1 是一款强大的性能测试工具,主要用于检测和分析软件在高负载环境下的性能表现。它能够模拟大量虚拟用户执行各种业务操作,以此来重现真实生产环境中的并发情况,从而...
它是Google搜索引擎、Gmail等服务背后的基础架构之一,支持高并发和低延迟的数据访问。 5. **SSTable(Sorted String Table)**:SSTable是分布式存储系统中常见的一种数据格式,通常用于构建LSM-Tree(Log-...
然而,这个限制可以通过适当的配置进行调整,以满足更高的并发需求。为了建立连接,客户端需要知道服务器的相关信息,包括: 1. **地址**:这通常由节点号组成,例如节点号16#12,这是一个十六进制表示的地址,用于...
- **CMS Collector**: 并发标记-清扫垃圾回收器,适合追求低延迟的应用场景。 - **G1 Collector**: 基于区域的垃圾回收器,适用于大堆。 #### 四、JVM参数配置 - **-Xms**: 设置初始堆大小。 - **-Xmx**: 设置最大...