<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

    #

            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 岑文初 閱讀(5005) | 評論 (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)編輯 收藏

     

    目標:

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

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

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

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

    3. Memcached Client版本優化后對性能影響。

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

    前置條件:

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

    最終結果:

           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區間

    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模式和高并發的情況下Web容器處理請求能力不穩定,同時也直接影響到了SIP的性能。

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

    Apache模塊差異測試比較:

     

    Apache(2.0.52)配置

    JBoss(4.2.1)配置

    Cache Client Version

    TPS

    TPS區間

    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模塊是以前系統遺留的http請求轉發模塊。在測試過程中Weblogic模塊的測試中波動頻率和幅度都很大。根據測試結果可以看出:

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

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

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

     

    Apache(2.0.52)配置

    JBoss(4.2.1)配置

    Cache Client Version

    TPS

    TPS區間

    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版本在單獨測試的環境下:500并發用戶,每個并發用戶1000getset,性能相差40%左右。

             上面測試結果可以看出:

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

    2.    在測試中也發現Apache + JBoss波動頻率和區間都小于其他幾個測試情況,圖形十分平穩,證明處理請求不是系統瓶頸。

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

     

    Apache(2.0.52)配置

    JBoss(4.2.1)配置

    Cache Client Version

    ISP響應時間(ms)

    TPS

    TPS區間

    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

    測試優化總結:

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

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

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

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

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

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

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

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


    附加信息:

    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配置信息:

    執行:vi /etc/sysctl.conf   

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

           再執行:sysctl -p

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

    APR

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

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

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

      

    場景:

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

    幾個點:

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

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

    3. 采用黑名單簡化計數器判斷。

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

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

     

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


            

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

     

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

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

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

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

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

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

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

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

     

    服務集成平臺

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

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



    3 SIP Role

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

    1.       服務資源是否豐富。這關系著是否能夠創新。

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

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

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

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

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

    3.       服務的非業務性需求是否可以滿足。(服務監控告警,計費,統計分析等)

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

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

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

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

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

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

    服務集成平臺功能特性

    服務路由

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

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

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

    正式環境和測試環境的隔離和切換

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

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

    安全

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

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

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

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

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

    監控與告警

             服務使用者服務使用出錯監控和告警。

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

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

    日志采集與統計分析

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

             每日,每周,每月訪問日志統計分析,基礎報表和趨勢分析圖的創建。

             支持分析結果預警配置。

             歷史統計數據管理和歸檔。

     

    平臺內置服務

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

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

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

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

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

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

    配套支持

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

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

    擴展集成

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

    服務集成平臺的一些發展趨勢

    1.       數據集成和流程集成

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

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

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

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

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

    Open API的一些思索和感觸

    不同角色,不同收獲

    平臺開發者:

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

    服務提供商:

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

    軟件開發商:

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

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

    創意就是財富

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

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

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

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

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

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

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

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

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

    Author:文初

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

    問題

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

    起始方案的討論

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

    方案的轉變

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





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

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



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

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

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

    3.              如果Asyn Processor Manager不存在,Web應用也可以實現定時發起query status請求來確認Asyn Processor的存活狀態,并且更新,保證消息的正常發送。如果Asyn Processor Manager存在,那么確認Asyn Processor狀態是否存活可以由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協議作為消息傳輸協議,這樣避免SA去維護端口的麻煩,同時也能夠充分利用REST的方式來完成業務邏輯(Options方法可以用于心跳,PutDelete可以用于Processor的增減(設置Http Head認證方式即可解決安全問題),Get方式獲取信息(xml,json等等格式可以很容易處理))。

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

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

    后話

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

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

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

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

        3.通過返回內容指定后續流程資源定位以及操作來實現流程化。

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

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

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

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

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

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

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

    僅列出標題
    共12頁: First 上一頁 4 5 6 7 8 9 10 11 12 下一頁 
    主站蜘蛛池模板: 亚洲国产精品第一区二区| 国产精品无码永久免费888| 亚洲AV天天做在线观看| 国产无遮挡吃胸膜奶免费看| 88av免费观看入口在线| 中文永久免费观看网站| 无码一区二区三区亚洲人妻| 亚洲av永久综合在线观看尤物| 国产亚洲人成网站观看| 亚洲精品色婷婷在线影院| 日韩电影免费在线| 和日本免费不卡在线v| 一级毛片不卡片免费观看| 香蕉免费在线视频| 色费女人18女人毛片免费视频| 亚洲高清有码中文字| 亚洲精品美女视频| 亚洲AV永久无码精品一百度影院| 亚洲精品456播放| 免费A级毛片无码A∨男男| 成人黄动漫画免费网站视频 | 亚洲Av永久无码精品一区二区| 久久精品国产精品亚洲毛片| 亚洲av综合色区| 亚洲va中文字幕无码久久不卡| 亚洲婷婷五月综合狠狠爱| 国产亚洲精品免费视频播放| 亚洲精品岛国片在线观看| 免费在线观看a级毛片| 免费人成激情视频| 亚洲阿v天堂在线2017免费| 免费一级毛片女人图片| 婷婷综合缴情亚洲狠狠尤物| 免费在线观看中文字幕| 亚洲欧洲国产成人综合在线观看| 伊人久久亚洲综合影院| 亚洲乱亚洲乱少妇无码| 久久久久久A亚洲欧洲AV冫| 自拍偷自拍亚洲精品被多人伦好爽| 亚洲区不卡顿区在线观看| 国产亚洲日韩在线三区|