大量並發的應急處理方案與實踐1——非同步處理

來源:互聯網
上載者:User

     首先需要說明的是本人覺得大部分應用系統效能問題出在資料庫應用方面,如SQL語句設計,索引設計問題等。本文所提到的方法比較適合初學者。

 

     往往我們會遇到這樣的問題,以前一直運行良好的系統由於突然遇到大量並發訪問而崩潰,這時你的客戶和老闆全都急上了房。情況緊急重新改造系統架構非常困難需要時間。這時你非常後悔,如果當時採用分布式架構那麼現在只要水平增加應用或資料服務器就好了,所有現存資料和應用也不會受到任何影響。關於系統架構可參考我的另一篇文章:《開餐館與做軟體——如何提高大型網站效能》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();
                   }

              }

        }

 }


   

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.