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

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

          #

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

          愛這行

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

          踏踏實實“扎馬步”

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

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

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

          逆境養(yǎng)兵、順境攻城掠地

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

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

          海納百川、冰凍三尺

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

                 學中醫(yī)積累經(jīng)驗,學西醫(yī)尋找突破

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

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

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

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

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

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

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

          六脈神劍

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

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

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

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

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

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

          敬業(yè):專業(yè)執(zhí)著,精益求精

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

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

           

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

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

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

             

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



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

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


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


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



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

                 切分數(shù)據(jù)的兩個關鍵點:

          1. 如何根據(jù)存儲的數(shù)據(jù)內容判斷數(shù)據(jù)的存儲歸屬,也就是什么是內容的分區(qū)主鍵。

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

          分區(qū)主鍵的選擇還是要根據(jù)自身的業(yè)務場景來決定,Netblog選擇的是用戶ID

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

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

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

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

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

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

          數(shù)據(jù)的橫向切分給應用帶來的問題:

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

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

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

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

          5. 數(shù)據(jù)備份策略將會變得十分復雜。

          解決這些問題當前已經(jīng)有的一些開源項目:

          1. MySql Cluster,解決讀寫分離問題已經(jīng)十分成熟。

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

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

          4. HiveDBMySql分區(qū)框架的java實現(xiàn)。

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

          Netblog幾個需求:

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

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

          3.              分區(qū)的主鍵需要可配置。

          4.              需要封裝API,對開發(fā)人員透明數(shù)據(jù)切分的工作。

                Netblog Sharding的實現(xiàn)




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

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

                 Shard Table API采用了多一層的映射模式來適合各種不同屬性的查詢情況。數(shù)據(jù)和記錄在數(shù)據(jù)庫中存儲除了UserID以外還有對應的ItemIDItemID的作用就是定義了具體獲取數(shù)據(jù)的字段信息,例如關聯(lián)照片表時,ItemID就是PhotoId,關聯(lián)視頻表時,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. 服務器之間的負載均衡根據(jù)用戶數(shù),數(shù)據(jù)庫文件大小,讀寫次數(shù),cpu load等等作為參數(shù)來監(jiān)控和維護。根據(jù)最后的結果來遷移數(shù)據(jù)和分流數(shù)據(jù)。

          2. 移動數(shù)據(jù)時會監(jiān)控用戶是否在操作數(shù)據(jù),防止不一致性。

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

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

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

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

          2. 并行計算處理。

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

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

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

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

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

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

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

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

          后話:

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

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

           

          目標:

                   根據(jù)四方面的配置調整,觀察SIP5.5在高并發(fā)下的性能情況。

                   由于SIP接收的請求都是服務型處理請求,因此認為Apache+Jboss只會帶來多余的轉發(fā)損耗,所以正好這次也作一個驗證,看看Apache+JBoss是否不適合于這種純動態(tài)服務請求的情況。 
                  四方面環(huán)境比較:

          1. JBoss APR模式與Http1.1模式性能差異。(確切來說應該是JBoss內置Tomcat采用APR的情況)。

          2. 是否采用Apache+JBossApache不同的轉發(fā)模塊帶來的性能差異。

          3. Memcached Client版本優(yōu)化后對性能影響。

          4. ISP有不同延時對于SIP的性能影響。

          前置條件:

          SIP版本5.5,并發(fā)用戶600ISP默認耗時20msApache配置和JBoss WebContainer配置,一些優(yōu)化配置參見附加信息。

          最終結果:

                 SIP采用Apache(Mod_jk)+JBoss(APR)+Cache2.4.2,具體配置參見附加信息。

          測試結果表格:

                 詳細的測試報告可以參看:http://spreadsheets.google.com/pub?key=pcsQ9Wm01cIEjjQcistPNDg

          JBoss配置差異測試比較:

           

          Apache(2.0.52)配置

          JBoss(4.2.1)配置

          Cache Client Version

          TPS

          TPS區(qū)間

          APR

          2.4.2

          1705

          1600-1900

          HTTP1.1

          2.4.2

          1615

          1550-1700

          Mod_jk(1.2.27)

          HTTP1.1

          2.4.2

          2090

          1800-2800

          Mod_jk(1.2.27)

          APR

          2.4.2

          3223

          3200-3400

          補充:

                   配置成為Http1.1模式的兩種情況下,測試結果TPS波動頻率很高,在Mod_jk模式下波動幅度也很大。

          1.         可以證實在非APR模式和高并發(fā)的情況下Web容器處理請求能力不穩(wěn)定,同時也直接影響到了SIP的性能。

          2.         在測試中發(fā)現(xiàn)不采用APR模式的情況下,Web容器會消耗大量的socket連接通道。

          Apache模塊差異測試比較:

           

          Apache(2.0.52)配置

          JBoss(4.2.1)配置

          Cache Client Version

          TPS

          TPS區(qū)間

          APR

          2.4.2

          1705

          1600-1900

          Mod_jk(1.2.27)

          APR

          2.4.2

          3223

          3200-3400

          Weblogic.so

          APR

          2.4.2

          1033

          350-1400

          補充:

                   Weblogic.so模塊是以前系統(tǒng)遺留的http請求轉發(fā)模塊。在測試過程中Weblogic模塊的測試中波動頻率和幅度都很大。根據(jù)測試結果可以看出:

          1.       APR模式下,Apache+JBoss對于SIP這種無靜態(tài)資源訪問,純API性質的服務來說依舊會有比較好的優(yōu)化效果,特別是在接受請求環(huán)節(jié)。(不論是TPS還是TPS波動區(qū)間和頻率都有很好的表現(xiàn))

          2.       Weblogic.so這個模塊性能絕對不行,穩(wěn)定性極差。

          Cache客戶端版本差異測試比較:

           

          Apache(2.0.52)配置

          JBoss(4.2.1)配置

          Cache Client Version

          TPS

          TPS區(qū)間

          APR

          2.4.2

          1705

          1600-1900

          APR

          2.4

          1615

          1550-1700

          Mod_jk(1.2.27)

          APR

          2.4.2

          3223

          3200-3400

          Mod_jk(1.2.27)

          APR

          2.4

          2485

          2650-2800

          補充:

                   2.4.22.4版本在單獨測試的環(huán)境下:500并發(fā)用戶,每個并發(fā)用戶1000getset,性能相差40%左右。

                   上面測試結果可以看出:

          1.    在無apache時,性能有所提升,但不明顯,而在有apache時,性能大幅提升,證明在無apache的情況下,memcache客戶端已經(jīng)不是性能瓶頸,因此替換版本效果不大,在http請求處理性能大幅提升的情況下,memcache客戶端性能優(yōu)化的優(yōu)勢就得到了體現(xiàn)。

          2.    在測試中也發(fā)現(xiàn)Apache + JBoss波動頻率和區(qū)間都小于其他幾個測試情況,圖形十分平穩(wěn),證明處理請求不是系統(tǒng)瓶頸。

          ISP響應時間差異測試比較:

           

          Apache(2.0.52)配置

          JBoss(4.2.1)配置

          Cache Client Version

          ISP響應時間(ms)

          TPS

          TPS區(qū)間

          Mod_jk(1.2.27)

          APR

          2.4.2

          20

          3223

          3200-3400

          Mod_jk(1.2.27)

          APR

          2.4.2

          110

          Mod_jk(1.2.27)

          APR

          2.4.2

          900

          測試優(yōu)化總結:

          1. 不要認為內存使用無關性能。現(xiàn)在很對開發(fā)者認為內存申請分配是由gvm來管理,但是內存是否合理使用很可能會影響互聯(lián)網(wǎng)應用的高并發(fā)下性能。GC帶來的系統(tǒng)短暫停滯會在高并發(fā)下影響性能。

          2. 使用java的方法需要有足夠的“理由”和“度”。Java1.5以后對concurrent方面做了很不錯的支持,但是這些并發(fā)處理畢竟會消耗資源,因此在能夠避免頻繁使用的情況下盡量優(yōu)化流程。在一些簡單的場景下,是否有必要使用一些比較耗時的方法,例如split,用起來很方便,但是在設計底層通信操作的時候還是分秒必爭(JProfiler看看消耗的時間占用的比例以及調用的次數(shù)),用一些自己簡單的方式替換。

          3. 眼見未必為實,測試才得真知。在SIP5.5中考慮連接后端ISP方式由HttpURLConnection替換成為HttpClient,感覺HttpClient的開發(fā)模式更加容易認為是共享傳輸通道(Get,Post都單獨作為包來交由HttpClient單個實例),雖然看到HttpURLConnection說明中提到會共享通道。結果一壓,HttpClient根本上不去,原因是構建這些Get,Post本身也很耗時,同時HttpURLConnection底層共享優(yōu)化的也很不錯。HttpClient的優(yōu)勢還是在于去構建簡單的客戶端,能夠處理附加cookies等額外需求。

          4. 鏈式處理的情況下,上下文中共享信息減少數(shù)據(jù)頻繁訪問緩存。

          5. 操作系統(tǒng)配置以及Web容器的配置會直接影響應用的性能,特別是一些Socket交互比較頻繁,會有很大并發(fā)的應用。具體的配置可以參見最后的說明。

          6. APR模式對于服務器處理能力有很大的影響,EpollUnix socket都會來帶很大的性能提高(降低資源消耗)。

          7. 在過去談過異步Servlet的方式(Servlet3.0的特性之一),但是JBoss5測試下來看,穩(wěn)定性并不好,并且可能會有一些并發(fā)問題。

          8. 先列出性能瓶頸可能點,然后分別對已經(jīng)優(yōu)化的模塊進行單獨測試,最后整合并且通過多場景測試來驗證優(yōu)化結果。


          附加信息:

          JBoss Web Container配置:

          <Connector port="8128" address="${jboss.bind.address}"   

                   maxThreads="1024" maxHttpHeaderSize="8192"

                   emptySessionPath="true" protocol="HTTP/1.1"

                   enableLookups="false" redirectPort="8443" acceptCount="1024"

                   connectionTimeout="20000" disableUploadTimeout="true" useBodyEncodingForURI="true"/>

          Apache work的配置:

          Keep alive off

          <IfModule worker.c>

          ServerLimit          80

          ThreadLimit          128

          StartServers         10

          MaxClients           8000

          MinSpareThreads      64

          MaxSpareThreads      800

          ThreadsPerChild      100

          MaxRequestsPerChild 10000

          </IfModule>

          Linux配置信息:

          執(zhí)行:vi /etc/sysctl.conf   

          添加一行:net.ipv4.ip_local_port_range = 1024 65535

                 再執(zhí)行:sysctl -p

                   更改ulimit –n屬性,可用端口數(shù),還有ip_conntrack_max 

          APR

                 Tomcat優(yōu)化了IO(sendfile,epoll,OpenSSL)。操作系統(tǒng)的一些函數(shù)(隨機數(shù)的產(chǎn)生,系統(tǒng)狀態(tài)的獲取等),本地進程優(yōu)化(共享內存,NT的管道,UnixSocket)Tomcat有配置監(jiān)聽器直接會檢測APR模塊是否存在,在bin目錄下建立native目錄,并且放置對應的so或則dll即可。

          posted @ 2009-03-03 20:14 岑文初 閱讀(1827) | 評論 (2)編輯 收藏

              在大型網(wǎng)站中常常會遇到大流量的數(shù)據(jù)輸出問題,過于頻繁的輸出到DB、文件、第三方系統(tǒng)都會帶來不穩(wěn)定性和低效率。因此需要采用一定的方式來解決這個問題,其實這部分內容的簡單處理框架早就用在實際項目中,不過今天正好有外部的朋友問起我,我就整理了一下作為google的開源代碼放上去了,這里也簡單介紹一下,有興趣的朋友可以去看看,最好是能夠給一些建議。

            

          場景:

                   應用頻繁訪問接口服務器,需要控制每個應用在可配置時間段內(例如一分鐘)對于某一服務的訪問次數(shù),同時需要記錄每一次訪問內容到數(shù)據(jù)庫中。

          幾個點:

          1. 高并發(fā)情況下,集群服務器需要全局計數(shù)。(需要將更新和判斷作為原子操作,而非兩階段操作,保證高并發(fā)事務)

          2. 異步日志批量輸出。防止高頻率訪問第三方系統(tǒng)(DB,本地IO),提高性能。

          3. 采用黑名單簡化計數(shù)器判斷。

          1,3通過memcache就可以實現(xiàn),如果需要使用客戶端可以看看google code上的:http://code.google.com/p/memcache-client-forjava/

          這里主要在說一下2,在很多場景中都會有這樣的需求,一些需要輸出到DB或者文件的內容需要緩存起來異步批量操作,提高性能也降低對于第三方系統(tǒng)的壓力。大致設計結構圖如下:

           

           自上而下來看,ThreadA,B,C都是程序中其他模塊的線程,他們需要輸出記錄到數(shù)據(jù)庫或者DB中。當有數(shù)據(jù)到達需要輸出時,僅僅只是將數(shù)據(jù)放入阻塞隊列中,而有一個消費者線程池中的線程發(fā)現(xiàn)隊列中有數(shù)據(jù)就將數(shù)據(jù)寫入其中某一個線程的數(shù)據(jù)分頁中(每一個線程維護一個自己的內存分頁,當頁滿或者到達了配置的輸出間隔時間以后就將頁內數(shù)據(jù)交給輸出線程池中的輸出線程完成批量數(shù)據(jù)輸出)。


                  

          下面是三個類圖,囊括了這個小工具框架的所有類:

           

                   上圖是對外提供的異步輸出模板,其他模塊可以直接使用模板來輸出數(shù)據(jù)。

          上圖是異步輸出器包,是異步輸出模板的內置邏輯實現(xiàn),其他線程直接使用異步輸出模板來輸出記錄。

                   上圖是消費者和輸出線程的接口和默認實現(xiàn)類,可以替換及擴展。

          整個框架基本都可以通過配置文件擴展每一個角色(異步輸出類,消費者,寫出者),擴展方式就是通過在classpath下增加目錄META-INF/services/然后將需要擴展的接口作為文件名稱,內容就是接口的實現(xiàn)類,這樣既可擴展和替換任何一個角色的具體實現(xiàn)。

          具體的代碼和測試用例可以去http://code.google.com/p/asynwriter/ 下載。

          posted @ 2009-02-12 21:09 岑文初 閱讀(2489) | 評論 (5)編輯 收藏

               摘要: Author:文初 Email:wenchu.cenwc@alibaba-inc.com Blog:http://blog.csdn.net/cenwenchu79            什么是Dynamo? Dynamo是Amazon的高效Key-Value存儲基礎組件(類似于現(xiàn)在被廣泛應用的Mem...  閱讀全文
          posted @ 2009-01-13 08:06 岑文初 閱讀(2605) | 評論 (0)編輯 收藏

          該文前半部分在程序員1月刊上,由于雜志篇幅有限,因此后半部分沒有被刊登,這里就在blog上增加一下:

           

          服務集成平臺

          經(jīng)過前面的介紹和實踐兩部分,在Open API在概念和實際操作上都有了一定的理解和認識,這里就再談談服務集成平臺的作用、角色和定位。這里大致描述一下集成平臺當前的實現(xiàn)點,這些實現(xiàn)點也就是服務集成平臺的價值所在。

          服務集成平臺(SIP)的角色和作用



          3 SIP Role

          ISV(獨立軟件開發(fā)商)最關心什么?

          1.       服務資源是否豐富。這關系著是否能夠創(chuàng)新。

          2.       服務質量是否有保證。這關系著是否能夠滿足用戶最基本的需求。

          3.       開發(fā)集成是否便利。這關系著開發(fā)成本。

          ISP(獨立服務提供商)最關心什么?

          1.       服務安全性是否可靠。如果損害到自身或者用戶利益,則就失去了原來開放的初衷。

          2.       是否有足夠多的應用開發(fā)者使用服務。

          3.       服務的非業(yè)務性需求是否可以滿足。(服務監(jiān)控告警,計費,統(tǒng)計分析等)

          SIP是連接ISVISP的“橋梁”。它能解決什么雙方最關心的什么問題?

          1.       豐富的ISV資源以及豐富的ISP資源。這其實是一個良性循環(huán)的過程,就好比一個建材市場,買家和賣家數(shù)量遠遠要比在單獨一家實體店中多,從淘寶的B2C模式就可以看出,市場大了以后傳統(tǒng)的“大鱷”都要聚集人氣。

          2.       統(tǒng)一安全標準和多種控制策略,即保證了ISP的安全,又能夠讓ISV開發(fā)起來方便。在前面實踐過程中可以很明顯的看到,眾多的應用id,各自的安全流程,讓開發(fā)者Mash up無形中增加了很大的開發(fā)成本和維護成本。

          3.       SIP目的就是讓ISP專注于業(yè)務服務的開發(fā),而將非業(yè)務性的需求,如安全,服務監(jiān)控預警,日志分析統(tǒng)計,計費,社區(qū)等都一攬子解決。這樣既解決了ISP的第三個問題,同時也為ISV關心的服務質量無形中作了促進。

          在年初的時候,分析和研究國外的Open API時,感覺類似于SIP形態(tài)的產(chǎn)品在國外還沒有,大家都是各做各的,但這陣子回過頭來看,YouTubeGoogle開放平臺,FlickrYahoo開放平臺,這些平臺都屬于SIP形態(tài)的產(chǎn)品,而且Google要比當前我們做的SIP還要更進一步,那就是數(shù)據(jù)格式規(guī)范化(GData),而SIP當前僅僅只是做到流程規(guī)范化。

          那是否任何公司都適合去做SIP這類形態(tài)的平臺呢,這不僅僅是技術問題,還是一個資源的問題。阿里巴巴每一家子公司都有實力去做一個這樣的開放平臺,但各自獨做一套的結果就是資源浪費,同時技術沒有得到積累(SIP技術積累是在ISV和不同形態(tài)的ISP接入中逐漸產(chǎn)生的),最重要的是這些子公司其實真正需要關注的是如何將業(yè)務和數(shù)據(jù)開放給開發(fā)者,吸引更多的開發(fā)者來構建出圍繞Open API的創(chuàng)新應用,最大化數(shù)據(jù)和服務的商業(yè)價值。

          服務集成平臺功能特性

          服務路由

                   服務集成平臺就好比硬件里面的“路由器”,服務調用者只需要提供服務注冊的名稱,就可以調用到某一個服務提供商提供的服務,對于調用者來說無需關心此服務的地址以及提供者。

                   根據(jù)現(xiàn)階段的服務集成來看,主要分成四類的服務路由,同步服務路由,異步服務路由,訂閱服務路由,大數(shù)據(jù)量上傳服務。同步服務路由就是普通的Http無狀態(tài)單次請求和響應。異步服務路由應用于服務提供商提供的服務無法在當時處理完畢,先返回一個請求響應,當服務處理結束以后再將服務處理結果返回給服務調用者(短信業(yè)務就是一種異步服務)。訂閱服務和互聯(lián)網(wǎng)上RSS之類的訂閱十分相似,服務調用者只需要訂閱服務即可獲得服務提供商推送的服務內容。大數(shù)據(jù)量上傳服務其實也是屬于同步服務,但是由于消耗資源和性能壓力不同,因此被單獨作優(yōu)化處理。

                   對于服務形態(tài)不同,服務路由需要支持REST風格的服務路由和類REST風格服務的路由,但對于開發(fā)者來說,調用的方式都是用服務名稱來路由。

          正式環(huán)境和測試環(huán)境的隔離和切換

                   對于服務開發(fā)者來說,在應用開發(fā)期間需要有外部測試環(huán)境的支持,在商用以后需要有正式環(huán)境支持,同時兩個環(huán)境的切換需要盡量的簡單。

                   服務集成平臺支持服務提供商提供測試環(huán)境和正式環(huán)境的不同服務路由,同時兩套環(huán)境切換成本低。當服務提供商只有一套環(huán)境的時候可以根據(jù)策略配置的不同,對調用者訪問的范圍,頻度,次數(shù)作限制,保證測試服務不影響正式服務。

          安全

                   提供對應用身份認證以及服務提供商身份認證的支持,采用多種數(shù)字簽名算法實現(xiàn)基本的身份認證,支持IP白名單和動態(tài)算法更新后端插件提供更高級別的服務安全保證。

                   細化了用戶授權流程。對于用戶Token細分為請求級別和會話級別,同時對于會話級別的權限操作,失效時間可根據(jù)服務提供商的配置自定義。同時平臺托管維護每個應用每個用戶的多身份綁定Token,降低服務提供商開發(fā)維護成本。

                   服務提供商可配置服務訪問量控制和頻率控制(所有應用或者單個應用)。也支持配置需要訂購才可以使用的服務(有限次數(shù)訂購,無限次數(shù)訂購)。

                   支持多級服務安全策略配置,為服務配置(無授權,應用授權,用戶授權,可選用戶授權)等多種級別的安全策略。注:可選用戶授權是指如果沒有被用戶授權的情況下使用接口將返回部分公開數(shù)據(jù),而在用戶授權情況下使用則返回全部的私有和公開數(shù)據(jù)。

                   對服務提供商多級分類,提供不同的安全策略組合。

          監(jiān)控與告警

                   服務使用者服務使用出錯監(jiān)控和告警。

          服務提供商提供的服務可用性,超時狀況的監(jiān)控和告警。

          服務集成平臺服務處理狀況,內部模塊運行狀況監(jiān)控和告警。

          日志采集與統(tǒng)計分析

                   高并發(fā)下日志采集異步處理,采集服務正常訪問和異常訪問日志,采集用戶綁定類,異步服務類,平臺內部服務類等特殊日志。

                   每日,每周,每月訪問日志統(tǒng)計分析,基礎報表和趨勢分析圖的創(chuàng)建。

                   支持分析結果預警配置。

                   歷史統(tǒng)計數(shù)據(jù)管理和歸檔。

           

          平臺內置服務

                   平臺為服務提供商以及服務調用者提供了平臺級別的服務,為開發(fā)商和服務提供者獲取平臺業(yè)務數(shù)據(jù)以及運行期配置安全策略提供方便。

                   平臺提供一系列平臺模塊監(jiān)控、配置、重置服務,支持在線問題查找、定位、解決的一套機制。

          非功能性需求(當前情況)

                   性能:壓力測試單機500并發(fā)用戶1600+tps,多機處理能力線性增長。

                   模塊化:內部處理模塊化結構,支持運行期配置、裝載、卸載。

          容錯:服務集成平臺核心數(shù)據(jù)都緩存在Memcache中,因此Memcache集群以及容錯策略的擴展都為平臺穩(wěn)定和容錯作了基礎保證。

          配套支持

                   通過ISV,ISP,Admin三個Portal,使開發(fā)者,服務提供商以及后臺維護人員能夠自主維護基本信息和查看相關數(shù)據(jù)。

                   為開發(fā)者提供社區(qū),測試區(qū)的支持,并且提供開發(fā)工具包和文檔,方便開發(fā)。

          擴展集成

                   支持不同平臺的服務集成。支持Google,Flickr,Yahoo等等不同的服務平臺的服務集成,當前還沒有完全將安全體系集成,只能夠支持安全流程透傳,消息數(shù)據(jù)完整過濾。

          服務集成平臺的一些發(fā)展趨勢

          1.       數(shù)據(jù)集成和流程集成

          當前很多服務都是基礎的數(shù)據(jù)型服務,使用者通過數(shù)據(jù)篩選獲取相應的數(shù)據(jù),然后展現(xiàn)給用戶,這些服務的集成相對來說功能比較單一,流程也不復雜。但隨著服務提供商的發(fā)展,數(shù)據(jù)類型服務將會作為基礎服務的一部分,而越來越多業(yè)務處理型服務會成為使用者的首選,此時,如何讓服務和服務之間數(shù)據(jù)互通,服務可以通過一定的描述編排,就會變得越來越有價值,就如前面提到的,Google采用GData作為數(shù)據(jù)規(guī)范格式,同時對于安全流程的統(tǒng)一制定,為第二階段的集成打下了基礎。

          2.       服務基礎平臺間的互通

          最近Open ID也再次由于各大網(wǎng)站的支持而被人們廣泛關注,在未來Open API體系中,伴隨著Open ID的發(fā)展,服務基礎平臺之間的服務互通也將會變得越來越容易,但是數(shù)據(jù)的安全性也會對每個服務平臺要求更高。

          3.       服務集成平臺的層次化

          在這篇文章的介紹中僅僅介紹的是最基礎的Open APIMash up,其實當前已經(jīng)有更高層次的Mash up被廣為使用,JavaScriptActionScriptFlash/Flex這些技術使得展現(xiàn)更為靈活和豐富。因此未來的服務集成平臺將會層次化,從數(shù)據(jù)集成到流程集成到UI集成,會成為一套自下而上的解決方案,適合各種場景的裁剪選擇。

          Open API的一些思索和感觸

          不同角色,不同收獲

          平臺開發(fā)者:

                   這是我的本職工作和角色。當淘寶等服務提供商的服務接上來以后我就要為它的安全和穩(wěn)定負責。當SIP一旦出現(xiàn)問題,那么服務提供商和軟件開發(fā)商將都無法再正常工作,套用蜘蛛俠的一句話:“能力越大,責任越大”。作平臺的尤為如此。

          服務提供商:

          服務提供商接觸的最多的就是淘寶的同學,首先看到的就是做一個服務提供商很不容易,要把原有系統(tǒng)中復雜的邏輯抽象出來并不是抽象一個公用函數(shù)那么簡單,同時對于模塊化,邊界性,容錯性方面的要求要遠遠高于封閉系統(tǒng)開發(fā)本身,因為你現(xiàn)在要面對的是倍于原有訪問量上百甚至上千的調用者,對任何一個小疏漏都可能帶來災難性的影響。

          軟件開發(fā)商:

                   在寫這個文檔以前,最多也就是寫幾個測試的Demo來測試SIP環(huán)境中的服務,在淘寶API討論群中會看到很多新的或者老的ISV在抱怨或者詢問一些自己覺得很簡單的問題(例如簽名等等),同時在監(jiān)控中也看到很多及其簡單錯誤統(tǒng)計數(shù)都會有很高的比例。但是經(jīng)歷過這次對于各種各樣國內國外的API的開發(fā),讓我深刻體會到了開發(fā)者的一些痛苦(當然我沒有去使用各個開發(fā)社區(qū)的第三方語言開發(fā)包,這也增加部分的開發(fā)難度),我也曾因為簽名問題在豆瓣API測試的時候折騰了半天,在調試Google Calendar的時候不得不跟蹤開發(fā)包代碼才找到了一些隱晦的設置通過測試。其實Open API在國內國外都沒有完全可以稱得上成熟,因此開發(fā)者其實是最容易受到影響的。同時他們面對著最難應付的客戶,平臺或者服務提供商出現(xiàn)問題,客戶最先抱怨的也是服務開發(fā)商,因此作為平臺開發(fā)者和ISP其實都要給與一定的支持和幫助,這樣才會走向更好的良性循環(huán)。

          其實上面說的那些無非都是大家最長說的換位思考,一個新興的開發(fā)模式需要各方合作才會走向良好的發(fā)展方向。

          創(chuàng)意就是財富

                   記得前一陣子支付寶能夠在上海交水電費引起了很多人關注,杭州本地論壇中都有很多人在問:“什么時候杭州能夠也用支付寶交水電費就好了”。其實如果開放了支付服務和水電繳費服務,這種Mash up的應用又有什么難的呢?你都可以直接每個自然月通過Google Calendar設置好日程安排,自動繳完所有的費用,然后短信提示一下即可。未來當各行各業(yè)發(fā)現(xiàn)了自身資源的潛在價值以后,以服務的方式通過平臺互通,那么創(chuàng)意就是財富。

          posted @ 2009-01-11 21:22 岑文初 閱讀(2255) | 評論 (1)編輯 收藏

               摘要: Author:文初 Email:wenchu.cenwc@alibaba-inc.com Blog:http://blog.csdn.net/cenwenchu79 問題凸現(xiàn):        年關到了,商家忙著促銷,網(wǎng)站忙著推廣,阿里軟件的服務集成平臺也面臨第一次多方大規(guī)模的壓力考驗,根據(jù)5.3版本的壓力測試結果,估算了一下現(xiàn)有的...  閱讀全文
          posted @ 2009-01-11 21:13 岑文初 閱讀(2745) | 評論 (3)編輯 收藏

              應該是去年的年初,我受到普元公司的邀請去參加了一次SCA、SOA的技術交流會,當時也是自己第一次去和那么多陌生的朋友交流技術心得,同時也被普元公司的這種純技術性的交流方式所打動,也在想哪一天阿里巴巴也能夠舉辦一次這樣的小規(guī)模有針對性地技術交流會那會讓我們這些技術人員收益菲淺。一年后的今天,當老大問我有個這樣的會議是否要參加的時候,自己毫不猶豫地報了名,雖然看起來和自己專注的工作不是很相關,但是還是那個想法:首先不了解是無法知道是否和自己相關與否,其次就算不相關,多學多聽,觸類旁通的技術延展只會給自己帶來更多的想象空間和創(chuàng)新思維。

              按照會議安排,早晨有兩個講座,下午有四個講座,每個講座1個小時左右。第一個出場的是騰訊的安全中心總監(jiān)楊勇,整個演講很輕松,首先是對騰訊的整體產(chǎn)品結構和背景作了一下闡述,然后就從安全中心這個整體來講述安全對于騰訊的意義,如何實施以及一些流程的制定。沒有過多的牽涉安全問題的細節(jié),著重是講述了安全中心面臨的四個方面的問題,以及通過什么手段去解決。這其實和他本身所處的工作職責來說相符合,如果僅僅只是來講某一個安全技術應用,那么就有些太過狹隘了。不過在提問的時候一個問題的回答讓我還是留有一些印象的,主持人收集到一個問題:“騰迅安全中心的建設初期遇到的最迫切需要解決的問題是什么?”,他回答道:“其實騰訊安全中心從建設初期到現(xiàn)在一直面臨各種迫切的問題,只是隨著時間的不同而不同的演變,最早的協(xié)議安全到客戶端安全到奧運期間的信息安全都是一個發(fā)展的階段”(因為沒有ppt以及記錄,因此描述的可能不太準確)。但是這個思想任何技術行業(yè)都是一樣的,時代不同關注不同,需要解決的問題也是在發(fā)展的。

             第二個議題是Discuz的劍心帶來的“web應用程序中的字符集攻擊”,這個演講就相對來說比較注重專業(yè)細節(jié)方面的闡述。作為互聯(lián)網(wǎng)應用開發(fā)者,使用Java的人第一堂課就是中文亂碼,很多人只看到如何去配置或者寫一點轉換語句就可以解決,但是對于編碼方式就不求甚解,ISO-8859-1,GB2312,UTF-8,UTF-16區(qū)別是什么,為什么會引起亂碼。其實了解了編碼的原理就很能夠解釋如何會產(chǎn)生亂碼,同時產(chǎn)生亂碼的時候也可以根據(jù)亂碼的情況了解可能是因為什么編碼轉化造成的(阿里巴巴的寶寶寫了一篇很詳細的文章說了這個問題,進入公司以后我也是看了那片文章才系統(tǒng)地對編碼方式做了完整的了解,以前都是碎片)。不過今天聽了這個演講,到讓我知道了原來編碼方式也被人用來攻擊。其實基本的思想主要就是一點:由于信息轉發(fā)中對于不同編碼解析的方式不同或者是過濾不同,導致出現(xiàn)一些漏洞。通俗的比喻就是刺殺秦始皇的圖窮匕見,侍衛(wèi)就好比第一層把關的信息轉發(fā)者認為著幅圖沒有威脅,但是真的按照刺客的處理方式那么就是一個最好的攻擊性工具。記得我在和同事探討REST對于Http協(xié)議的使用時說最重要的就是REST不再使用Http協(xié)議作為傳輸承載協(xié)議而是作為業(yè)務協(xié)議,那么解析業(yè)務的時候究竟是分析協(xié)議中指定的編碼方式還是內容中的編碼方式,結果會大不一樣,同時作為安全人員的角度來看,這也會存在一種安全隱患。所以其實任何一種錯誤都可以被利用作為攻擊的手段。

              下午的議題一共有四個,雖然時間比較長一直連續(xù)講到6點多,但是就像主持人講的,每一個人都“堅持”下來了,呵呵,當然堅持并不是因為不好聽,而是做在那兒聽比寫代碼要累很多,當然講課的同學們也是十分辛苦的。下午第一個演講的是team509的創(chuàng)始人吳石,講的主題是“部分軟件安全的思考”,內容專業(yè)化很強,對很多比較底層的安全問題(操作系統(tǒng)等)作了一些介紹,當然對于我這個門外漢只能聽懂個大概意思,不過還是有所了解那些名詞的意思到底是什么。第二個是微軟的大牛蛙同學,也是安全領域專家講述了一下微軟的SDL(Security Development Lifecycle),望名生意,安全實施的流程化。第三個演講是兩位同學做的,也是我下午聽得比較有感觸地,先是網(wǎng)名余弦(鐘晨鳴)北京知道創(chuàng)宇信息技術公司的安全研究員,講的是CSRF蠕蟲技術,從一個黑客的角度來闡述CSRF的原理以及危害性。這部分比較技術化一些,但是由于和我關注的Web安全也比較相關一些,所以聽起來也不是比較迷糊。雖然聽著他講CSRF,但是其實我腦子里面已經(jīng)在考慮關于Open API的一些安全問題。其實在阿里軟件承載淘寶的API過程中,對于客戶端的安全問題就一直都在談,但是對于SIP來說總是鞭長莫及,因為服務集成平臺只會保障ISV和ISP之間的信息交互的真實性,但是用戶是否由于ISV的技術問題導致信息偽造提交,那么就不得而知,但是最后表現(xiàn)出來的結果就是ISP的Open API計劃為ISP帶來了更多的安全隱患,也就是說原來淘寶一家漏洞,以后可能會是千千萬萬家ISV的漏洞,其實這也是上面幾個演講提到的合作風險問題,第三方的技術能力不得而知,同時產(chǎn)生的風險也會很難控制。其實從這里也多多少少看出來為什么FaceBook,myspace,最早對于用戶安全隱私數(shù)據(jù)的開放不僅僅是開放了數(shù)據(jù)API,同時也會有整一套上層框架支持,其實也是出于開發(fā)者能力不足引起隱私數(shù)據(jù)被惡意修改而作的防護措施。那么現(xiàn)在Open 用戶的數(shù)據(jù)特別是以后涉及到金額的api如何保證isv不欺詐,isv不被欺騙,這可能是后續(xù)需要更加重視的問題。同時,在聽了CSRF的攻擊中談到的對于資源定位猜測以及操作的時候,讓我對REST的風格又打了一個冷顫,REST對于資源的規(guī)劃和定位十分容易,但是這也為這類攻擊提供了便利,同時對于資源操作依賴于Http協(xié)議,也會讓資源的安全性打了折扣,這需要對Open API開發(fā)人員做更多的安全工作指導,或者提供安全框架來防范Open API可能會產(chǎn)生的安全漏洞。緊接著后面的演講是北京知道創(chuàng)宇信息技術公司的創(chuàng)始人趙偉,應該是業(yè)界比較資深的專家了,本來的議題是“惡意網(wǎng)站檢測”,不過他還是講了他這些年來的一些經(jīng)歷以及安全領域的黑色產(chǎn)業(yè)鏈的問題。平時這方面關注的不多,不過今天這一番交流,讓我對安全領域的發(fā)展以及現(xiàn)況有所了解,甚至有時候就覺得現(xiàn)在上網(wǎng)就算裝了一大堆東西還是感覺在“裸奔”。最后一個議題是51.com的鄭歆煒講的“運維安全經(jīng)驗談”,總結了運維所面對的問題以及解決方案,協(xié)調,溝通,總結,知識庫,其實這些對于開發(fā)人員來說何嘗不是呢。最后小黑作了一個簡短的總結,同時預報了明天他會做一次附加的構建安全Web架構的講座,期待明天半天的研討會和附加講座。

              好久沒有踏踏實實地坐著好好聽課了,這次一天半的學習對于自己來說也算是一次新知識的掃盲,同時也為自己后續(xù)的工作可能存在的問題或者可以借鑒的知識作一個鋪墊。

          posted @ 2008-12-17 22:32 岑文初 閱讀(1864) | 評論 (1)編輯 收藏

          Author:文初

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

          問題

                   小丹同學在旺旺上問我是否可以用Memcached實現(xiàn)簡易消息中間件類似的功能。覺得這個需求很奇怪,就問了一下具體的應用場景,然后小丹就上來和我具體的談了究竟需求是什么。其實小丹的應用場景是這樣的:客戶需要分析一些業(yè)務數(shù)據(jù),但是業(yè)務數(shù)據(jù)又是很龐大的,在原有系統(tǒng)每天晚上都有一次日分析,將業(yè)務數(shù)據(jù)分析并且歸檔,但是如果要產(chǎn)生即時分析的效果,用原有系統(tǒng)無法實現(xiàn),因為當天的數(shù)據(jù)內容沒有被分析,同時如果即時的去分析并且累加到歷史分析數(shù)據(jù)上,性能也不能滿足需求,因此考慮通過消息機制來實現(xiàn)異步分析,至于異步處理的時間容忍度,可以通過配置來實現(xiàn),同時希望異步分析是可線性擴展的,支持集群,提高效率。為什么不直接使用中間件呢?高并發(fā)的穩(wěn)定性,維護的成本,性能要求,使用成本,這些直接就排出了直接去使用中間件的想法。

          起始方案的討論

                   在回到小丹最初提到是否可以通過Memcached來實現(xiàn)類似于簡易消息中間件的問題上來。首先是否將消息隊列作為一個對象保存在Memcached中,這種做法明顯不支持高并發(fā)的情況,因為Cache本身的get,put無法保證事務。在Memcached中只有計數(shù)器是支持高并發(fā)的操作,因此考慮是否使用計數(shù)器并且按照一定規(guī)則來生成key,通過對計數(shù)器的增減來讓不同消費者獲取到不同的消息,這種機制最大的問題在于:1.輪詢的壓力不小(小丹希望是訂閱者模式,Push過去而不是Pull)。2.計數(shù)器增減不論怎么做都實現(xiàn)的是棧而不是隊列。那么是否使用我擴展的MemcachedKeySet,這點我自己就反對了,這個功能效率很低,而且對于Memcached本身在高并發(fā)下操作是否有影響還不得而知。問題越繞越走向死胡同了。

          方案的轉變

                   轉換思路,重新分析小丹的需求,究竟哪幾點是他真實需要的:1.通過消息方式解耦Web應用和業(yè)務分析處理。2.消息必須較為及時的傳遞到業(yè)務分析模塊。3.業(yè)務分析模塊需要支持集群方式線性擴展性能。實現(xiàn)這些需求真的需要簡單的消息中間件或者集中式存儲么?看看下圖的結構:





                   從圖上可以看出這么幾個問題:1.消息中間件本身處于單點,如果需要擴展或者消息本地化增加了復雜度。2.對于消息的獲取是采用push還是pull,如果是push那么需要中間件支持訂閱者的維護,如果是pull,則需要考慮并發(fā)以及性能問題。3.消息的即時性,這個還是依賴于消息中間件的實現(xiàn)機制。總的來說,如果要通過集中式緩存方式實現(xiàn)消息中間件的簡單功能,還是有很多問題。那是否直接使用消息中間件的第三方支持呢,其實又回到了最初提出的不使用的緣由。這么設計是否太復雜呢?

          回過頭來看看Memcached的使用情況,突然發(fā)現(xiàn)其實事情可以簡單來說,我記得寫過一些說明來解釋為什么我說Memcached是集中式緩存而不是分布式緩存,其實是客戶端的分發(fā)算法讓很多人覺得好像分布了數(shù)據(jù)和可無限擴展。其實這種技術結合Hadoop HDFS的部分設計思路,可以給出一個比較好的解決方案。看看下圖的結構設計:



          上圖去掉了消息中間件的角色,增加了Asyn Processor Manager的角色,但是此角色也可以去掉,更為簡化的實現(xiàn)需求,增加Asyn Processor Manager的功能僅僅是為了提供動態(tài)增減Asyn Processor的功能。具體說一下流程:

          1.              Web應用啟動時,讀取本地配置獲取Asyn Processor列表載入內存,同時根據(jù)Asyn Processor Manager的配置去發(fā)起請求獲取Asyn Processor最新的可用列表(如果無法獲取,則以本地的為準)。

          2.              Web應用根據(jù)本地實現(xiàn)的分發(fā)算法(最簡單就是采用key hash),來選擇Asyn Processor,發(fā)送請求處理的消息。

          3.              如果Asyn Processor Manager不存在,Web應用也可以實現(xiàn)定時發(fā)起query status請求來確認Asyn Processor的存活狀態(tài),并且更新,保證消息的正常發(fā)送。如果Asyn Processor Manager存在,那么確認Asyn Processor狀態(tài)是否存活可以由Asyn Processor Manager來做(Push或者Pull),而Web應用則可以使用對Asyn Processor Manager的定時查詢來獲得最新的Asyn Processor列表。

          4.              Asyn Processor Manager可以提供增加和刪除Asyn Processor的接口,這樣就可以支持Asyn Processor的增加和刪除,但也正因為Asyn Processor Manager的單點易于注冊和管理Asyn Processor,也增加了單點的風險,因此每一臺Web應用需要對Asyn Processor Manager不可用作好本地化配置的后備策略。

          5.              使用Http協(xié)議作為消息傳輸協(xié)議,這樣避免SA去維護端口的麻煩,同時也能夠充分利用REST的方式來完成業(yè)務邏輯(Options方法可以用于心跳,PutDelete可以用于Processor的增減(設置Http Head認證方式即可解決安全問題),Get方式獲取信息(xml,json等等格式可以很容易處理))。

          上面的方案可以看出,如果去掉Asyn Processor Manager,其實方案很簡化,就是每一個客戶端有一層類似于Memcached客戶端的分發(fā)機制,同時比Memcached免去了對于連接池維護的復雜性,僅僅只需要維護狀態(tài)標示即可。

          最后還囑咐小丹對于Asyn Processor的設計需要合理化,這部分需要支持消息接受和處理的并行處理,提高Asyn Processor的處理能力,同時通過分頁批量處理消息的方式減少對于DB的壓力(當然需要根據(jù)具體的時效性設置消息頁的大小以及消息頁Flush的時間)。

          后話

                   上面的方案可能不是最好或者最優(yōu)的,這里僅僅只是分享一下自己解決這個問題的一些心得。這此的方案討論也走了一些彎路,有時候在做任何選擇以前首先需要考慮的是到底自己需求是什么,然后再去考慮選擇什么技術去實現(xiàn)。同時盡量還是那句老話”Make it Simple”,做技術的人總是喜歡做的很復雜,功能很強大,但是最后迷失了最初的目標,忙于去完善那些80%沒有用的功能,卻沒有去做好那20%客戶最Care的功能。化繁為簡,見招拆招,才能四量撥千斤。
          posted @ 2008-12-12 11:49 岑文初 閱讀(1790) | 評論 (0)編輯 收藏

               今天收到InfoQ的推薦郵件,看了標題就很感興趣,花了一些時間一看,果然是很不錯的一個案例分析,同時也讓自己學到了不少。大致羅列一下看后的一些文章重點內容。案例地址:http://www.infoq.com/cn/articles/webber-rest-workflow

              1.通過REST服務請求完成狀態(tài)遷移,同時合理利用OPTIONS來查看資源操作權限。

              2.合理利用Http Heads來返回資源URI,以及通過ErrorCode來確定操作結果,并且作后處理。

              3.通過返回內容指定后續(xù)流程資源定位以及操作來實現(xiàn)流程化。

              4.通過Put報頭的兩種版本比較標示來防止并發(fā)修改。(其實也可以優(yōu)化來做查詢緩存的工作)

              5.使用Atom協(xié)議來發(fā)布和管理資源(Atom是最適合REST風格服務的數(shù)據(jù)源格式定義)

              6.URI模版的使用建議,慎用,如果確實能夠有把握抽象資源定位。

              7.Auth可以通過輕量級Http Head中的Authentication或者WS-*的方式來實現(xiàn)。(也可以通過https實現(xiàn))

              總的來說,其實整個案例分析下來以后,可以發(fā)現(xiàn)如果要使得服務流程化,那么前提就是數(shù)據(jù)交互格式統(tǒng)一(XML,Atom),然后利用Http協(xié)議作為服務協(xié)議而非承載協(xié)議,利用已有的操作約定,報文頭部標示和返回的錯誤碼來完成資源狀態(tài)遷移的工作,同時通過在返回內容中嵌入流程化內容,使得整個流程可以貫穿。(這里還是簡單的流程串聯(lián),其實如果在流程規(guī)則協(xié)議中增加復雜的邏輯定義,則可以實現(xiàn)更為強大的Web workflow)。

              但對于Open API或者類似的REST流程化業(yè)務來說,安全其實還是最大的挑戰(zhàn),特別是在對資源的訪問控制權限上。當然可以類似于WS-Security提出一套較為安全成熟的方案,但是性能和使用簡易性則會大打折扣,也失去了REST本身的優(yōu)勢。

          posted @ 2008-12-10 11:32 岑文初 閱讀(2182) | 評論 (2)編輯 收藏

          僅列出標題
          共12頁: First 上一頁 4 5 6 7 8 9 10 11 12 下一頁 
          主站蜘蛛池模板: 江都市| 呼图壁县| 常熟市| 凤凰县| 新兴县| 虹口区| 德昌县| 扎兰屯市| 肃北| 湾仔区| 颍上县| 通州市| 潢川县| 来安县| 清远市| 东明县| 新巴尔虎左旗| 吴川市| 灵宝市| 汉川市| 开鲁县| 日喀则市| 鸡东县| 锡林浩特市| 巴楚县| 德钦县| 通榆县| 五家渠市| 确山县| 华池县| 湖南省| 清镇市| 抚远县| 沾化县| 勐海县| 夏河县| 鲜城| 大石桥市| 德钦县| 玉龙| 山丹县|