本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/Dreamcode/archive/2010/05/26/5624429.aspx
大量并发的应急处理方案与实践1——异步处理
往往我们会遇到这样的问题,以前一直运行良好的系统由于突然遇到大量并发访问而崩溃,这时你的客户和老板全都急上了房。情况紧急重新改造系统架构非常困难需要时间。这时你非常后悔,如果当时采用分布式架构那么现在只要水平增加应用或数据服务器就好了,所有现存数据和应用也不会受到任何影响。关于系统架构可参考我的另一篇文章:《开餐馆与做软件——如何提高大型网站性能》http://blog.csdn.net/Dreamcode/archive/2009/09/10/4540153.aspx
现在我们只好采用一些应急的解决方案。 举例来说,一个房间只能容纳500人,现在突然来了1000人这时我们该怎么办?
办法有两个:一是增加房间面积,这个办法如同水平增加应用或数据服务器,需要对架构进行重新设计,因此将涉及很多问题,或许并不比重新造省时间。另一个办法就是让客人排队,当屋里有人出去,再让别人进来,即异步处理。
异步处理,当资源不足的情况下对已经到来的访问请求并不马上处理而是让这些请求排队等候,直到有可用的资源再进行处理。这种办法的代价就是时间,不能及时返回处理结果。但是当我们没有条件改造房屋的时候这是唯一的办法。
现在有个问题,我们让客人在哪里排队,大厅(硬盘)还是门口(内存)。答案似乎很明显,哪里离房间近最好就在哪里等,但是,速度快的地方往往空间不富裕。将用户请求以某种方式先保存在硬盘上是一种比较常用的方法,当然也因此多了一步将数据加载到内存地过程。
在内存中将数据排队的方法,可使用数组,哈希表,链表等数据结构,也可使用消息队列等现成的组件如ActiveMQ 。如我们使用一个单例模式的Map 对象,保存来自多个并发的请求。
import java.util.Map;
public class TestMap {
private volatile static TestMap singleton=null;
private static Map testmap = null;
private TestMap(){}
public static TestMap getInstance()
{
if(singleton==null){
synchronized(TestMap.class)
{
singleton=new TestMap();
}
}
return singleton;
}
public Map getTestmap() {
return testmap;
}
public void setTestmap(Map testmap) {
TestMap.testmap = testmap;
}
}
在硬盘中排队,就是将数据直接写到硬盘里,例如在Java 中可将对象直接保存到硬盘中,代码如下:
public static boolean writeObject(String filePath, Object entity)
{
FileOutputStream fos = null;
try {
fos = new FileOutputStream(filePath);
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
return false;
}
ObjectOutputStream oos;
try {
oos = new ObjectOutputStream(fos);
oos.writeObject(entity);
oos.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
return false;
}
return true;
}
public static Object readObject(String filePath)
{
Object entity = null;
FileInputStream fis = null;
try {
fis = new FileInputStream(filePath);
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
ObjectInputStream ois;
try {
ois = new ObjectInputStream(fis);
try {
entity = ois.readObject();
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
ois.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return entity;
}
最后我们需要一个监控模块(如一个线程)进行调度, 例如:
public class testThread implements Runnable{
private static long interval = 3000; //循环间隔
@Override
public void run(){
while(true)
{
... //这里是需要执行的代码
try {
Thread.sleep(interval);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
分享到:
相关推荐
第1部分概述 1 1 交易型系统设计的一些原则 2 1.1 高并发原则 3 1.1.1 无状态 3 1.1.2 拆分 3 1.1.3 服务化 4 1.1.4 消息队列 4 1.1.5 数据异构 6 1.1.6 缓存银弹 7 1.1.7 并发化 9 1.2 高可用原则 10 1.2.1 降级 10...
Java中的多线程技术是Java进阶学习的重要组成部分,它涉及到并发编程的理论与实践,旨在提高程序的执行效率和响应速度。以下是对多线程技术的详细解释: 1. **CPU调度算法原理** - **先来先服务(FCFS)**:按照...
本指南主要围绕两大并发编程技术展开——`NSOperation` 和 `Dispatch Queues`,并提供了丰富的实例来帮助开发者掌握这些技术。 #### 二、`NSOperation` 和 `Dispatch Queues` **1.1 `Dispatch Queues`** `...
这些研究成果对于改善Linux在高负载、高并发环境下的性能,尤其是在磁盘阵列等I/O密集型应用中,具有重要的理论和实践意义。同时,对于系统开发者和研究人员,提供了改进操作系统中断机制的参考和指导。
《银行调度系统设计与优化——基于“张孝祥”实例解析》 银行调度系统是金融机构中不可或缺的关键组成部分,它负责高效、公平地处理各种客户服务请求,如存款、取款、转账等操作。在这个领域,张孝祥老师的名字常常...
本系统——“软件缺陷管理系统”采用JavaWeb技术栈,结合流行的前端框架LayUI,构建了一套高效、易用的缺陷追踪与处理平台。该系统不仅提供了全面的缺陷记录、分类、优先级设置等功能,还包含了用户权限管理、工作...
中断是一种计算机硬件机制,用于暂停当前正在执行的程序,转而处理突发事件或紧急任务。中断可以是外部设备(如键盘、鼠标)或内部硬件(如定时器)产生的。中断请求可以是同步的(如定时器溢出)或异步的(如外部...
《事件队列管理库——lib-eq》 在IT领域,事件驱动编程是一种常见的编程模型,尤其在系统级编程和实时应用中。事件队列(Event Queue)是这种模型的核心组成部分,它负责组织和调度待处理的事件。本文将深入探讨名...
尽管RTOS的引入会增加一定的学习成本,但其带来的好处——尤其是对于需要处理多种并发任务的项目——无疑是显著的。因此,熟悉并掌握如何在STC16平台上使用RTOS是提升嵌入式系统设计能力的关键一步。
多级中断作用是指对各类中断信号依据其紧急程度和重要性划分级别,并解决如果有重要程度相当的多个中断信号同时到达时,如何选择首个被处理的中断信号的问题。 操作系统原理是计算机系统中的一个核心组件,掌握操作...
**C#实现北斗终端设备与平台通信协议——JTT808协议详解** 北斗卫星导航系统作为中国自主研发的全球卫星导航系统,其在交通管理、公共服务、应急救援等多个领域都有广泛应用。而通信协议是北斗终端设备与管理平台...
《C# 学习与提高:网络编程基础及聊天程序实现》 网络编程是现代软件开发中的重要组成部分,尤其在C#编程环境中,利用Socket进行网络通信是常见的技术实践。本文将围绕C#网络编程的基础知识,结合实例——编写简单...
全局队列在iOS和Mac开发中是一个非常重要的概念,它主要与Apple的多线程技术——GCD(Grand Central Dispatch)紧密相关。GCD是Apple为解决多核处理器环境下并发问题而引入的一种高效、易用的底层编程接口。在...
《按键公平调度的队列——探索Clojure中的...对于那些需要处理大量并发任务且重视调度公平性的项目来说,clj-queue-by是一个值得考虑的工具。通过深入研究和运用,开发者可以更好地掌握队列调度的策略,提高系统性能。
《uC OS课件》是针对嵌入式系统领域中广泛应用的操作系统——uC/OS-II进行深入讲解的一套教学资源。该课件由任哲编著,旨在帮助学习者理解和掌握uC/OS-II操作系统的核心概念、设计原理以及实际应用。下面我们将详细...
资源调度是MQ在处理大量并发请求时优化性能和确保公平性的重要机制。 在Java开发环境中,有许多开源的消息队列实现,如Apache ActiveMQ、RabbitMQ、Kafka等。这些MQ服务通常都提供了自己的资源调度策略,以管理生产...
此外,printk还支持同步和异步两种模式,同步模式下,printk会立即执行打印操作,而异步模式下,信息会被暂时存储,待系统空闲时再进行输出,这对于高并发环境下的性能优化至关重要。 通过分析"printk.c",我们可以...
多线程与并发 GC机制 GC收集器类型 串行 CMS 并行 G1 算法 复制 标记清理 标记整理 分区 新生代 eden survivor 老年代(old区) 永久代(perm区) 版本变化 1.5 1.6 1.7 1.8 1.9 IO/NIO IO...
《Akka特性与模式探索——基于C#的阿卡游乐场》 在软件开发的世界里,Akka.NET是一个强大的工具,它提供了高度可扩展、容错性和并行性的解决方案。Akka是用Scala语言编写的,但在.NET生态系统中,我们有Akka.NET,...