前言:前段时间在网上看到腾讯后台开发总监bison分享的一篇文章《浅谈过载保护》,读来受益匪浅。
刚好自己也在处理系统请求过载的问题,把自己的一些心得体会总结出来拿来与大家一起探讨。
在bison的文章中谈到:对于延时敏感的服务,当外部请求超过系统处理能力,如果系统没有做相
应保护,可能导致历史累计的超时请求达到一定的规模,像雪球一样形成恶性循环,由于系统处理的每个
请求都因为超时而无效,系统对外呈现的服务能力为0,且这种情况不能自动恢复。我们的系统就是要尽
量避免这种情况的出现,下面将详细来分析一个现实中的案例。
一 有过载问题的系统
数据处理流程:
1) 前端将请求发送给数据解析及转发系统,
2)数据解析及转发系统将封装好的数据发送后台数据请求,设置超时时间(假设300ms),线程同步等待处
理结果从后台返回。
3)在300ms内正确返回结果后,则将处理的结果返回给前端,如果在300ms内超时,则将数据发送到一次超
时处理系统(假设设置超时时间500ms),线程同步等待结果返回。
4)在500ms内正确返回结果后,则将处理的结果返回给前端,如果再一次超时,返回一个默认的处理结果给前
端,后端对数据进行本地化,然后可以将数据发送到离线处理系统进行二次处理。
数据解析的机器为多核,数据解析及转发系统采用的是单进程多线程模型,在前一篇文章《海量数据处理系列
之Java线程池使用》详细描述了多线程处理的实现,采取的是无界队列线程池的实现,这样从客户端来的请求,会被
这样处理:
1) 如果线程池中有空闲线程,会将请求直接交给线程处理。
2) 如果没有空闲线程,就将请求保存到任务队列。
假设开50个线程,每个线程秒平均处理一个请求,那么系统每秒可以处理的最大请求数是50个。一旦前端数据请求超
过50个每秒,在任务队列中将会堆积大量的请求,前台不断发送过来,后来处理不过来,前端又设置了套接字超时,导
致队列中的大量请求超时,直接使得后端线程从队列中取出套接字解析的时候,套接字已经被前台关闭了,引发I/O异常。
堆积的量一旦雪崩,将使前台发送过来的请求全部I/O异常,后台处理系统跟挂掉无异了。
二 相对完善的系统
在上面的系统中,对请求是来者不拒的状态,具体来讲就是将所有的请求都保存到任务队列。请求堆积到一定程度,
队列中的很多请求都超时,这是可以采取清空请求队列的方式,这个可以通过采取一定的监控方式来实现。例如上图
中的心跳监控模块,它可以通过这样的方式来实现,就是模拟客户端的请求,每隔一定时间发送一些请求过去,如果
有大部分都正常返回,说明后端处理系统正常;当出现大部分超时的时候,说明后台系统已经挂掉了,这时候重启数
据解析及转发系统,清空系统中的任务请求队列,这样可以暂时处理请求高峰期的情况。
但是这个方式也是治标不治本的,后台最多只能处理这么多请求,重启后照样会导致大量堵塞导致系统又挂掉,
然后监控系统又重启,这样会使得很多的请求没有得到有效的处理,大大降低系统的处理能力。为了保证后台系统每
时每刻都最大限度的发挥自己的处理能力,当负载超过系统自身的处理能力时,拒绝该请求。拒绝后可以将该请求本
地系列化,保存相关的数据发送到离线数据处理系统进行处理。
在前一篇文章《海量数据处理系列之Java线程池使用》第四节中有界队列线程池使用中有提到这种方式的具体实现。
以上面的系统为例,有界线程池可以这样配置,corePoolSize为30,maximumPoolSize为50,有界队列为
ArrayBlockingQueue<Runnable>(100)。
这样系统在处理请求的时候采用如下策略:
1) 当一个请求过来,线程池开启一个线程来处理,直到30个线程都在处理请求。
2) 当线程池中没有空闲线程了,就将请求添加到有界队列当中,直到队列满为止。
3) 当队列满以后,在开启线程来处理新的请求,直到开启的线程数达到maximumPoolSize。
4) 当开启的线程数达到maximumPoolSize后,任务队列又已经满了后,此时再过来的请求将被拒绝,被拒绝的请求
在本地系列化,将保存的数据同步到离线数据系统进行处理。
海量数据处理都是采用分布式的,每台机器的处理能力有限,可以将请求分布到不同的机器上去。如果每台机器被
拒绝的请求数过多的时候,就要考虑添加处理的机器了。
分享到:
相关推荐
在技术研究领域,本文的作者王彩玲,来自西安石油大学计算机学院,其主要研究方向为遥感影像数据处理技术,其工作展示了她和她的团队在海量数据处理方面的专长,以及在构建高性能计算机群架构方面的深厚技术积累。...
各系统业务处理方式和流程不同,导致性能指标存在差异,不是所有系统都需要承担高峰值处理能力,因此需要削峰和流量控制功能,以及统一的产能监控和过载保护机制。 在系统保护方面,OFC系统借鉴PID(比例-积分-微分...
综上所述,OFC系统作为电商领域处理海量订单的核心组件,不仅需要具备强大的数据处理能力,还需要高度的可扩展性和可靠性,以确保在面对日益增长的订单量时依然能够保持高效稳定的运行。通过上述技术实现和优化措施...
综上所述,网络游戏中的网络服务器端海量数据处理涉及负载均衡、数据存储优化、异步处理、分布式计算、硬件配置和监控等多个方面。有效的数据处理方法和装置对于维持游戏的正常运行,提高玩家体验至关重要。通过不断...
在J2EE环境中,处理高并发和海量数据是一项复杂而重要的任务。这涉及到多个方面的技术栈,包括系统架构设计、数据库...这些技术和策略的灵活运用,可以帮助开发者构建出能够应对大规模并发和海量数据挑战的高效系统。
### 海量数据网格存储与处理 #### 一、海量数据网格存储架构 **1.1 分层网格架构** - **热数据存储**: 使用高速闪存或内存来存储经常访问的热数据,确保低延迟访问。 - **温数据存储**: 采用固态硬盘(SSD)或混合...
在大数据时代背景下,全球卫星导航系统(GNSS)所面对的主要挑战包括海量数据的存储、管理和高效处理。传统的集中式存储与计算方法往往难以满足大数据的“5V”特性——即体积(Volume)、速度(Velocity)、多样性...
在这一模型中,线程池负责管理后台数据处理的线程,连接池确保数据库访问的高效性,而数据Cache则用于存储和快速检索常用数据,共同构成了一个高效、稳定的海量数据处理系统。以网络短信平台的数据处理为例,该模型...
总结来说,网络游戏通信网络的数据处理系统是整个游戏运行的基石,它既要处理海量数据,又要保证低延迟和高可靠性。理解并优化这一系统,对于开发者来说至关重要,对于玩家来说则意味着更好的游戏体验。
该模型的主要目的是提高系统在处理海量数据时的数据处理效率。在大数据环境下,由于数据的规模巨大、种类繁多,传统的数据处理方式往往无法满足实时性和效率的需求。 论文《基于接收与处理分离的实时大数据处理模型...
此外,文章讨论了分布式系统中的数据一致性、容错性和安全性等问题,这些都是构建稳定、可靠的海量数据服务系统的关键因素。数据一致性确保了在分布式环境中数据的一致性状态,而容错性则保证了系统在部分节点故障时...
本文档《面向海量数据存储的Erasure-Code分布式文件系统I/O优化方法.pdf》详细介绍了针对Erasure Code分布式文件系统I/O性能优化的策略。 首先,文件标题“面向海量数据存储的Erasure-Code分布式文件系统I/O优化...
- 文档还提到了未来的策略,可能包括优化测试框架、提高测试效率、改进数据处理流程等,以更有效地管理验证数据过载。 7. **测试类别与覆盖范围**: - 测试类别包括功能测试、OpenJDK性能测试、外部系统测试和...
这种海量数据的存储与管理成为了一个挑战,因为如果全部依赖中心服务器,可能会导致服务器过载,网络交互频繁,影响用户体验。因此,研究如何在智能移动终端上进行数据存储和性能优化变得至关重要。 移动大数据具有...
淘宝网数据处理方法的研究主要集中在如何有效地管理和分析海量的用户数据,以提升电子商务的运营效率和用户体验。在互联网时代,淘宝网作为中国最大的在线购物平台,积累了大量的用户行为数据,这些数据包括但不限于...
通过分析这些技术在天文数据处理中的应用,文章证明了在数据高效存储方面的不足,同时展示了一个基于Cassandra的高性能存储系统的可行性。 总结来说,文章深入分析了Cassandra在处理海量天文数据存储与检索中的应用...
实验结果表明,改进后的平台不仅提高了数据处理速度,而且保证了数据处理的准确性,这对于解决信息过载和提高信息检索效率具有重要的实际意义。 关键词包括:文本挖掘、Hadoop、云计算、文本数据。文本挖掘指的是从...