posts - 7,  comments - 0,  trackbacks - 0
            2010年2月23日
          編程語言
          首先要能跳出語言之爭(zhēng)及語言偏見,架構(gòu)師需要在中立的角度選擇最合適團(tuán)隊(duì)的語言,避免在技術(shù)決策中加入過多個(gè)人喜好。在系統(tǒng)語言層面,主要可關(guān)注以下幾種
          Erlang, 會(huì)繼續(xù)在小圈子內(nèi)流行,業(yè)界應(yīng)用Erlang技術(shù)最大的障礙不是Erlang技術(shù)本身,而在于缺乏這方面專業(yè)人才。
          Scala, 和Erlang不同,Scala有成熟JVM及豐富的周邊library,在異構(gòu)系統(tǒng)中集成也很容易,新項(xiàng)目使用Scala風(fēng)險(xiǎn)很小,所以Scala在新語言中應(yīng)該有較大的提升優(yōu)勢(shì)。
          Go, 由于剛開始推出,不適合正式項(xiàng)目使用,2010年會(huì)穩(wěn)步上升,可適當(dāng)關(guān)注。
          其他語言基本保持現(xiàn)狀。java論壇

          架構(gòu)
          LAMP中的Linux, Apache, MySQL會(huì)受到云計(jì)算中的App Engine模式的沖擊,因?yàn)锳pp Engine在分布式處理,可擴(kuò)展性,穩(wěn)定性方面都有很大的優(yōu)勢(shì)。 在App Engine模式中,MySQL作用會(huì)降低,退化成一種存儲(chǔ)服務(wù)。而且App Engine的存儲(chǔ)服務(wù)含義會(huì)更廣泛,傳統(tǒng)架構(gòu)中的MySQL, Memcached, 及key value store在App Engine框架下都會(huì)以底層的服務(wù)方式提供。存儲(chǔ)不再是軟件,而是一種可靠服務(wù),因此也會(huì)帶來分布式存儲(chǔ)相關(guān)技術(shù)的繁榮。

          Web 2.0的設(shè)計(jì)中,Cache會(huì)成為一個(gè)中心元素。傳統(tǒng)的web應(yīng)用cache只是一個(gè)可選的錦上添花層,即使去掉,PHP + MySQL這種模式也可正常運(yùn)行。但隨著未來應(yīng)用social化及realtime的趨勢(shì),從facebook及twitter的設(shè)計(jì)來看,cache已經(jīng)從可選層成為核心層。cache設(shè)計(jì)的好壞直接決定架構(gòu)的成敗。

          由于web發(fā)展的趨勢(shì)會(huì)使應(yīng)用更realtime化,體現(xiàn)到技術(shù)層面是HTML5(websockets)及類似技術(shù)具有更高的價(jià)值。但由于阻礙生產(chǎn)力的IE存在,HTML5無法一步到位。建議關(guān)注能解決HTML5及舊ajax自適應(yīng)的框架。

          網(wǎng)絡(luò)模型方面,由于多核的硬件環(huán)境,輕量級(jí)的進(jìn)程模型值得采用。如傳統(tǒng)的C++ boost的asio, 各公司自己實(shí)現(xiàn)的coroutine, Erlang的process, go的goroutines, Java/Scala的Netty/Mina框架等。但C++框架的代碼優(yōu)雅性可維護(hù)性欠佳,性能也沒有突出的優(yōu)勢(shì),可關(guān)注后面幾種方案。

          分布式方面,Dynamo及Chubby的思想會(huì)逐漸在國(guó)內(nèi)的項(xiàng)目等到更廣泛的應(yīng)用,架構(gòu)師會(huì)逐步丟棄雙寫,雙機(jī)心跳等山寨式的容錯(cuò)設(shè)計(jì)思想,可靠的分布式設(shè)計(jì)思想會(huì)更普及。

          存儲(chǔ)
          2009是key value/nosql產(chǎn)品百花齊放的年代。到2010年,它們之中優(yōu)秀的會(huì)脫穎而出逐步主流化,主流化的產(chǎn)品周邊的工具會(huì)更豐富,運(yùn)維相關(guān)經(jīng)驗(yàn)也會(huì)更成熟。目前阻礙很多key value產(chǎn)品推廣很大一個(gè)障礙是運(yùn)維的顧慮,而不是它們本身的性能。究竟會(huì)是Memcachedb/Tokyo Cabinet/Redis這樣的小巧軟件走向主流,還是Cassandra這樣的巨無霸更受歡迎,我們拭目以待。
          posted @ 2010-03-03 09:33 Mison 閱讀(124) | 評(píng)論 (0)編輯 收藏

          備忘下地址,Black設(shè)計(jì)模式解析的還不錯(cuò)。http://hi.baidu.com/misoner/blog/item/2334e388d8defd749e2fb429.html
          posted @ 2010-03-02 10:18 Mison 閱讀(111) | 評(píng)論 (0)編輯 收藏
          posted @ 2010-02-26 09:23 Mison 閱讀(244) | 評(píng)論 (0)編輯 收藏
          下載地址:http://bbs.misonsoft.com/thread-1755-1-1.html
          posted @ 2010-02-24 14:13 Mison 閱讀(127) | 評(píng)論 (0)編輯 收藏
          裝載:Mison(邁勝)http://bbs.misonsoft.com/thread-1225-1-2.html

          通過鐵路售票程序來理解實(shí)現(xiàn)多線程的兩種方法:通過java.lang.Thread類和通過Runnable接口
            java中有兩種實(shí)現(xiàn)多線程的方式。一是直接繼承Thread類,二是實(shí)現(xiàn)Runnable接口。那么這兩種實(shí)現(xiàn)多線程的方式在應(yīng)用上有什么區(qū)別呢?
            為了回答這個(gè)問題,我們可以通過編寫一段代碼來進(jìn)行分析。我們用代碼來模擬鐵路售票系統(tǒng),實(shí)現(xiàn)通過四個(gè)售票點(diǎn)發(fā)售某日某次列車的100張車票,一個(gè)售票點(diǎn)用一個(gè)線程表示。
            我們首先這樣編寫這個(gè)程序:
           public class ThreadDome1
            
          public static void main(String[] args)
            ThreadTest t 
          = new ThreadTest(); 
            t.start(); 
            t.start(); 
            t.start(); 
            t.start(); 
            }
           
            }
           
            
          class ThreadTest extends Thread
            
          private int ticket = 100
            
          public void run()
            
          while(true)
            
          if(ticket > 0)
            System.out.println(Thread.currentThread().getName() 
          + 
            
          "is saling ticket" + ticket--); 
            }
          else
            
          break
            }
           
            }
           
            }
           
            }
          上面的代碼中,我們用ThreadTest類模擬售票處的售票過程,run方法中的每一次循環(huán)都將總票數(shù)減1,模擬賣出一張車票,同時(shí)該車票號(hào)打印出來,直接剩余的票數(shù)到零為止。在ThreadDemo1類的main方法中,我們創(chuàng)建了一個(gè)線程對(duì)象,并重復(fù)啟動(dòng)四次,希望通過這種方式產(chǎn)生四個(gè)線程。從運(yùn)行的結(jié)果來看我們發(fā)現(xiàn)其實(shí)只有一個(gè)線程在運(yùn)行,這個(gè)結(jié)果告訴我們:一個(gè)線程對(duì)象只能啟動(dòng)一個(gè)線程,無論你調(diào)用多少遍start()方法,結(jié)果只有一個(gè)線程。
            我們接著修改ThreadDemo1,在main方法中創(chuàng)建四個(gè)Thread對(duì)象:
           public class ThreadDemo1
            
          public static void main(String[] args)
            
          new ThreadTest().start(); 
            
          new ThreadTest().start(); 
            
          new ThreadTest().start(); 
            
          new ThreadTest().start(); 
            }
           
            }
           
            
          class ThreadTest extends Thread
            
          private int ticket = 100
            
          public void run()
            
          while(true)
            
          if(ticket > 0)
            System.out.println(Thread.currentThread().getName() 
          + 
            
          " is saling ticket" + ticket--); 
            }
          else
            
          break
            }
           
            }
           
            }
           
            }

          這下達(dá)到目的了嗎?
            從結(jié)果上看每個(gè)票號(hào)都被打印了四次,即四個(gè)線程各自賣各自的100張票,而不去賣共同的100張票。這種情況是怎么造成的呢?我們需要的是,多個(gè)線程去處理同一個(gè)資源,一個(gè)資源只能對(duì)應(yīng)一個(gè)對(duì)象,在上面的程序中,我們創(chuàng)建了四個(gè)ThreadTest對(duì)象,就等于創(chuàng)建了四個(gè)資源,每個(gè)資源都有100張票,每個(gè)線程都在獨(dú)自處理各自的資源。
            經(jīng)過這些實(shí)驗(yàn)和分析,可以總結(jié)出,要實(shí)現(xiàn)這個(gè)鐵路售票程序,我們只能創(chuàng)建一個(gè)資源對(duì)象,但要?jiǎng)?chuàng)建多個(gè)線程去處理同一個(gè)資源對(duì)象,并且每個(gè)線程上所運(yùn)行的是相同的程序代碼。在回顧一下使用接口編寫多線程的過程。
           public class ThreadDemo1
            
          public static void main(String[] args)
            ThreadTest t 
          = new ThreadTest(); 
            
          new Thread(t).start(); 
            
          new Thread(t).start(); 
            
          new Thread(t).start(); 
            
          new Thread(t).start(); 
            }
           
            }
           
            
          class ThreadTest implements Runnable
            
          private int tickets = 100
            
          public void run()
            
          while(true)
            
          if(tickets > 0)
            System.out.println(Thread.currentThread().getName() 
          + 
            
          " is saling ticket " + tickets--); 
            }
           
            }
           
            }
           
            }

          上面的程序中,創(chuàng)建了四個(gè)線程,每個(gè)線程調(diào)用的是同一個(gè)ThreadTest對(duì)象中的run()方法,訪問的是同一個(gè)對(duì)象中的變量(tickets)的實(shí)例,這個(gè)程序滿足了我們的需求。在Windows上可以啟動(dòng)多個(gè)記事本程序一樣,也就是多個(gè)進(jìn)程使用同一個(gè)記事本程序代碼。
            可見,實(shí)現(xiàn)Runnable接口相對(duì)于繼承Thread類來說,有如下顯著的好處:
            (1)適合多個(gè)相同程序代碼的線程去處理同一資源的情況,把虛擬CPU(線程)同程序的代碼,數(shù)據(jù)有效的分離,較好地體現(xiàn)了面向?qū)ο蟮脑O(shè)計(jì)思想。
            (2)可以避免由于Java的單繼承特性帶來的局限。我們經(jīng)常碰到這樣一種情況,即當(dāng)我們要將已經(jīng)繼承了某一個(gè)類的子類放入多線程中,由于一個(gè)類不能同時(shí)有兩個(gè)父類,所以不能用繼承Thread類的方式,那么,這個(gè)類就只能采用實(shí)現(xiàn)Runnable接口的方式了。
            (3)有利于程序的健壯性,代碼能夠被多個(gè)線程共享,代碼與數(shù)據(jù)是獨(dú)立的。當(dāng)多個(gè)線程的執(zhí)行代碼來自同一個(gè)類的實(shí)例時(shí),即稱它們共享相同的代碼。多個(gè)線程操作相同的數(shù)據(jù),與它們的代碼無關(guān)。當(dāng)共享訪問相同的對(duì)象時(shí),即它們共享相同的數(shù)據(jù)。當(dāng)線程被構(gòu)造時(shí),需要的代碼和數(shù)據(jù)通過一個(gè)對(duì)象作為構(gòu)造函數(shù)實(shí)參傳遞進(jìn)去,這個(gè)對(duì)象就是一個(gè)實(shí)現(xiàn)了Runnable接口的類的實(shí)例。
          posted @ 2010-02-23 09:19 Mison 閱讀(188) | 評(píng)論 (0)編輯 收藏
          主站蜘蛛池模板: 中宁县| 河南省| 永城市| 拉萨市| 菏泽市| 健康| 盐津县| 霍林郭勒市| 溧水县| 芦山县| 剑河县| 曲松县| 陆良县| 宣恩县| 名山县| 建始县| 分宜县| 绥中县| 浦江县| 凤城市| 辽阳市| 华池县| 青河县| 新田县| 集贤县| 丹凤县| 崇阳县| 班戈县| 新建县| 谢通门县| 武夷山市| 元谋县| 西吉县| 宣城市| 东莞市| 策勒县| 伊金霍洛旗| 平武县| 格尔木市| 龙岩市| 开化县|