<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    放翁(文初)的一畝三分地

      BlogJava :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理 ::
      210 隨筆 :: 1 文章 :: 320 評論 :: 0 Trackbacks

    2009年3月4日 #

         摘要: Beatles小記(三)-分布式數據流分析中Master的橫向擴展  閱讀全文
    posted @ 2012-01-17 13:21 岑文初 閱讀(5248) | 評論 (2)編輯 收藏

         摘要: Beatles小記-分布式數據流分析框架(二),局部代碼設計和實現分享  閱讀全文
    posted @ 2011-12-09 16:44 岑文初 閱讀(4804) | 評論 (4)編輯 收藏

         摘要: 分布式流式數據分析設計和代碼分析  閱讀全文
    posted @ 2011-12-07 16:46 岑文初 閱讀(9658) | 評論 (7)編輯 收藏

         摘要: java優化設計實現細節分享  閱讀全文
    posted @ 2011-09-23 14:03 岑文初 閱讀(5103) | 評論 (1)編輯 收藏

         摘要: 兩個開放平臺內部組件開放   閱讀全文
    posted @ 2011-07-12 11:54 岑文初 閱讀(3768) | 評論 (2)編輯 收藏

         摘要: 討論一下并發消息下行的設計方案和實現  閱讀全文
    posted @ 2011-06-23 12:16 岑文初 閱讀(4547) | 評論 (0)編輯 收藏

         摘要: Jetty內部透明簡單實現  閱讀全文
    posted @ 2011-06-22 17:03 岑文初 閱讀(4006) | 評論 (0)編輯 收藏

         摘要: 慢連接&LazyParser  閱讀全文
    posted @ 2011-06-20 23:47 岑文初 閱讀(5343) | 評論 (0)編輯 收藏

         摘要: PipeComet測試  閱讀全文
    posted @ 2011-06-08 23:58 岑文初 閱讀(6936) | 評論 (0)編輯 收藏

         摘要: 一段代碼,幾句話  閱讀全文
    posted @ 2011-04-13 23:11 岑文初 閱讀(4588) | 評論 (1)編輯 收藏

         摘要: 開放平臺的技術問題  閱讀全文
    posted @ 2011-03-31 00:43 岑文初 閱讀(4821) | 評論 (4)編輯 收藏

         摘要: Web容器測試模型選擇  閱讀全文
    posted @ 2011-03-31 00:40 岑文初 閱讀(3378) | 評論 (0)編輯 收藏

         摘要: 十年  閱讀全文
    posted @ 2011-03-08 23:46 岑文初 閱讀(2917) | 評論 (6)編輯 收藏

         摘要: 模擬登錄看前端門外漢學習  閱讀全文
    posted @ 2011-03-03 23:26 岑文初 閱讀(5537) | 評論 (10)編輯 收藏

         摘要: 邏輯劃分線程池  閱讀全文
    posted @ 2011-03-01 00:32 岑文初 閱讀(5162) | 評論 (4)編輯 收藏

         摘要: OAuth2的一些改變  閱讀全文
    posted @ 2011-02-28 23:01 岑文初 閱讀(3409) | 評論 (0)編輯 收藏

         摘要: “淘寶的”開放平臺  閱讀全文
    posted @ 2011-02-23 23:39 岑文初 閱讀(5080) | 評論 (4)編輯 收藏

         摘要: 交流分享  閱讀全文
    posted @ 2011-02-20 23:58 岑文初 閱讀(4966) | 評論 (7)編輯 收藏

         摘要: ask & answer  閱讀全文
    posted @ 2011-01-12 23:22 岑文初 閱讀(3866) | 評論 (0)編輯 收藏

         摘要: 耗內存應用優化實際案例  閱讀全文
    posted @ 2010-12-22 23:40 岑文初 閱讀(4303) | 評論 (0)編輯 收藏

         摘要: Local Cache的小TIP   閱讀全文
    posted @ 2010-12-14 22:34 岑文初 閱讀(3414) | 評論 (4)編輯 收藏

         摘要: SD開放平臺技術分享  閱讀全文
    posted @ 2010-12-13 20:35 岑文初 閱讀(3199) | 評論 (2)編輯 收藏

         摘要: Facebook優化分享后記  閱讀全文
    posted @ 2010-12-12 19:43 岑文初 閱讀(3444) | 評論 (4)編輯 收藏

         摘要: 這篇文章將會從問題,技術背景,設計實現,代碼范例這些角度去談基于管道化和事件驅動模型的Web請求處理。建議從頭看,能夠從概念上更多的去理解和碰撞,其中的一些描述和例子也許不是很恰當,也希望得到更多的反饋。  閱讀全文
    posted @ 2010-11-25 14:44 岑文初 閱讀(4113) | 評論 (7)編輯 收藏

         摘要: 這篇文章將會從問題,技術背景,設計實現,代碼范例這些角度去談基于管道化和事件驅動模型的Web請求處理。建議從頭看,能夠從概念上更多的去理解和碰撞,其中的一些描述和例子也許不是很恰當,也希望得到更多的反饋。  閱讀全文
    posted @ 2010-11-24 01:26 岑文初 閱讀(3368) | 評論 (4)編輯 收藏

         摘要: 圖片是大綱,先拋出來,后續會有更詳細的文章分享  閱讀全文
    posted @ 2010-11-17 01:00 岑文初 閱讀(2646) | 評論 (2)編輯 收藏

         摘要: 如果關注開放平臺或者關注平臺的一些內容,這篇文章應該有點內容可看  閱讀全文
    posted @ 2010-10-11 23:42 岑文初 閱讀(2920) | 評論 (1)編輯 收藏

         摘要: 美國JavaOne之行內容,需要看直播請關注微博  閱讀全文
    posted @ 2010-09-22 15:55 岑文初 閱讀(1672) | 評論 (1)編輯 收藏

         摘要: 代碼背后的點滴,通過一些設計理念來分享技術的積累  閱讀全文
    posted @ 2010-09-09 02:05 岑文初 閱讀(4293) | 評論 (8)編輯 收藏

         摘要: 面試有感  閱讀全文
    posted @ 2010-09-02 11:31 岑文初 閱讀(2402) | 評論 (4)編輯 收藏

         摘要: 對同學性能優化總結的一點回復  閱讀全文
    posted @ 2010-08-23 16:58 岑文初 閱讀(2288) | 評論 (0)編輯 收藏

         摘要: ppt分享  閱讀全文
    posted @ 2010-08-10 07:48 岑文初 閱讀(3634) | 評論 (2)編輯 收藏

         摘要: 在概念篇介紹完以后,開始實際的對TOP開始做技術改造。(這篇東西更像是對短期工作的總結和匯報,寫的不是很詳實,后續會有一個ppt來深化異步化的一些思想)下面將第一階段的工作做個總結,第一階段主要做了以下幾個方面的事情  閱讀全文
    posted @ 2010-08-06 00:38 岑文初 閱讀(4216) | 評論 (0)編輯 收藏

         摘要: 淘寶一年陳  閱讀全文
    posted @ 2010-07-24 00:34 岑文初 閱讀(2848) | 評論 (7)編輯 收藏

         摘要: Web服務的重放攻擊的一點想法  閱讀全文
    posted @ 2010-07-07 00:40 岑文初 閱讀(3186) | 評論 (0)編輯 收藏

         摘要: Web服務請求異步化介紹  閱讀全文
    posted @ 2010-06-30 08:41 岑文初 閱讀(5232) | 評論 (4)編輯 收藏

         摘要: Web服務請求異步化測試  閱讀全文
    posted @ 2010-06-13 14:35 岑文初 閱讀(4428) | 評論 (9)編輯 收藏

         摘要: 訪問TOP鏈接超時和重置問題  閱讀全文
    posted @ 2010-06-09 13:34 岑文初 閱讀(1718) | 評論 (1)編輯 收藏

         摘要: 對TOP高并發的一點回答  閱讀全文
    posted @ 2010-06-07 21:22 岑文初 閱讀(1761) | 評論 (0)編輯 收藏

         摘要: TOP的價值所在  閱讀全文
    posted @ 2010-06-01 08:49 岑文初 閱讀(3535) | 評論 (5)編輯 收藏

         摘要: 開放平臺兩三點感悟(下)  閱讀全文
    posted @ 2010-06-01 02:53 岑文初 閱讀(3287) | 評論 (4)編輯 收藏

         摘要: 開放平臺兩三點感悟  閱讀全文
    posted @ 2010-05-28 02:29 岑文初 閱讀(4384) | 評論 (6)編輯 收藏

    http://t.sina.com.cn/fangweng

    posted @ 2010-05-24 21:54 岑文初 閱讀(1286) | 評論 (0)編輯 收藏

         摘要: ModJK與tomcat消息傳遞出現的串消息問題  閱讀全文
    posted @ 2010-05-11 20:00 岑文初 閱讀(2773) | 評論 (0)編輯 收藏

         摘要: 異步模式下的Web請求(技術介紹篇)  閱讀全文
    posted @ 2010-04-20 08:50 岑文初 閱讀(4240) | 評論 (1)編輯 收藏

         摘要: Q1技術點滴  閱讀全文
    posted @ 2010-04-02 02:26 岑文初 閱讀(3118) | 評論 (5)編輯 收藏

         摘要: 普通程序員的2009  閱讀全文
    posted @ 2010-01-29 01:34 岑文初 閱讀(2150) | 評論 (4)編輯 收藏

     

    優化雜談

    Author :放翁

    Bloghttp://blog.csdn.net/cenwenchu79/

             當應用遇到規模化問題的時候,就是考慮性能優化的時候了。今天同事和我聊起了NIO在客戶端的使用與BIO有什么優勢,也勾起了我前一陣子和其他同學交流優化的一些想法,純粹個人的一點想法。

    CPU利用率和Load

             在過去做壓力測試的時候,我們經常會關注兩個指標,CPULoad。有同學覺得CPU利用率上去了Load肯定也上去了,Load上去了CPU利用率同樣會上去。但是在一些需要優化的場景下,常常會看到Load很高,CPU利用率卻可能比較低(多核更是可能出現分配不均的情況)。Load其實就是等待處理的任務隊列,當你的應用在等待同步消息返回處理的同時,CPU還是會將時間切片分配給這些線程,而真正需要CPU的線程,卻不得不在到了時間片以后暫時放棄工作被掛起。因此在程序設計的時候就要考慮如何利用好CPU的這個資源,如何均勻的將壓力分攤到各個CPU上(有時候就一個線程在不斷循環,導致單個CPU負荷很高)。

    NIO在客戶端的使用

             Http消息設置keepalive和采用NIO的方式復用信道、BIO結合連接池的方式,最基本的目的就是降低建立TCP產生握手的成本,最大限度的復用已有的資源,但是否NIO就只有復用信道這點呢?

             NIOBIO在數據傳輸和處理的模式上有不同,NIO采用的是BufferPacket+Channel的模式,這其實和操作系統本身的傳輸模式很類似,而BIOStream的模式是Java自己獨特的模式。在采用NIO的這種數據傳輸模式以后,可以充分利用操作系統本身對傳輸的優化,因此這是一方面好處。另一方面異步和事件機制的使用,可以降低對于昂貴的資源申請,在高并發下提高處理能力。

    NIO客戶端的編程模型最大特點:依賴反置,松耦合帶來性能提升。在請求流程協議中支持“票根”,也就是我們說的回執。例如,你今天面試完了,不需要你在阿里巴巴前臺等著結果,直接留個電話,有消息就會直接通知,電話就是通知結果和服務請求者的關聯手段。(此時阿里巴巴前臺和會議室就會有足夠的空間給其他人來面試,這就是資源)

             服務端使用NIO就不多說了,這里主要說一下在客戶端的使用場景。兩者是否真的有很大的差別,是否NIO有絕對的優勢,其實還是和場景有關。簡單說來就一個判斷標準:應用對于通道的利用率是否夠高。下面列了4種場景:

    1. 一次請求數據量很少,服務處理速度很快。

    2. 一次請求數據量很多,服務處理速度很快。

    3. 一次請求數據量很少,服務處理速度很慢。

    4. 一次請求數據量很多,服務處理速度很慢。

    場景1,傳輸效率很高,服務處理速度很快,一次請求很快就被完成,采用NIOBIO,在性能優勢上除了操作系統對NIO的優化以外,BIO連接池不輸于NIO。在易用性上,BIO更加容易處理。(NIO的異步機制,就要求消息傳輸協議需要有會話碼來提供異步處理入口選擇如何處理)

    場景2,傳輸過程比較長,消耗時間比較多,服務處理速度很快,因此交互的時間大部分都還是在數據通道傳輸上,由于NIO在傳輸過程中依然是串行化的,因此BIO的連接池優于NIO,同時NIO一個客戶端只有一個通道,因此BIO開的連接池越大,并行處理能力越強,因此BIO效率比較好一些。

    場景3,傳輸量比較少,服務處理比較慢,很明顯這是通道利用率低的表現,NIO有絕對的優勢,特別是在高并發下。信道和服務端客戶端資源被充分利用。

    場景4,傳輸量比較多,服務處理也比較慢,這時候可以發現信道利用率取決于服務事件和傳輸消耗時間的比例,這類場景某些情況下BIO也會優于NIO

    單線程和多線程

             在使用多線程來優化程序的時候,是否考慮過多線程的使用場景,多線程不是萬能藥,在某些情況下還可能是毒藥。使用多線程的過程中,需要考慮這么幾個因素:

    1. 資源競爭,復雜度增加。

    為什么前面提到的NIO客戶端在處理數據流發送和讀取的時候都是采用單線程,數據流的發送和讀取都是在一個數據通道上的,而讀取和發送本身時間消耗是固定的(不論是多線程還是單線程),同時增加了復雜度(需要處理數據包整合問題)。這其實就是在資源上的串行化操作直接導致了任務的串行化,因此任務多線程反而起到了反作用。

    2. 是否是關鍵路徑的工作,占關鍵路徑的比例。

    首先,在優化以前需要考慮優化的內容是否是關鍵路徑的工作,如果不是,那么增加復雜度實現的多線程模式,就沒有價值。其次就是看是否是在關鍵路徑中占有比較大的比例,同樣的,還是投入產出比例(多線程帶來的復雜度以及在高并發下的一些資源保護措施都需要很多的維護成本)。

    3. 任務的合理切分。

    NIO的客戶端,接受數據的事件將會寫得很輕量級,但是接受到數據然后分析數據還原成業務對象,則會通過線程池的方式來分別處理。就好比監聽連接到來,和實際的去建立連接分成了兩個階段的任務,讓事件型的任務單純,快速執行,讓與業務相關的部分通過多線程并行的方式提高處理效率。總的來說就是把任務劃分成為系統性的任務和業務性的任務,前者消耗時間少,設計盡量簡單高效,采用單線程處理即可,后者通常情況下在處理流程和資源上不沖突的情況可以通過多線程并行提高效率。

             優化應用關注點:

    A.關鍵路徑是否可以優化,關鍵路徑的任務拆分。

    B.關鍵路徑上的單個任務是否可以拆分并行執行。(是否有資源競爭,是否會有流程上的前后依賴,是否增加復雜度引入新的不穩定因素)

    C.系統資源和依賴外部系統是否會成為瓶頸。(單機的CPU,IO都會在一定的壓力下成下降趨勢,并行執行反而降低了處理能力)

    因此,可以看到不論是MapReduce設計下的Hadoop,還是Erlang語言級別的特性,都盡量的希望任務之間可以并行執行,相互之間低耦合,通過異步事件消息通知方式來交互,同時數據沒有共享,防止資源競爭導致無法并行高效處理。系統設計還是要根據場景來判斷使用什么方式優化,越簡單越好。

    posted @ 2010-01-27 01:45 岑文初 閱讀(3665) | 評論 (1)編輯 收藏

         摘要: 基于MapReduce的配置型日志分析組件  閱讀全文
    posted @ 2010-01-12 21:58 岑文初 閱讀(3859) | 評論 (5)編輯 收藏

         摘要: TOP團隊招賢納士  閱讀全文
    posted @ 2009-12-11 15:52 岑文初 閱讀(1904) | 評論 (0)編輯 收藏

        中午左右收到一個看我blog的朋友的郵件,最近他在研究mapreduce,然后想用hadoop來做一些工作,不過遇到了一些問題,我這邊也貼一下他的幾個問題,同時覺得自己把自己的一些看法分享一下,當然只是自己的一些想法,也許對新學習的同學有幫助。

       問題:

    1. 從Map(K,V)的方式來看,難道mapreduce只能做統計?
    2. 目前我想除了日志分析之類的功能外,還想做一個全文檢索的功能,類似windows查詢一下,通過關鍵字查詢文件的位置即可(可能還要根據匹配度做排序),這個我很迷茫不知道怎么下手,痛苦ing
    3. 你的實踐是一個單機模式,如果用戶把一個1G的log已經上傳到hdfs了,此時分割工作已經完成,只需要從client那里得到文件基本信息和塊的location就可以了,那mapreduce怎么進行下去呢?

       我給回復的郵件內容:

       首先,MapReduce的思想和Hadoop的MapReduce的架構不是一個概念,說的具體一點也就是Hadoop的架構設計只是MapReduce的一個子集思想的實現。每個人都可以根據自己對MapReduce的理解去實現業務處理,簡單來說多線程處理就是MapReduce的一種最簡單的實現,復雜來說多機協調工作就是一種復雜的實現。

       MapReduce的思想里面最值得借鑒的:

       a.問題分而治之。(找到流程的關鍵路徑,優化可以并行處理的工作)

       b.計算靠近數據。(這也是hdfs存在的最重要的特點,計算的轉移往往要比數據轉移廉價,特別是對海量數據的處理)

       c.數據規模化隨著并行處理成數量級遞減。

       剩下的內容就是各個框架對于非業務性需求的處理,例如容災,如何盡量少穿數據協調處理等等。

       針對他提出的三個問題:

        1. Hadoop的mapreduce從架構上來說最適合的就是統計分析計算。做其他方面的工作需要考慮是否適合,而不是為了技術而技術,先有需求再有技術選型。
        2.  對于你這個需求直接用搜索技術實現就可以了,不一定要硬套在mapreduce上。
        3. 對于海量數據是否一定要到hdsf上,或者就簡單得數據物理或者邏輯切割來直接處理,根據自己業務場景選擇。hdfs的特點就是對文件切割,容災,數據邏輯存儲和物理存儲無關性(便于擴容管理,同時也是計算靠近數據的技術保證)。

        是否使用MapReduce框架,HDFS存儲關鍵還是看你是否真的需要,當現有框架對自己來說并不合適的時候可以對小規模問題定制MapReduce的處理,最簡化就是你去多線程或者多進程處理問題,需求決定技術選型。

      

    posted @ 2009-12-09 13:09 岑文初 閱讀(2590) | 評論 (1)編輯 收藏

    Author:放翁(文初)
    Email:fangweng@taobao.com
    Blog:http://blog.csdn.net/cenwenchu79 

     

    當前問題:

    1.       不小比重的Rest請求都是無效請求,全部接納數據消耗比較多的時間。

    2.       Multipart類型的大文件流請求無法做到合理快速過濾。(參數錯誤請求,數據文件過多請求,文件大小過大請求)

    歸結來說,TOP平臺處理的服務在解析參數時比較消耗時間和帶寬(客戶端網絡速度慢導致傳輸字節流比較慢,文件比較大導致帶寬占用嚴重)

    處理方式:

    通過自行解析字節流方式來lazy化處理請求,減少無效請求對于解析參數時間消耗(導致web容器連接消耗)及帶寬消耗。

    優化目標:

             Get由于內容長度有限不列入在優化范圍。

             優化Post方式的請求(普通的和Multipart),要求優化后:在正常請求處理上兩者處理速度不低于傳統方式,非正常請求在策略命中情況下(后面會談到什么情況下優化失效),性能有明顯提高。

    具體實現:

            由于現在用的是傳統IO模式,因此可以用流的方式來lazy解析和處理請求(NIOchannel + buffer package就無法lazy了)。




             一共有三個組件角色:

    1. 請求處理配置策略:配置在解析參數時,優先的規則(參數可以從header,uri,post body中獲取,相互之間的優先性),異常拋出規則(字節流長度,文件大小,文件個數限制等),字節流解析模塊的參數配置(字節流解析的窗口大小,超時時間等)。

    2. 線程上下文:用來保存處理過的請求參數。一來復用,二來也是由于請求字節流處理不可逆(不保存字節流副本),必須保留。

    3. Http請求字節流解析模塊。根據具體的配置以及解析策略來解析字節流,同時將解析結果保存在線程上下文中。主要的實現代碼在于對Post消息體逐步解析部分(普通的Postmultipart

    壓力測試結果:

        正常請求場景( 100并發用戶,multipart 文件大小300k,當前業務場景這個值已經滿足了):

    普通post的處理能力1000TPS。(servlet方式處理差不多,不過有波動)  

      multipart處理能力610TPS。(apache開源項目fileupload,處理能力400TPS左右)

    錯誤請求場景

             異常情況的處理有了很大提高,對于遠程客戶端傳輸較慢或者是大流量圖片的錯誤請求都有很大的優化。

    優化存在問題:

    1. 參數缺失導致優化失效。

    2. sign類似的交驗,導致獲取所有的參數。

    3. 當前圖片限制在300k,由于考慮處理速度快,就都沒有設置超過閥值存儲到本地,因此在高并發大流量的情況下也會有內存問題,當然已經做了部分保護。

    針對上面的兩個問題,作了部分的協議限制,對于API2.0希望將所有的系統參數和業務參數區分開,放入到Http header中或者url中,這樣可以避免系統參數缺失導致優化失敗,同時大量過濾系統參數出現問題的無效請求。

    Sign類似的交驗放在流程最后,避免過早獲取所有參數。

    作安全保護,設定簡單丟棄或者io交互來緩解這個問題。

             這部分內容還有很多可以做得工作,其實最初的目的就是為了防止系統對于無效請求的處理消耗,我想在很多系統都會有這樣的問題,利用緩存設置黑名單防止攻擊也是這樣的初衷。因此這點可以考慮在很多系統設計的時候都作一樣的優化,對正常的不能優化,起碼對錯誤的可以做一些優化,防止在異常請求高漲的時候,系統被擊垮.

    posted @ 2009-12-08 01:51 岑文初 閱讀(2243) | 評論 (2)編輯 收藏

    Author:放翁(文初)
    Email:fangweng@taobao.com
    Blog:http://blog.csdn.net/cenwenchu79


    其實想說這句話很久了
    ,和很多同事接觸,有時候或多或少的都會發現大家會陷入在自己的一畝三分地里面.

             主要表現得癥狀

    1.       PD的需求就是目標,踏實的實現,不懂的就猜。

    2.       經驗蓋過一切,設計系統就是要夠完備夠復雜。

    從開發人員角度來看,第一種人多半比較有自己的想法,同時也有不少的工作經驗,同時可能對技術比較著迷。另一種人多半是剛剛工作或者經驗不足,要么就是習慣性把工作當任務,而不是愛好,寫程序也就是一份賺錢的活。但看起來其實各自都在自己的一畝三分地上搗鼓,忘記了作為一個開發人員最基本的原則:“滿足客戶需求”。

    先說1類型吧,在我們的Team有一個剛畢業一年多的同學,很勤奮,不論從學習以及工作,實實在在,踏踏實實。我們這邊來需求,通常大需求我們都會全體過一下,一些小點的需求他就自己考慮一下就作了。那天正要上線,突然說了一下設計修改的內容,發現不僅滿足不了PD原有的需求,而且給系統帶來了緩存暴增的隱患。然后找來PD一談,其實他要的功能已經在現有系統中已經實現,只是需要做部分的修改,而不需要新的去建立一套機制。這樣的情況其實在前前后后出現了不少次數了,但其實一直沒有和他細談。后來我下班時候和他一起回家的時候說:“很多時候, PD為了讓你理解,從開發的角度想要去描述一個需求,但其實最終失去了他自己想要的東西。因此對你來說第一步不是急忙的去考慮如何實現PD的想法或者和他爭論他的設計是否合理,而是需要先問他:你想要什么,想要實現的東西最終目的是什么,能滿足客戶的什么需求?當他能夠說清楚他想要什么,也知道要的東西能給客戶帶來什么價值的時候,我們再回過頭來看,究竟應該怎么做?”這其實和我每次和同學分享一些設計的時候步驟是一樣的,首先為什么要這么做,然后才是考慮如何從我的目標去尋找行動的方法方式,不然你會發現你和別人討論了許久的東西,實現出來的時候已經背離了你的目標很遠。因此在做任何需求或者設計的時候第一個問題就要問自己為什么要做,作的過程中時刻要記得我的目標是什么。這讓我想起了我在離開阿軟的那些日子和王堅博士談話以及聽他的一些對于設計的理念,很多時候還沒有到規模化的情況下,先解決客戶的需求,在解決客戶需求以后,逐步的去考慮規模化問題的設計。(當然不是說第一版設計就可以隨便作,良好的基礎能夠提升后續改進的速度)。

    二類型的就比較多了,其實是很多開發人員的通病,包括有時候我自己也會陷入這樣的誤區。通常情況下有兩種場景會陷入這樣的誤區,同時當事人卻又不愿意改變。第一種情況就是覺得自己有不少的經驗,同時對技術很執著,希望設計出來的都是很完美的,一次發布就可以滿足個12年,但其實從這些年的設計角度來看,首先系統都是不斷迭代進化的,因此一步到位的說法基本上不靠譜(除非就是一模一樣的場景代碼重復使用),其次系統的架構要做的足夠靈活,通常情況就需要先做核心功能,預留出足夠的空間和切入點,這樣對未來擴展和需求變化有足夠的適應度。從這兩點來看,其實設計初期就是要求找到客戶最想要的,擴展可以實現客戶可能要的,防范客戶沒有估量到的。但這其實就需要和我們的產品設計師有充分的交流,好的產品設計師不會告訴你你怎么去實現,但是他會告訴你我想要的是什么,這些能給客戶帶來什么,這時候你可以告訴他我能夠通過什么方式來滿足你的需求。這樣的開發和產品設計交流的結果才是技術化的產品,大家各司其職,同時也通曉對方領域的一些情況,對對方領域的只能給出建議,不是指導,這點在TOP我很慶幸有很好的黑羽同學,我們的交流就是這樣產生良性互動。這有點撤遠了,剛才說了第一種場景,然后說說第二種場景,就是初期其實大家都沒有明確細節,但是在實施過程中開發人員會根據自己的接觸面來選擇一些技術和架構設計,最后看起來很復雜,很完美,但其實越是復雜的設計背后有越多的隱患。但是此時因為已經設計好了,就不愿意再去簡化,也不愿意聽任何人的意見,其實這是很危險的。我過去也犯過類似的錯誤,但是其實當你冷靜下來,想想那句話,我們的目標是什么:“滿足客戶需求”,這時候你就會考慮,這么復雜的系統會不會給客戶帶來更多的不穩定以及復雜度,其實客戶不關心你背后如何實現的,但是你需要滿足客戶的最基本的需求,用起來方便,高效,實實在在提供了解決問題的手段。

    今天下午面試了一個外部的同學,工作年限比我長,看了簡歷也經歷了很多項目,同時在描述的時候寫了對高并發,分布式等等都很熟悉和熱衷,我開始看了簡歷就擔心,可能我這邊不一定要他,因為我怕他開口就是說一大堆如何做高并發和分布式的內容。在我看來如果你沒有搞清楚你什么時候要用牛刀,什么時候要用剪刀的人,和你談論牛刀的構造其實沒啥意思,因為在我看來,技術只要你肯花時間去學,沒什么學不到的,但是做事方式和項目設計經驗卻是長時間積累的。幸好今天和他一談,他對于技術的態度以及架構設計的思想都和我想的比較接近,不是為了技術而技術,不是為了過程而過程,了解如何從簡如繁,再從繁入簡,最終能夠找到自己的目標。當然后來還是談了很多技術細節的問題,畢竟干活還是要一個好手,作了那么多年如果沒有經驗和技術積累也是很可怕的事情。最后我問了他兩個問題:1.你學習一個新技術的過程是怎么樣的?2.你和你同事如果在設計方案上有沖突你怎么解決?他告訴我他學習新技術首先會去考慮這個技術的特點是什么,和其他技術的差別,他的擅長領域是什么,這樣才能夠用到實處。第二個問題他和我說就是開會討論,最后大家群體決定。我對他第一個問題感到很滿意,因為我就需要這樣的同事,第二個問題我給了他一個建議,其實在很多時候,將別人的架構設計的優點融入到自己的設計中,不再以方案作為邊界,那么大家最終就很容易達成一致,因為你在接受別人的思想時其實能夠看到自己的不足,同時對待別人不是用否定的態度,會讓你更容易得到認可和接受。(這點作起來需要不斷的改變程序員自身的好勝個性,我起碼還是出于變化中

    我記得我小時候上政治課的時候,老師給我們劃分了三種人:有能力但是沒有道德的人是危險的人,沒有能力但是有道德的人是對社會無害的人(覺得像葛優說的那個對社會無害的海龜一個概念),有能力同時也有道德的人是對社會有益的人。我覺得其實程序員也就可以從兩個緯度看:

    1.       有能力,有經驗,對技術有追求。

    2.       對產品化和客戶沒有任何感覺。

    擁有了素質1但是沒有素質2,那么最多也就只能說是試驗室的花朵,在大學搞搞研究還不錯,實際要做出產品來可能就是紙上談兵,好鋼始終用不到刀刃上,有力沒地使。

    素質1有所欠缺,素質2很明晰,對自己目標不斷追求,其實這樣的人,有時候笨鳥也會飛的比聰明的鳥更高。

    擁有12的人,當然就是最好的人,只需要學會做人那么就可以發揮自己的能量。(程序員有時候就是很難改變自己的個性,去學會如何溝通和理解)
             最后一類就是自以為有12的人,這類人最怕就是面試的時候被考官通過,那么后續的問題就大了。

    說了怎么多,其實也無非想說出一個程序員這些年的經歷,從做開發到做基礎平臺,到做業務平臺,該怎么踏實做事,該在什么時候找到自己的瓶頸,該在什么時候改變自己的狀態,都需要自己好好的讓自己冷靜下來想想。做基礎平臺需要耐得住寂寞,同時也要知道自己是有客戶的,服務不好客戶,那么基礎組件平臺就是玩具。做業務平臺需要學會去分析和溝通,需要去了解每一個層次的設計如何協作,同時在兼顧業務需求的同時滿足隱性需求(穩定性,可用性,響應速度,規模化等等)。但歸根到底,能給開發人員不斷能量的不是技術本身,而是你用技術給你的客戶帶來的價值,對你的認可是長期做事的一個最基本的動力,因為當你現在覺得純做技術能夠支持你不斷向前走的時候,其實在不遠的將來你會體會到原來過程和目標是同樣重要的。走出自己的一畝三分地,給自己多一點的空間,會讓自己看得更遠,走的更高。

    posted @ 2009-12-08 00:54 岑文初 閱讀(4238) | 評論 (6)編輯 收藏

       今年blog更新的速度比去年慢很多,當然最大的原因就是工作的轉變。當選擇留在云公司還是去淘寶,自己做了很快的抉擇,去淘寶。其實在阿軟的后面這一年,對自己來說是一個技術提升的階段,工作任務不緊,技術預研范圍較大,但對于自己這么一個已經到了30的人來說,應該是把技術轉變為產品的時候了,因此義無反顧地選擇了TOP作為我新的開端。

        其實每個人都會有自己不同的階段,任何階段都有自己的目標,同時當你發現在一個階段停留很久,都沒有什么突破,或者漸漸失去目標的時候,那么就需要考慮如何找到新的起點。對我來說,技術追求和提升是沒有止盡的,但是需要真正的將所學的作出一點實在的產品,同時在參與產品團隊的過程中,學會溝通,交流,分析問題,全面地看問題,這些也是不可缺少的成長經驗,如果僅僅局限在狹隘的某一個技術立領域,那么就和普通的學生無異。

        到了TOP,自己的工作分成了三大塊:1.救火及防火。2.整體架構支持。3.核心代碼的編寫。前期花了不少時間在1上,同時和各個Team交流,參與各個團隊的關鍵性設計評審,以及對平臺的統一規劃,讓我實實在在的作了一點2的事情。(說道實實在在,記得在阿軟很多團隊都抱怨我所在的架構組整天派一個人掛個名字,然后就算是架構支持了,當然這有很多原因造成,并不一定是負責架構的同學的問題)。對于3這點當然是自己最樂意做的,也是自己一直告誡自己要不斷提升的,不論自己有多少理由說自己忙碌,寫代碼是我們這種人的生命所在,不然就會漂浮在空中,漸漸的走向“另一個世界”。 但自己覺得其實還少了一塊,就是對業界的發展深入了解,這會讓我看的不夠遠(幸好我們的產品經理黑羽同學總還會給我一些新的思路),到了年底將會多花一點時間作這部分內容。

        去年年底我寫了關于對于Open API的思考和探索的一篇文章作為年底總結,今年一樣,對于當前自己的工作將會有一份總結和規劃,即是對今年平臺發展的一個回顧,也是對平臺未來的一點思考,大致已經列了一個綱要,對外可能部分內容不能全寫出來,不過就算不寫細節也會將一些思路寫一下,大家可以相互探討一下。這部分內容也將會成為我12月份參加淘寶內部淘寶大學講課的內容,希望能夠將今年新進淘寶的同學吸引到TOP來,為TOP增加人氣。

       下面是一個mind 圖,大致描述了一些內容:

    posted @ 2009-11-27 00:58 岑文初 閱讀(2933) | 評論 (2)編輯 收藏

         摘要: 常用模式的細節問題看設計穩定性  閱讀全文
    posted @ 2009-11-10 01:52 岑文初 閱讀(2872) | 評論 (4)編輯 收藏

    在自己的blog上做個招聘廣告,TOP平臺架構Team歡迎各位資深或者剛畢業的對TOP有興趣的同學加入,可以直接給我留言或者發mail到fangweng@taobao.com,非誠勿擾^_^,同事可能比老婆相處的時間都要長。對了,請附加上你的簡歷,方便繼續溝通。
    posted @ 2009-10-30 15:51 岑文初 閱讀(1334) | 評論 (2)編輯 收藏

         摘要: Author:放翁(文初) Email:fangweng@taobao.com Blog:http://blog.csdn.net/cenwenchu79   閑話:(如果圖片看不清楚可以看另一個blog,因為圖片在家,這里上傳就只能轉貼了)          為什么又叫做什么…的點滴,...  閱讀全文
    posted @ 2009-10-30 12:27 岑文初 閱讀(3666) | 評論 (6)編輯 收藏

         摘要: 上海校招回來  閱讀全文
    posted @ 2009-10-13 21:27 岑文初 閱讀(1463) | 評論 (4)編輯 收藏

         摘要: 客戶端NIO實踐分析  閱讀全文
    posted @ 2009-09-24 08:57 岑文初 閱讀(3374) | 評論 (7)編輯 收藏

         摘要: 應用架構設計“防火”經驗分享  閱讀全文
    posted @ 2009-08-27 00:59 岑文初 閱讀(3183) | 評論 (5)編輯 收藏

       今天是轉崗到淘寶的第七天,也算是一周吧,期待來這個團隊已經有快大半年了,這次阿軟的重組給了一個機會,過去的就過去吧,不再回首有任何的抱怨和遺憾,需要面對的是新的將來。

        很奇怪,來到淘寶,都是熟人,Boss是早就相識的菲青,TOP團隊的自雪,鳳先,秀芳及我不認識但是認識我的其他同學都很熱情,運營,PD,OST都是以前阿軟的老同學,還有其他幾個團隊的朋友,感覺回到了家,而不是離開了家。

        原先來淘寶是比較堅決的,同時也得到王博士的支持,心里還是比較有底的,不過就是擔心過來以后和淘寶已有的團隊合作可能會有磨合期,因為擔心有“小圈子”。結果卻是很出乎我的意料,TOP的人就和做的事情一樣,是一批開放的人,自雪,鳳先,張三各個都很放的開的和我聊,對于架構,對于技術,對于未來的發展,這些人坐在一起什么都可以說,自己覺得自己早先是用老思維來看待這個團隊了。這個團隊很年輕,很有活力和創造力,缺少的只是一些經驗,而我經驗是有一些,但是那些斗志已經在去年一年被磨礪的差不多了,正好是我回爐好好再熱一熱的時候了。來之前就和黑羽有過接觸,也看過他對于TOP的一些構想,在我的計劃中就有和他交流的部分,上周找了一個時間碰了一下,果然有很多和我一致的想法,同時還有一些比我更加深入的idea,特別是對于大淘寶未來的一個構想。其實來到TOP我所要做的就是在技術的架構上找到商業的感覺,讓商業驅動技術,技術沉淀積累來支持商業的暢想。

        這七天過的很快,全身心投入的工作,時間總是過的很快,而且過去那種沉悶的心情和處事的態度在這里得到了改變。明天基本上就看完了TOP的大部分代碼,整理了一些review的建議,同時昨天還花了一些時間去看了看google appengine,寫了幾個小應用,看了看源碼(部分反編譯),因為要給boss對于小應用hosting方面的一些想法。

       總的來說還是和我原先的計劃一樣,商業上和PD運營交流,了解未來TOP商業發展方向,以及對技術架構的一些需求。架構上從代碼和文檔看起,文檔不是很多,所以就只好每個工程看過來,也不錯,看到自雪同學寫的代碼還是不錯的,同時也看到了淘寶的基礎組件的推廣力度之大,這比在阿里軟件強的多,其實也是我一直希望看到的,人人都是技術牛人,都在做重復的事情,但是卻沒有技術沉淀,其實大家完全可以吧自己的構想增強在別人的基礎之上,而不是什么都自己搞一套,淘寶的技術應該來說在政策上得到了支持,技術積累效果還是不錯的,這里還不得不提到我的淘寶同學畢玄同學的服務基礎框架HSF,雖然現在還沒有接觸,但是應該已經發展的挺好的。

       有兩個能夠用人,擔得起起技術團隊發展的Boss,有這么一些年輕有沖勁的小同學,有這么一些樂于傾聽分享協作的老同學,有這么一些很有商業feeling的非技術團隊同學,要做好TOP,我想只有三個字:“沒問題”。這是我在入職七天寫的隨記,一年后再來回看我今天說的這些話,在來看看這個團隊創造的價值。

       附:在淘寶申請好了花名:放翁。陸游的字,武俠小說的人就連掃地的都沒有了,歷史名人也沒有了,不過詩人倒是沒有人用,指不定還開創了淘寶同學入職的花名新取法。

       好好工作,天天向上,為了TOP,為了家里的BB,為了自己的一點理想,踏踏實實的走自己的路,讓別人開車去吧,^_^

     

    本文來自CSDN博客,轉載請標明出處:http://blog.csdn.net/cenwenchu79/archive/2009/08/12/4440248.aspx

    posted @ 2009-08-12 23:16 岑文初 閱讀(1165) | 評論 (1)編輯 收藏

       昨天是去淘寶工作的第一天,最近最頭痛的就是花名,在我兒子出生的時候我就知道起名字是最麻煩的事情,而起花名更是痛苦,因為你的選擇余地更小,同時還不能和前人重復,好不容易找到兩個還不錯的,結果一個給其他部門的老大保留了,一個因為拼音和一個同學相似而無法使用。想用文初,結果還給一個淘寶的活躍用戶使用了,問了HR不取花名是否可以,回答說,不可以,太折騰了。

       昨天開了一整天的會,主要還是協調兩個平臺之間將來的合作模式,同時也梳理了雙方的現有功能,將未來雙方的邊界做了初步定奪,同時也對將來的一些需求做了初步的規劃,系統的模塊化也提上了最近的日程。

      今天會化一些時間看看已有的代碼熟悉一下Top的情況,同時也看看一些流程性的文檔,希望能夠盡快的對Top全方位的了解,這樣便于從細節實現到整體架構設計都能給出自己的意見。

      初來乍到不容易,很多需要從新開始的,不過對我來說合作的人,做的事情還是有一定的基礎,因此只是需要一周左右的過渡期,后續應該會走的更加順暢。

     

     
    posted @ 2009-08-06 05:12 岑文初 閱讀(1028) | 評論 (0)編輯 收藏

         摘要: Author : 岑文初 Email: wenchu.cenwc@alibaba-inc.com Blog: http://blog.csdn.net/cenwenchu79 Date: 2009-5-26 目錄 需求轉而學習 “軟”負載均衡 LVS (Linux Virtual Server) Virtual Server三種模式介紹 Virtual...  閱讀全文
    posted @ 2009-08-04 22:32 岑文初 閱讀(2277) | 評論 (1)編輯 收藏

         摘要: “軟”負載均衡學習點滴  閱讀全文
    posted @ 2009-08-04 22:30 岑文初 閱讀(2088) | 評論 (0)編輯 收藏

    Author : 岑文初

    Email: wenchu.cenwc@alibaba-inc.com

    Blog: http://blog.csdn.net/cenwenchu79

    Date: 2009-5-26

    目錄

    需求轉而學習

    “軟”負載均衡

    LVS Linux Virtual Server

    Virtual Server三種模式介紹

    Virtual Server三種模式的比較

    Virtual Server三種模式實踐

    三種模式下的簡單壓力測試

    HA-Proxy

    HA-Proxy安裝和使用

    HA-Proxy的壓力測試結果

    負載學習心得

    需求轉而學習

             很多時候不少做開發的同學都認為技術更新的快,新技術、新概念層出不窮,大家樂此不疲的去跟隨著所謂的“技術趨勢”走在風頭浪尖上,但其實往往忘記了一個最重要的問題“滿足客戶需求”。其實技術就是為滿足需求服務的,用最小的代價來滿足用戶的需求,以最簡單高效的方式來達到目標,就是每個開發者應該追求的。(不要因為自己的架構很簡單就臉紅拿不出手,只要你在滿足用戶當前需求的基礎上對未來有所考慮,那么化繁為簡就是一種能力的表現)

             SIP(服務集成平臺)5.7版本中對于未來多個服務提供商,多種類型的服務,在每日幾億的調用壓力下,需要找到一個解決方案:可以分流不同服務提供商的服務,分流不同類型的服務,服務隔離化來減少服務相互之間影響以及服務提供商之間的影響。

             當前SIP的前端是通過硬件F5作負載均衡,因此是無狀態無差別的服務負載,這也使得無法區分不同的服務提供商的服務請求和不同類型的服務請求,導致服務提供商之間的服務會產生相互影響(旺旺即時通信類API在峰值占用了大部分的服務處理資源,淘寶寶貝上傳類API占用了大量的帶寬)。近期還有更大的兩類API將會接入,因此尋找一個服務可分流的方案勢在必行。(當然過去也考慮通過三級域名配置在負載均衡上來解決這些問題,但是這樣首先對于開發者來說不透明,其次也是一種比較僵化的設計方案,擴展和維護也有一定的難度)

             在過去也嘗試過ApacheWeb容器自己的一些load balance特性,當然效果不是很好,和硬件基本無法比擬,而一些專有的“軟”負載均衡方案和開源項目也沒有深入的去了解,因此借著這次機會,好好深入的挖一挖“軟”負載均衡。

    “軟”負載均衡

             作為互聯網應用,隨時都需要做好用戶量突然增大,訪問量突然上升的準備。今年熱門的詞匯“云”我就不多說了,這里就簡單說說服務器的橫向擴展。其實和DB,文件系統等一樣,當資源成為瓶頸的時候,就需要考慮如何通過擴展或者提升資源能力來滿足用戶的需求,這就是我們常說的橫向擴展和縱向擴展。(對于橫向擴展和縱向擴展的優劣大家應該都很清楚了,這里也不做贅述)橫向擴展中就會要求使用負載均衡的能力,如何根據資源能力不同以及資源在運行期負荷動態變化將負載合理分配是判斷負載均衡優劣的標準。

             軟件負載均衡一般通過兩種方式來實現:基于操作系統的軟負載實現和基于第三方應用的軟負載實現。LVS就是基于Linux操作系統實現的一種軟負載,HA Proxy就是基于第三應用實現的軟負載。(后面會詳細介紹這兩種方式的使用)

             最早期也是最原始的軟負載均衡:“Round Robin DNS”,通過輪詢方式在DNS綁定多個IP的情況下,將用戶對于同一個域名的請求分配到后端不同的服務節點。這種方案的優點:配置簡單,負載分配效率高。缺點:無法知曉后端服務節點服務情況(是否已經停止服務),無法保證在一個Session中多次請求由一個服務節點服務,每一個節點都要求有一個外網IP

             另一種較為常見的就是基于分發器的Load balance。服務使用者通過向分發器發起請求獲得服務,分發器將請求分發給后端實際服務處理的節點,給客戶提供服務,最常說的反向代理模式就是典型的分發器Load Balance。這類負載均衡處理可以基于應用級轉發,也可以基于IP級別轉發,當然基于應用轉發效率和損耗比較大,同時分發器本身也會成為瓶頸。

    LVS Linux Virtual Server

             LVS是在Linux操作系統基礎上建立虛擬服務器,實現服務節點之間的負載均衡。LVS主要是處理OSI模型中的4層消息包,根據一定的規則將請求直接轉發到后端的服務處理節點,有較高轉發效率。

             Virtual ServerLoad Balancer和一組服務器的邏輯組合統稱,使用服務者只需要與Virtual Server進行交互就可以獲得高效的服務。真實服務器和Load Balancer通過高速LAN進行交互。Load Balancer能夠將請求分發到不同的服務端,在一個虛擬IP下并行處理多個請求。

    Virtual Server三種模式介紹

    Virtual Server有三種基于IP級別的負載均衡實現方式:IP address translationNAT)、Direct routingIP Tunneling

             NAT(Network address translation)由于IPV4的某些缺陷和安全原因,某些網段例如(10.0.0.0/255.0.0.0, 172.16.0.0/255.240.0.0 and 192.168.0.0/255.255.0.0)不能被用于互聯網,因此常常被用作內部局域網,通過網絡地址翻譯的方式可以讓這些網段的服務器訪問互聯網或者被互聯網訪問。網絡地址翻譯主要作用就是將一組ip地址映射到其他的一組ip地址,當映射比例為1:1的時候通常稱作靜態映射,而當映射地址為M:N(M>N)的時候(M為被映射地址數量,通常是內部ip),則成為動態映射。而對于Virtual ServerNAT模式來說,就是利用了NAT的特性,將內部的一組服務器通過映射到一個虛擬的IP,然后以一個外網虛擬服務節點的身份對外提供服務。

             上圖是一個實際的NAT范例,對外的服務IP202.103.106.5,內部建立了虛擬IP172.16.0.1,然后將內部其他兩臺實際服務的服務器172.16.0.2172.16.0.3映射到172.16.0.1這個虛擬IP。客戶端向202.103.106.5發起請求服務,Load Balancer查看請求數據包,如果是請求目標地址是注冊的虛擬IP及監聽端口的時候,那么通過NAT按照一定算法選擇某一臺實體服務器,再重寫報文目標地址,轉發請求到實際的目標服務器,當目標服務器處理完畢以后,將處理結果返回給Load Balancer,由Load Balancer修改源地址,返回給客戶端。

             IP TunnelingIP管道技術是在IP報文上再次封裝IP報文協議的一種技術。允許將一個目標為AIP數據報文封裝成為目標為BIP數據報文,在特定的IP 管道中傳輸。

             上圖就是IP Tunneling模式的運作原理。首先客戶端還是通過訪問對外的一個服務IP請求服務,當Load Balancer接受到請求以后,檢查VIP注冊信息,然后根據算法選擇實際的一臺后臺服務器,通過IP管道封裝技術對IP報文再次封裝,然后將消息通過IP管道轉發到實際的服務器,實際的服務器通過解包處理請求,然后根據包體內實際的服務請求地址,將處理結果直接返回給客戶端。

             Direct routing利用Load Balancer和實際服務器共享同一VIP,簡單的通過修改消息報體目標MAC地址,轉發請求,然后再通過實際服務器配置VIP為本地回環,直接處理消息報文,而不再轉發,當處理完以后,直接將處理結果返回給客戶端。

     

             上圖就是Direct Routing的運作流程,當外部請求到Load Balancer時,通過查找VIP注冊信息,直接選擇一臺后端服務器作為新的目標地址,修改消息報文中的目標地址Mac地址,轉發到目標服務器,目標服務器由于配置VIP在本地網卡回路中,因此直接處理消息,將處理完的結果直接返回給客戶端。

    Virtual Server三種模式的比較

             下表是官方整理出的關于Virtual Server三種不同模式的區別:

    NAT

    TUNNEL

    DR

    服務器要求

    無要求

    需要支持IP管道

    arp組件(當前也有補丁)

    網絡要求

    Private

    LAN/WAN

    LAN

    可支持后端服務器節點數

    較少(10-20

    較多

    較多

    服務網關

    Load Balancer

    本身

    本身

    NAT:根據其實現原理,可以知道這種模式對于操作系統,網絡都沒有太多的要求和約束,但是由于消息需要打解包,同時消息的響應都必須經過Load Balancer,因此Load Balancer自身成為了瓶頸,這樣一個Load Balancer能夠支持的后端服務節點數量就有限了。當然可以采用混合模式來解決這個問題,也就是通過TUNNEL或者DR模式作為前端模式串聯起多個NAT模式Balancer

    TUNNEL:這種模式要求操作系統支持IP Tunnel,通過對IP報文再次封裝轉發,達到負載均衡的目的。設計這種模式的初衷是考慮,對于互聯網很多服務來說,服務請求數據量和返回數據量是不對稱的,返回的數據往往要遠遠大于請求的數據量,因此如果請求和返回都走Load Balancer會大量占用帶寬,影響處理能力。IP Tunnel設計中請求是通過Load Balancer,但是返回是直接返回到客戶端的,因此節省了返回的帶寬,提高了請求處理的能力。

    DR:這種模式要求Load Balancer和后端服務器處于同一個局域網段。DR模式處理消耗最小,消息轉發和回復基本沒有損耗,因此效率應該是最高的,但是約束是相對來說最多的。

    posted @ 2009-08-04 22:24 岑文初 閱讀(3387) | 評論 (2)編輯 收藏

        小A,30,所在公司在去年的經濟危機中沒有倒下,但是在今年卻倒下了。小A覺得能夠把一個公司混倒閉了,也算是人生的一點經歷。

        公司是沒了,但是工作還要繼續,生活還要繼續,現在將要面對一個新的環境,環境很陌生,但也比較熟悉,工作職責很清晰,但也充滿了挑戰。人過30,有了孩子,真的成熟了很多,知道了什么叫做責任感,知道了未來真的需要好好規劃,需要一個機會,需要一個平臺來找到自己,實現自己的價值,不讓這黃金時代就這么過去。

       小A將要面對的挑戰在心里面已經做好了準備,也有了自己的一套短期的規劃及工作安排,要成長有時候就要有壓力。在小A即將離開原來團隊的時候,和手下的一個同學發了火,因為在這陣子調整過程中,同學的心態一直變的很差,但是小A已經竭盡全力去分析他的未來,雖然聽進去,但是過幾天依然又開始放棄自己,這種態度讓小A原本很看好他發展的心情變得很沉重,最后就在那個探討會上說了他一些比較重的話,雖然說完以后自己也有些后悔,可能我對他和對我自己一樣,要求太高了吧,就像博士說的,如果對一個人沒有想法了,就恭維幾句即可,大家你好我好大家好,只有當對這個人還存在一定的期望的時候才會表現出這種比較急切的感覺。

       新的開始,新的挑戰,新的環境,新的機遇,新的難題,新的稱呼

       好的心態,好的溝通,好的未來

       一切都需要小A用自己的能力去證明,走自己的路,讓自己走的更好。

    posted @ 2009-08-03 09:58 岑文初 閱讀(878) | 評論 (0)編輯 收藏

        轉眼到了7月份了,今年的blog更新的很慢很慢。寫點東西記錄自己的生活和工作狀態。
       生活:
       兒子提早10天在六月八號來到我們這個小家庭,每個好友在祝福我的同時告訴我,辛苦的日子剛剛開始。不過和大家的感覺一樣,辛苦但快樂著,在別人忙著在互聯網上種花種草,養豬養雞的時候,我開始扛起培養祖國新一代的責任。睡覺基本上很難保證連續性,早晨的運動也移到了晚上給兒子洗好澡以后。以前覺得就算到30歲還是覺得自己比較年輕,但是在那個23:25分兒子出來的一瞬間,自己覺得自己真的老了,需要成熟一點了,對兒子,對老婆。

        工作:
        其實今年年初的時候就有些彷徨,自己一手培養出來的SIP和原來的目標漸行漸遠,7月份我在產品會議上提出了SIP6(第一階段最終版),功能,性能,可擴展性都能夠滿足到明年中旬。雖然日訪問量就快突破1億,年底可能會到幾個億,但是這些數字對我來說只能證明這個架構還可以,但是SIP原有的目標已經被拋棄,成為了一個內部的服務集成平臺。
       下個階段會在做一些中心來滿足團隊的需要,但在我看來其實這些東西對我對團隊的價值有限,創新有限,但這就是工作。
        公司內部有些變化,當然是好是壞不得而知,不過作為我們這些level已經處于地面的人來說也沒啥影響。

       文章:
       最近的文章素材其實不少,但是受到內部技術專利申請,外部投稿的影響,能夠寫出來直接貼的越來越少,有時候也是這樣,分享固然好,但是有些時候有些東西只能夠小范圍分享。

       睡覺,睡覺,中午的休息是很寶貴的,一覺醒來還繼續自己的路。(走自己的路,讓自己無路可走。沒寫錯,呵呵,覺得這樣挺搞笑的)
    posted @ 2009-07-09 12:38 岑文初 閱讀(749) | 評論 (0)編輯 收藏

     

             這篇blog的問題不能算是解決,僅僅只是一種分析和猜測,后續的一些行動可能會證明一些猜想,也可能什么都解決不了。如果有和我相同情況的同學,也知道是什么問題造成的,請不吝賜教。

    問題:

    上周周末,沒有和同事們出去Outing,在家管孩子,去生產環境觀察了一下集群機器的當前運行狀態,發現應用在這些多核機器上壓力極端不均勻。

             Top一下大致狀態如下:



             峰值的時候,單CPU的使用率都到了80%,這種情況對于多核服務器來說是很不正常的使用。對于Java的開發者來說,多線程編程是無法控制線程如何在CPU上分配的,因為Java本身不實現線程機制,說是跨平臺的語言,但是性能及特性會根據操作系統的實現有很大的差異,因此Java調優有時候需要對系統配置甚至內核作調優。

    分析:

             首先在測試環境下作了多次同樣的壓力測試,嘗試了與線上一樣的操作系統版本,相似的配置,但測試結果卻是負載分配很均勻。

       
         

             此時重新啟動了一臺問題機器,發現負載降下來了,同時也很均衡,也就是說在當前的壓力下不應該有這樣高的cpu消耗,同時也排除了硬件或者操作系統的一些配置問題。

             CPU滿負荷的情況下,很多時候會認為應該是循環造成的,對于單個CPU的消耗更是。通過Top H查看具體到底哪一個線程會長時間消耗CPU

             可以看到PID13659的線程是“罪魁禍首”,但13659究竟在干什么,是應用的線程還是系統的線程,是否是陷入了死循環,不得而知。接著就按照Java的土辦法,Kill -3 pid,然后看看輸出日志。

             根據線程號來查找dump出來的日志中nid,發現這個線程是VM Thread,也就是虛擬機線程。(這里作一下轉換,將13659轉換成為16進制就是0x355b



             pstack看了一下這個線程的工作,結果如下:

    Thread 2074 (Thread 1846541216 (LWP 13659)):

    #0 0x0659fa65 in ObjectSynchronizer::deflate_idle_monitors ()

    #1 0x065606e5 in SafepointSynchronize::begin ()

    #2 0x06613e83 in VMThread::loop ()

    #3 0x06613a6f in VMThread::run ()

    #4 0x06506709 in java_start ()

    #5 0x00aae3cc in start_thread () from /lib/tls/libpthread.so.0

    #6 0x00a1896e in clone () from /lib/tls/libc.so.6

             搜索了一下ObjectSynchronizer::deflate_idle_monitors,發現了sunbug庫中有bug關于jdk1.6中由于這個方法導致運行期問題的說法:http://bugs.sun.com/bugdatabase/view_bug.do;jsessionid=803cb2d95886bffffffff9a626d3b9b28573?bug_id=6781744

             然后就直接去openjdk官方網站去查找這個類的代碼,大致了解一下他的作用,具體的代碼鏈接如下:http://xref.jsecurity.net/openjdk-6/langtools/db/d8b/synchronizer_8cpp-source.html
    主要工作應該是對資源對象的回收,在加上pstack的結果,應該大致知道是對線程資源的管理。但具體代碼就沒有進一步分析了。

    接著就分析一下自己的應用:

             壓力測試(高強度、長時間)都做過,沒有發現什么異常。

             本身應用是否會存在的缺陷導致問題呢。有人說VM Thread兼顧著GC的工作,因此內存泄露,對象長期積壓過多也可能影響,但其實在dump的結果可以看到,GC有單獨的工作線程,同時我也觀察到GC這些線程的工作時間長度,因此由于GC繁忙導致CPU上去,基本上來說可以排除。

             其次在SIP項目中使用了JDK的線程池(ExecutorService)LinkedBlockingQueue。后者以前的文章里面提到在1.5版本里使用poll方法會有內存泄露,到1.6雖然沒有內存泄露,但是臨時鎖對象增長的很快,會導致GC的頻度增加。

    行動:

             上面零零散散的一些分析,最終讓我決定有如下的行動:

    1.       升級某一臺服務器的JDK,當前是1.6.0_10-b33,打算升級到1.614版本。比較觀察多臺機器的表現,看是否升級了JDK可以解決問題。

    2.       去除LinkedBlockingQueue作為消息隊列,直接由生產者將生產結果按照算法分配給消費者線程,避免競爭,鎖的消耗,同時也防止LinkedBlockingQueue帶來的資源消耗。

    3.       測試環境繼續作長時間的壓力測試,同時可以結合Jprofile之類的工具來分析長時間后可能出現的問題。

    后話:

             這年頭真的啥都要學一點,求人不如求己。

    SA,DBA,測試都需要能夠去學習一些,起碼在初期排查問題上自己能夠做點啥,要不然別人也忙,自己又無從下手。就好比這次壓力測試好不容易排上隊,但是還是滿足不了及時上線的需求,因此自己去LoadRunner壓,好歹給出一個零時的報告先大家看著。應用的異常有時候是應用本身設計問題,也可能是開發語言的問題,也可能是操作系統的問題,因此要去定位這種比較復雜的問題,真的需要有耐心去好好的學習各種知識,現在看來知識還是匱乏啊,要不然就可以分析出openjdk中可能存在的問題。

    posted @ 2009-07-09 11:59 岑文初 閱讀(4421) | 評論 (3)編輯 收藏

     

             昨天在看Cache Client代碼的時候,發現在從資源池中獲取SocketIO部分代碼在高并發情況下效率不高,因此考慮通過一些變通的方式來提高效率,下面說的內容僅僅是當前自己琢磨出來可以部分提高效率的方法,希望看了這篇文章的同學能夠有更好的方式或者算法來提高效率。

    情景:

           Cache Client SocketIO資源池是一個兩級的Map,具體定義為:ConcurrentMap<String, ConcurrentMap<SockIO, Integer>>。第一級MapHost作為Key,第二級MapSockIO本身作為Key,三種SockIO狀態(可用,占用,廢棄)作為value。之所以采用一個Pool來存儲三種狀態主要是考慮到在高并發下,多個池之間保持原子性的復雜。

    每一次獲取可用的SocketIO的操作需要經歷:1.遍歷Host所在的Map2.逐個比較狀態。3.原子方法獲取可用SocketIO。(并發問題所要求的,具體代碼可以下載:http://memcache-client-forjava.googlecode.com/files/alisoft-xplatform-asf-cache-2.5.1-src.jar )。

    在修改過去的版本里面,首先遍歷的過程是一個固定順序的過程(keyset),這樣會導致在高并發的情況下,越來越多的資源申請命中率會下降,因為壓力總是落在keyset靠前的那些SockIO上(重復比較)。需要考慮通過什么手段可以提高在高并發下的申請命中率。

    思考:

    1. 資源申請的越早,被釋放的可能性越高,因此是否可以考慮采用更新SockIO最后申請時間來作為后續申請的初步依據。(本身復雜度帶來的耗時可能會超過命中率降低帶來的損耗)

    2. 采用隨機數的方式來確定keyset的起始游標,也就不是每次都從keyset第一位開始(可以把keyset看作一個首尾相接的數組)。

    3. 在每次資源回收的時候紀錄下該資源為可用(當前為每一個Host就記錄一個可能可用的資源,簡單化操作),作為申請的首選嘗試。(嘗試不成功在去遍歷)。

    當前實現了2,3組合,發現效果明顯,在500個并發下,每個線程200次操作(一系列動作),壓力測試結果如下:

    Cache test consume(cache測試總共耗時)average boundle consume(每個線程總耗時),average per request(每個線程每次操作總耗時)

    沒有作任何改動以前的測試結果:

    cache test consume: 11507741, average boundle consume: 57538, average per request :115

    采用了2策略以后的測試結果:

    cache test consume: 10270512, average boundle consume: 51352, average per request :102

    采用了23策略以后的測試結果:

    cache test consume: 9140660, average boundle consume: 45703, average per request :91

    posted @ 2009-05-07 17:15 岑文初 閱讀(1959) | 評論 (0)編輯 收藏

     

           服務集成平臺5.6的性能測試進入尾聲,這期的優化也算告一段落。這次主要的優化工作還是在三個方面:應用服務器(Apache,JBoss)配置,業務流程,Cache Client包(http://code.google.com/p/memcache-client-forjava/ )。這里把過去和這次優化對于Cache的使用作一個經驗分享,希望大家能夠用好Cache,提速你的應用。

           這里還是通過一些點滴的啟示來介紹優化的一些心得,很多時候還是要根據具體情況來判斷如何去具體實施,因此這里所說的僅僅是在一些場景下適用,并非放之四海皆準的教條。同時也希望看此文的各位同學,如果有更好的思路可以給我反饋,技術在交流中才會有發展。

    積少成多,集腋成裘

           性能提不上去,多半是在一些容易成為瓶頸的“暗點”(IO,帶寬,連接數,資源競爭等等)。Memcached Cache現在已經被大家廣泛使用,但是千萬不要認為對Cache的操作是低損耗的,要知道這類集中式CacheSocket連接數(會牽涉到linux操作系統文件句柄可用數),帶寬,網絡IO都是有要求的,有要求就意味著會有損失,因此積少成多,集腋成裘。服務集成平臺是一個高速的服務路由器,其大部分的業務數據,訪問控制策略,安全策略以及對應的一些控制閥值被緩存在Cache服務端,因此對于Cache的依賴性很強。每一次對于客戶端的性能提升,總會給服務集成平臺性能帶來不小的影響,但是每一次優化速度后,客戶端可以優化的空間越來越小,這時候需要一些策略來配合,提升應用整體性能。當前主要采用了以下幾點策略:

    1.  從數據獲取角度來做優化,采用本地數據緩存。(因為大家的應用需要能夠線形擴展,支持集群,所以才不使用應用服務器本地緩存,但是在某些緩存數據時間性不敏感或者修改幾率較小的情況下,可以采用本地緩存結合集中式緩存,減少對遠端服務器訪問次數,提升應用性能)。

    Cache ClientIMemcachedCache 接口中的public Object get(String key,int localTTL)方法就是本地數據緩存結合遠程Cache獲取數據的接口。具體流程參看下圖:

     

     

    2.  從數據更新角度,采用異步數據更新。(即不等待數據更新結果,直接進行其他業務流程)。這類操作使用場景比較局限,首先數據不會用作判斷(特別是高并發系統中的閥值),其次不需要返回結果作為后續流程處理輸入(例如計數器),時時性要求比較低。(這類操作其實是采用了集群數據傳播的一種策略,原先對于集群中所有節點都想即時傳播到,但是這樣對于性能損失很大,因此采用key對應的主Node采用即時設置數據,其他的通過后臺任務數據傳播來實現,由于key對應的主Node是數據第一操作和讀取節點,因此這類數據傳播操作時時性要求較低,適合這樣處理)。具體接口參見Cache Client 使用文檔。

    3.  一次獲取,多次使用。這點和系統設計有關,當前服務集成平臺的安全流程是鏈狀的,一次請求會經歷很多安全攔截器,而在每一個安全攔截器中會根據情況獲取具體的業務數據或者流程控制策略等緩存數據,每一個安全攔截器都是彼此獨立的,在很早以前是每一個安全攔截器各自在需要數據的時候去遠程獲取,但是壓力測試下來發現請求次數相當多,而且好些重復獲取,因此將這些業務數據作為上下文在鏈式檢查中傳遞,按需獲取和設置,最大程度上復用了數據。(其實也是一種減少數據獲取的方式)。

    4.  規劃好你的Cache區。有些同學在使用Cache的時候問我是否有什么需要注意的,我覺得在使用Cache之前,針對需要緩存的數據需要做好規劃。那些數據需要放在一個Cache虛擬節點上,那些數據必須分開放。一方面是根據自己業務系統的數據耦合程度(未來系統是否需要合并或者拆分),另一方面根據數據量及讀寫頻繁度來合理分配(畢竟網絡IO還是稀缺資源)。當然有時候業務系統設計者自己也不知道未來的發展,那么最簡單的方式給Key加上前綴,當前可以合并,未來也可以拆分。同時數據粒度也需要考慮,粒度設計太小,那么交互頻繁度就會很高,如果粒度太大,那么網絡流量就會很大,同時將來業務模塊拆分就會有問題。

     

     

    巧用Memcached Cache特有接口

           Memcached Cache提供了計數器一整套接口和addreplace兩個接口。這些特有接口可以很好的滿足一些應用的高并發性處理需求。例如對于資源訪問次數控制,采用Cache的計數器接口就可以實現在集群中的數量控制,原本通過Cachegetput是無法解決并發問題的(就算是本地緩存一樣),這就是一組原子操作的接口。而AddReplace可以滿足無需通過get方法獲取內容,就可以對于key是否存在的不同情況作出相應處理,也是一種原子性操作。這些原子操作接口對于高并發系統在集群中的設計會很有幫助。

     

    Cache Client Cluster

           Memcached Cache是集中式Cache,它僅僅是支持將數據能夠分片分區的存儲到一臺或者多臺的Cache Server實例中,但是這些數據并沒有作冗余,因此任何一個服務實例不可用,都會導致部分緩存數據丟失。當然很多人采取持久化等方式來保證數據的完整性,但是這種方式對于效率以及恢復的復雜性都會有影響。

           簡單的來想,為什么不把數據在多保存一份或者多份呢,當其中一份不可用的情況下,就用另外一份補上。這就是最原始的Cache Client Cluster的構想。在這里具體的設計細節就不多說了,主要說一下幾個要點,也讓使用Cache Client Cluster的同學有大致的一個了解。

           先來看看Cache Cluster的結構圖:




           這張圖上需要注意四個角色:Application(使用Cache的應用),Cache ClusterCache配置的虛擬集群),Cache NodeCache的虛擬節點,在同一個Cluster中的Cache Node數據保持完全一致),Cache InstanceCache虛擬節點中實際包含的Memcached Cache服務端實例)。

           應用僅僅操作Cache Node,不了解具體數據存儲或數據獲取是操作哪一個Cache 服務端實例。(這點也就是Memcached Cache可擴展性的基礎設計)。Cache Cluster又將多個Cache Node組成了虛擬的集群,通過數據冗余,保證了服務可用性和數據完整性。

     

           當前 Cache Client Cluster主要有兩種配置模式:active standby。(這里是借鑒了硬件的名詞,其實并不完全一樣,因為還是考慮到了效率問題)

           Cache Client Cluster主要的功能點:

    1.  容錯。當被分配到讀取或者操作數據的Cache虛擬節點不可用的情況下,集群其他節點支持代替錯誤節點服務于客戶端應用。

    2.  數據冗余。當操作集群中某一個Cache虛擬節點時,數據會異步傳播到其他集群節點。

    3.  軟負載。客戶端通過對操作的key作算法(當前采用簡單的key hash再取余的方式)選擇集群中的節點,達到集群中節點簡單的負載分擔。同時也由于這種模式,可以使得key都有默認的第一操作節點,此節點的操作保持時時更新,而其他節點可以通過客戶端異步更新來實現效率提升。

    4.  數據恢復。當集群中某一節點失效后恢復時,其數據可能已經完全丟失,此時通過配置成為Active模式可以將其他節點上冗余的數據Lazy復制到該節點(獲取一個復制一個,同時只支持一個冗余節點的數據獲取(不采取遍歷,防止低效))。

     

    Active模式擁有1,2,3,4的特性。Standby模式擁用1,2,3特性。(其實本來只考慮讓Standby擁有1特性)。未來不排除還會有更多需要的特性加入。Activekey不存在的情況下會有些低效,因為會判斷一個冗余節點是否存在內容,然后決定是否修復當前節點。(考慮采用短期失敗標示之類的,不過效率不一定高,同時增加了復雜度)

     

     

    運行期動態擴容部署

           Memcached cache客戶端算法中比較出名的是Consistent Hashing算法,其目的也就是為了在節點增加或者減少以后,通過算法盡量減小數據重新分布的代價。采用虛擬節點,環狀和二叉樹等方式可以部分降低節點增加和減少對于數據分布的影響,但是始終還是有部分數據會失效,這點還是由于Memcached Cache是集中式Cache所決定的。

           但如果有了Cache Cluster的話,數據有了冗余,就可以通過逐步修改集群中虛擬節點配置,達到對于單個虛擬節點的配置動態擴容。

           支持動態部署前提:

    配置文件動態加載。(配置文件可以在Classpath中,也可以是Http資源的方式)通過Cache Client Cache Manager可以停止Cache 服務,重新加載配置文件,即時生效。

    當前動態部署的兩種方式:

    1.              修改集群配置中某一套虛擬節點的服務實例配置(socketPool配置),增加或者減少后端數據存儲實例。然后動態加載新的配置文件(可以通過指定遠端的http配置作為新的配置文件),通過集群的lazy的修復方式,逐漸的將數據從冗余節點復制到新的節點上來,最終實現數據遷移。

    2.              修改集群配置中某一套虛擬節點的服務實例配置(socketPool配置),增加或者減少后端數據存儲實例。然后動態加載新的配置文件(可以通過指定遠端的http配置作為新的配置文件),在調用Cache Manager主動將數據由某一虛擬節點復制到指定的集群中,實現數據批量遷移,然后根據需要看是否需要修改其他幾套虛擬節點配置。

     

    存在的問題:

    1.       當前沒有做到不停止服務來動態部署。(后續考慮實現,當前將編譯配置和重新啟動服務器的工作節省了)

    2.       不論是lazy復制還是批量數據遷移,都是會將原本有失效時間的數據變成了無失效時間的數據。(這個問題暫時還沒有一種可行的高效的方式解決)

     

     

    后話

           性能優化這點事還是那句老話,需要了再去做也不遲。同時如果你開發的是一個每天服務訪問量都是上億,甚至更高的系統,那么有時候斤斤計較會收獲不少。(當然是不影響系統本身業務流程的基礎)。

           Cache客戶端自從作為開源放在Google上也收到了不少朋友的支持和反饋,同時自己業務系統以及其他部門同學的使用促使我不斷的去優化和滿足必要的一些功能擴展(但是對于Cache來說,還是那句話,簡單就是美,高效是使用Cache的最原始的需求)。

           當前Cache Client版本已經到了2.5版本,在Google上有詳細的Demo(單元測試,壓力測試,集群測試)和說明使用文檔。是否速度會慢于其他Memcached客戶端,這不好說的很絕對,反正大家自己拉下去比較一下看看就知道了,當然為了集群和其他的一些必要的附加功能還是做了一些性能犧牲。

     

    項目地址在:http://code.google.com/p/memcache-client-forjava/

    在首頁的右側有demo,doc,binary,src的鏈接,直接可以下載使用和察看。希望對需要的同學有幫助。

    posted @ 2009-04-28 23:19 岑文初 閱讀(3374) | 評論 (6)編輯 收藏

            blog已經快兩年了,起初僅僅是為了自己“備個案”,結果慢慢演變成為了“分享成癮”。前幾天一個朋友給我的blog留言,談到希望在新年里能夠看到的不僅僅是我對技術的分享,更希望能夠看到對于技術學習、職業發展的規劃。因此想到了寫一點什么分享一下自己這些年的一點點“收獲”,周星馳的喜劇之王里面說到他是一個演員(雖然被叫做跑龍套的),我想我,就一個寫代碼的。

    愛這行

           從事任何行業都一樣,只有真正的愛上了這份工作,才會投入熱情,才會在順境中自我警醒,在逆境中尋找突破。這個行業的競爭很激烈,你停下來走,別人就立刻會跑步超過你,沒有對這一行業的一種熱情,就很難在困境中保持一種執著的態度堅持到底。

    踏踏實實“扎馬步”

           今天無意中看了“校長”的“程序員&司機”,其中談到了關于程序員速成的問題。其實速成班畢業的 “系統殺手”早已在遍布大江南北,只是在互聯網時代,互聯網的應用型軟件生命周期越來越短,業務驅動主導的情況下,這種速成方式看起來反而提高了企業生產效率。但這樣的人才也就只能寫幾個Facebook上的插件應用或者iGoogle上的Gadget,真的要出GoogleAmazonYahoo改變互聯網世界的企業,還是需要踏踏實實先學“扎馬步”的人。

           很多在學校的同學或者剛剛畢業的朋友都看什么熱門學什么,SpringAJAXHibernate等等,又有多少人在看Spring之前把J2SENIOXMLCollection等先好好學習一下,在看AJAX之前把Http協議、DTDXML Schema好好看一下,在學習Hibernate以前先把J2EE事務規范搞清楚。Java最大的好處就是開源,能夠讓人們站在更高的起點來作出更多的創新,但是對于學習者來說,不了解自己站在什么上面的時候,可能摔下來會很痛。在用的時候多問一些為什么,在遇到問題的時候多找找原因,在了解以后多提出一些優化的方案,這樣才會進步的更快,走的更遠。

           記得我前一陣子回家的時候和媽媽聊起最近的工作,雖然媽媽不太明白,但是也知道我現在做的東西技術含量比較高,囑咐我“千萬不要什么都教給自己的同事,徒弟帶出就不要師傅了”(這當然是老一輩的觀念了)。我和她說:“不要擔心,這種學的會的不教遲早也會,學不會的教了也學不會”。其實這里說的學的會的就是技術,而學不會的就是經驗和能力。這個行業的人在日積月累過程中并不會去比較掌握的知識面有多廣多深,畢竟這行業更新很快,其實能力強的人在多年的學習中就積累了很多的找問題,分析問題,總結問題,提出建議,發掘創新的能力,這些才是這行業人在發展中最寶貴的財富,也是一個人成長的標志。開始的過程中,踏踏實實地“扎馬步”,了解一些最基本的知識,那么上層技術的發展對于他來說僅僅只是一個短暫的學習過程,甚至可以觸類旁通。因此還是要奉勸每一個新入行的同學,踏踏實實,靜下心來做技術,就算工作安排得都是一些浮躁和重復的工作,用高效的方式來結束那些重復勞動,多留一些時間給自己打基礎。

    逆境養兵、順境攻城掠地

           普通人的工作經歷通常都是起伏不定的,一個人的能力是否能夠得到體現,不僅僅靠自己的努力,有時候也需要“天時”、“地利”。馬云比較有名的一句話:“今天很殘酷,明天更殘酷,后天很美好,但是大多數人死在明天晚上,看不到后天的太陽!!!”,其實也在說明一件事,就是很多時候需要一種堅持的精神才能得到寶貴的機會。

    今天是我進入阿里巴巴滿3年,這3年讓我感觸很深的是:1.逆境不要氣餒,厚積薄發。2.順境不要懈怠,一股作氣,把握機會展現自己最大的能力。3.在逆境和順境的轉換過程中,創造機會,不要坐等機會,要學會不在其位,也謀其職。最后一點就拿我自己的親身經歷來說,我原來就職于一家通信公司,因此對于互聯網應用的開發和架構設計要比很多人弱,進入阿里巴巴以后工作了半年(主要作業務開發),正好阿里軟件創立,當時被分配到了阿里軟件第一個產品負責客戶模塊,當時的應用是通過MDA框架配置搭建的,開發人員很大程度上不需要自己做太多的編碼,但是這個平臺并沒有搭建過如此復雜的大型應用,因此存在著不少問題,當然這些問題都是通過業務產品線的人反饋給平臺部的人,當時平臺部門人員很少,但是卻要修復和完善諾大一個平臺,因此常常擱置開發人員的反饋。當時在自己工作之余就琢磨和研究平臺,同時跟蹤調試平臺,最后直接給出解決方案,逐漸的就融入到了平臺開發中,最后被吸收到了平臺部門,進入平臺部門以后遇到了兩位很好的老大,根據我的特質給我安排了研究和學習的工作。接下去就是不斷地參與阿里軟件各個基礎平臺的構建,核心技術的研究和探索,找到了興趣和工作的最佳結合點。因此,當你困惑的時候首先不是去抱怨,而是審視一下自己是否還有作的不夠的,是否還有可以提升的空間,多給自己制造一些機會,也許我們不用等到后天,也不會死在明天夜里,明天早晨我們就看到了太陽。

    海納百川、冰凍三尺

           很多朋友可能聽老師或者前輩也說過類似的話,就是作為一個技術人員要廣也要鉆。就好比現在很多人都要DB Scale out,同時也要Scale up。我從自己的角度來說一下廣和鉆的看法。廣:1.要有容人之量。(很多時候程序員最大的毛病就是喜歡在技術上比較,未嘗不是好事,但是一個人的能力總歸有限,多看看別人的,多聽聽別人的,也許能夠讓自己少用時間獲得更多的收獲,特別是自己戰友的聲音)2.觸類旁通,多問個為什么,多跨過界去學習。在阿里巴巴,PDSADBAUI等等職位各司其職,作為開發的我們其實也應該去了解如何去畫Use Case,如何假設服務器和應用環境,如何寫一些略微復雜的SQL,了解一些DB的特性,如何能夠簡單的作出一些基礎的頁面,使用簡單的css來美化一下門面。這些就是需要多跨過界,多虛心的去學習。鉆:1.本職工作技術一定要扎實,每作一個技術點就要把技術吃透,同時延伸開來,發掘更多的技術亮點。2.多接觸新鮮事物,但是有選擇的去了解,有目的的去學習和實踐(目的的源泉就是工作的需求)。3.學會分享,一個人自己搞懂一個技術很容易,一個人要把他熟悉的技術寫下來就會發覺原來自己還有那么多沒有搞清楚,一個人如果要把寫下來的東西宣講給別人聽,他就會發現,原來寫下來的僅僅是那么一小塊,因此學會分享,從自己了解,到記錄分享,到演講傳播就是一個不斷深化和廣化的過程。個人覺得小公司鍛煉人(啥都自己干),大公司培養人(該干的要干好),因此自己常回頭看看自己在廣和鉆上的不足,可以讓自己進步的更快,學的更全面。    

           學中醫積累經驗,學西醫尋找突破

           中醫以對人體經絡血脈了解為基礎,通過望聞問切來尋找病理根源,行醫年限越久,找問題解決問題的經驗越強。西醫以科學技術為手段,通過試驗化的方式不斷尋找突破,并且將成果積累并且傳遞給更多的人,但是否年限越久越有能力,或者是使用得器材越廣越資深,這點全要看個人對于醫術的理解,如果僅僅停留在對器械的使用和對成果的依賴,那么只會成為一個庸醫。當然這里絕對沒有對中西醫的差別化或者評價,僅僅要說明的是,在手段豐富的情況下,容易忽視了本質,只看到了皮毛,積累的時候多一些追根溯源,站在別人的成果上才更踏實,因此在對經驗積累上向中醫多學一些,在尋找突破,傳播技術上多學一點西醫的風格。不過說到低,還是要看學習的人,靜的下心,沉得住氣,才會有積累,才會有突破.

    不做一個純粹的“技術人員”

           不做一個純粹的“技術人員”,其實也就是說要培養自己多方面的能力,我僅僅把自己想到的一些點列出來說說:

    1. 項目產品化的思想。現在就算在學校里面給導師作項目都講究一個商業價值,更不要說在企業里工作。作為一個開發或者架構師最重要的就是要有產品化的概念,這也是項目是否成功的關鍵。軟件的目的是為人服務,如何服務的好,那就要以一個產品的思路去做項目,而不是作為實驗室的實驗品,為客戶提供好服務就會給公司帶來商業價值,對自己的工作也會有很好的肯定。這是一個良性循環,反之則是惡性循環(多贏變成多輸)。如何做到產品化,首先就是需要去了解需求,而不是布置需求,其次就是設計時多聽取一些不同角色的意見,最后就是在客戶的反饋過程中反省。

    2. 多一些設計,少砌兩塊磚。代碼寫的再好,其實也只是用磚塊砌墻砌的比較好罷了,這年代已經不會為了節省兩塊磚而給一個優秀工作者了,同時技術的日新月異,總是擺弄技巧,學習花拳繡腿已經跟不上時代了。多了解一些行業背景,多參與一些架構設計,將業務設計用良好的架構體系來實現,那才是一個稱得上有能力的技術人員。

    3. 學會前瞻,學會自己找事。記得我剛進平臺組,最不適應的就是我的老大基本不太給我布置太詳細的任務,這就好比進入大學,老師不給作業,自己反而心里沒底了,其實自己找事的過程就是一個自己學習的過程,當我一天下來感覺沒干什么,沒學到什么,心里就開始發虛。如何能夠前瞻性的去選擇一些目標,如何對現有情況提出一些創新和建議,都是一種更高能力的要求。現在SIP組也是一樣,在我們這個組里雖然現在每周還是布置一定工作,但是我對其他兩個同學的要求也是希望能夠有前瞻性,學會發現問題,預防問題,更甚者就是提出創新。當你具備了這種環境的時候,你就需要鍛煉自己的能力了。

    4. 做個讓老大放心的人。這點也許很多人和我一樣在業務上很早就讓老大覺得可以安心睡覺了,但是其實另一方面,如何在商業角度看問題,如何培養新人,如何協調部門合作等等,都會讓你的老大更加安心。另一方面來看,其實在這些能力的培養過程中,你不再局限于業務水平的提升,讓自己在更多方面更加成熟。

    六脈神劍

           今天是我進入阿里巴巴3年整。在阿里巴巴有個說法,只有在阿里巴巴工作了3年,才能算是一個真正的阿里人,因為理解阿里巴巴的文化,需要三年時間的沉淀。這里就從一個寫代碼的角度分享一下阿里巴巴的六脈神劍文化。

    客戶第一:如果你是做架構的,作平臺的,作開發工具的,那么客戶就是和自己一樣的開發者,多學習一下開源項目的精神,多從使用者角度去考慮問題,那么你的東西才會被更多的人認可和使用,永遠不要去做一個“玩具”的開發者。如果你是做產品的,那么就多聽,多想,多問,永遠不要急著去寫代碼。

    擁抱變化:敏捷開發的基本原則。互聯網應用尤其如此,不要害怕變化,在需求和架構之間找到平衡點(說起來比較容易^_^)。

    團隊合作:一個人的力量始終有限,分享,交流,合作能夠讓自己事半功倍,學的更多,看得更遠。

    誠信:說到就要做到,做了就要做好,做軟件開發一樣也需要有責任感,貼滿狗皮膏藥的代碼上如果注釋是你的名字未來也會給你蒙羞。踏踏實實地用心去寫代碼,去設計架構,不經意間得到的要遠遠比那么一點工資來的多。

    激情:還是那句話,你如果不愛這行,乘著年輕趕快轉行。

    敬業:專業執著,精益求精

    很感謝各位能看完這篇感受分享,以上都僅僅是個人的一點感受,能夠引起共鳴那么證明我們的經歷很相似,如果能夠給到你一點幫助,那寫這些就真的有意義了。不論你在別人眼里是一個資深架構師還是開發人員,其實如果你愛這個行業的話,你應該就是一個寫代碼的,但是每個人的經歷都是一本“寫代碼的自我修養”,珍惜自己的選擇,讓自己在興趣和工作中找到最佳結合點。

    posted @ 2009-03-11 02:38 岑文初 閱讀(5004) | 評論 (20)編輯 收藏

     

           今天看了“Database Sharding at Netlog, with MySQL and PHP”一文,和去年我們討論擴展的思路很類似(不過這種分布式擴展,計算,存儲的思路都很類似),但是這片文章的作者是在日益爆炸式增長的用戶數據下實踐的分享,因此這里將文中的一些思想記錄下來分享一下。

           Netlog擁有4000萬活躍用戶,每個月有超過5000萬的獨立用戶訪問網站,每個月有5億多的PV。數據量應該算是比較大的。作者是Jurriaan Persyn,他從一個開發者角度而非DBA或者SA角度來談Netlog是如何通過數據切分來提高網站性能,橫向擴展數據層的。原文在:http://www.jurriaanpersyn.com/archives/2009/02/12/database-sharding-at-netlog-with-mysql-and-php/

           首先,還是先談到關于數據庫在數據日益龐大的情況下一個演變過程。
       
       第一階段:讀寫同在一臺數據庫服務器

       

    第二階段:讀寫分離(可以解決讀寫比例均衡或者讀居多的情況,但是帶入了數據復制同步的問題)



       第三階段:部分數據獨立部署結合讀寫分離。(部分數據根據其業務獨立性情況,可以將所有的數據獨立存儲到數據庫服務器,分擔數據讀寫壓力,前提是要求數據具有較高的業務獨立性)

        
           第四階段:數據分拆結合讀寫分離(三階段的增強)


           第五階段:問題出現,分拆也無法解決數據爆炸性增長,同時讀寫處于同等比例。


           解決問題兩種方式:DB Scale up DB Scale out。前者投入以及后期擴展有限,因此需要進行數據切分。



           上圖就是將photo的數據切分到了10臺數據庫服務器上。

           切分數據的兩個關鍵點:

    1. 如何根據存儲的數據內容判斷數據的存儲歸屬,也就是什么是內容的分區主鍵。

    2. 采用什么算法可以根據不同的主鍵將內容存儲到不同的分區中。

    分區主鍵的選擇還是要根據自身的業務場景來決定,Netblog選擇的是用戶ID

    采用什么方式將分區主鍵映射到對應的分區可以通過以下四種方式:

    1. 根據數據表來切分。(前提就是數據獨立性較強,和前面提到的三階段類似)

    2. 基于內容區間范圍的分區。(就好比前1000個用戶的信息存儲在A服務器,1000-2000存儲在B服務器)

    3. 采用Hash算法結合虛擬節點的方式。(這類在memcached等等分布式場景中最常見,其實也是一個難點),缺點就是在于動態增加存儲節點會導致數據部分或者全部失效。

    4. 目錄式的分區。最簡單也是最直接的方式,key和分區的對應關系被保存,通過查找目錄可以得到分區信息。適合擴展,就是增加查詢損耗。

    如何將數據分布的盡量均勻,如何平衡各個服務器之間的負載,如何在新增存儲機器和刪除存儲機器的時候不影響原有數據,同時能夠將數據均攤,都是算法的關鍵。在分布式系統中DHTDistribute Hash Table)被很多人研究,并且有很多的論文是關于它的。

    數據的橫向切分給應用帶來的問題:

    1. 跨區的數據查詢變得很困難。(對于復雜的關聯性數據查詢無法在一個請求中完成)

    2. 數據一致性和引用完整性較難保證。(多物理存儲的情況下很難保證兼顧效率、可用性、一致性)

    3. 數據分區之間的負載均衡問題。(數據本身的不均衡性,訪問和讀寫的不均衡性都會給數據分區的負載均衡帶來困難)

    4. 網絡配置的復雜性。(需要保證服務器之間的大數據量頻繁的交互和同步)

    5. 數據備份策略將會變得十分復雜。

    解決這些問題當前已經有的一些開源項目:

    1. MySql Cluster,解決讀寫分離問題已經十分成熟。

    2. MySql Partitioning,可以將一個大表拆分為很多小表,提高訪問速度,但是限制與這些小表必須在同一臺服務器上。

    3. HSCALESpock Proxy都是建立與MySql Proxy基礎上的開源項目,MySql Proxy采用LUA腳本來進行數據分區。

    4. HiveDBMySql分區框架的java實現。

    5. 另外還有HyperTable,HBase,BigTable等等。

    Netblog幾個需求:

    1.              需要靈活的可擴展性。對于存儲增加減少需要能夠動態的及時實施,因為數據量增長很快,如果策略會導致數據失效或者部署需要重新啟動,則就不能滿足需求。

    2.              不想引入全新的數據層和與原有系統不匹配的抽象層,因為并不是所有數據都需要切分,僅僅在需要的情況下通過API的方式來透明切分數據。

    3.              分區的主鍵需要可配置。

    4.              需要封裝API,對開發人員透明數據切分的工作。

          Netblog Sharding的實現




        上圖就是
    NetblogSharding的結構圖,主要分成了三部分:ShardSharddbSharddbhostShard就是一個表,里面存放了部分用戶數據。Sharddb是一個表的組合就像一個虛擬的DBSharddbhost是具體的存儲分區。ShardSharddb可以根據負載的情況被移動到不同的host中去。

           對于Shard的管理,Netblog采用的是目錄查詢的管理方式。目錄信息也存儲在MySql中,同時會通過互備,Memcache,集群來確保安全性和高效性。

           Shard Table API采用了多一層的映射模式來適合各種不同屬性的查詢情況。數據和記錄在數據庫中存儲除了UserID以外還有對應的ItemIDItemID的作用就是定義了具體獲取數據的字段信息,例如關聯照片表時,ItemID就是PhotoId,關聯視頻表時,ItemID就是videoID

           一個獲取用戶id26博客信息的范例:

    1Where is user 26?

       User 26 is on shard 5.

    2On shard 5; Give me all the $blogIDs ($itemIDs) of user 26.

    That user's $blogIDs are: array(10,12,30);

    3On shard 5; Give me all details about the items array(10,12,30) of user 26.

    Those items are: array(array('title' => "foo", 'message' => "bar"), array('title' => "milk", 'message' => "cow"));

    對于Shard的管理Netblog采取的措施主要有這些:

    1. 服務器之間的負載均衡根據用戶數,數據庫文件大小,讀寫次數,cpu load等等作為參數來監控和維護。根據最后的結果來遷移數據和分流數據。

    2. 移動數據時會監控用戶是否在操作數據,防止不一致性。

    3. 對于數據庫的可用性,采用集群,master-mastermaster-slave復制等手段。

    最后通過三種技術來解決三個問題:

    1. Memcached解決shard多次查詢的效率問題。

    根據上面的范例可以看到,一次查詢現在被分割成為了三部分:shard查詢,item查詢,最終結果查詢。通過memcached可以緩存三部分內容,由前到后數據的穩定性以及命中率逐漸降低,同時通過結合有效期(內容存儲時效)和修改更新機制(add,update,delete觸發緩存更新),可以極大地解決效率問題。甚至通過緩存足夠信息減少大量的數據庫交互。

    2. 并行計算處理。

    由于數據的分拆,有時候需要得到對于多Shard數據處理的結果匯總,因此就會將一個請求分拆為多個請求,分別交由多個服務器處理,最后將結果匯總。(類似于Map-reduce

    3. 采用Sphinx全文搜索引擎解決多數據分區數據匯總查詢,例如察看網站用戶的最新更新情況或者最熱門日至。這個采用單獨系統部署,通過建立全局信息索引,來查詢數據情況。

    以上是技術上的全部內容,作者在最后的幾個觀點十分值得學習,同時也不僅僅限于數據切分,任何框架設計都可以參考。

    “Don't do it, if you don't need to!" (37signals.com)

    "Shard early and often!" (startuplessonslearned.blogspot.com)

    看起來矛盾的兩句話,卻是說出了對于數據切分的一些考慮。

    首先在沒有必要的情況下就不要考慮數據切分,切分帶來的復雜性直接影響可用性,可維護性和一致性。在能夠采用Scale up的情況下,可以選擇Scale up降低框架復雜度。

    另一方面,如果發現了業務增長情況出現必須要擴展的趨勢,那么就要盡早著手去實施和規劃擴展的工作,并且在切分和擴展過程中要不斷地去優化和重構。

    后話:

           其實任何架構設計首要就是簡單直接,不過度設計,不濫竽充數。其實就是要平衡好:可用性、高效性、一致性、可擴展性這四者之間的關系。良性循環、應時應事作出取舍和折中。用的好要比學會用更重要,更關鍵。

    posted @ 2009-03-04 00:58 岑文初 閱讀(2003) | 評論 (2)編輯 收藏

    主站蜘蛛池模板: 免费无码一区二区三区蜜桃| 日韩特黄特色大片免费视频| 亚洲一卡2卡3卡4卡乱码 在线| 免费在线观看的黄色网址| 国产成人高清亚洲一区久久 | 亚洲av成人中文无码专区| 夜夜亚洲天天久久| 国产亚洲精品影视在线产品| 日韩视频在线免费| 69成人免费视频| 亚洲国产美女精品久久久| 四虎免费永久在线播放| 久久久久久久免费视频| 日韩中文字幕免费视频| 两性色午夜免费视频| 亚洲精品在线播放视频| 无限动漫网在线观看免费| 高h视频在线免费观看| 亚洲中文字幕无码一区二区三区| 成人免费视频国产| 妞干网免费观看视频| 国产电影午夜成年免费视频| 污视频在线观看免费| 精品久久久久久亚洲中文字幕| 亚洲中文字幕久久精品无码2021| 国产高清在线免费| 午夜免费福利在线| 日韩免费高清视频| 国产亚洲福利一区二区免费看| 性感美女视频在线观看免费精品| 动漫黄网站免费永久在线观看| 无码国产精品一区二区免费虚拟VR| 91精品国产免费久久国语麻豆| 久久免费精品视频| 日本免费一区二区久久人人澡| 国内精品一级毛片免费看| 免费无码又爽又刺激高潮软件| 久久成人免费播放网站| 99久久免费观看| 青青青免费国产在线视频小草| 2021久久精品免费观看|