paulwong

          #

          [轉帖]建設一個靠譜的火車票網上訂購系統

          轉自【 http://www.ifanr.com/68019
          昨天,2012年1月11日,網友 @fenng 寫了一篇文章,批評鐵道部火車票網上訂購系統,http://www.12306.cn [1]。同時在新浪發了一條言辭激烈的微博,“去你的‘海量事務高速處理系統’”,引起熱議 [2]。

          春節將到,大家買不著車票,趕不上大年三十與家人團聚,急切心情可以理解。但是拍桌子開罵,只能宣泄情緒,解決不了實際問題。 開發一套訂票系統并不難,難在應對春運期間,日均 10 億級別的洪峰流量。日均 10 億級別的洪峰請求,在中國這個人口全球第一大國,不算稀罕,不僅火車票訂票系統會遇到,而且電子商務在促銷時,也會遇到,社交網站遇到新聞熱點時,也會遇到。 所以,能夠在中國成功運行的云計算系統,推廣到全球,一定也能成功。

          但是在美國成功運行的云計算系統,移植到中國,卻不一定成功。 如果我們能夠設計建造一套,穩定而高效的鐵路訂票系統,不僅解決了中國老百姓的實際問題,而且在全球高科技業界,也是一大亮點,而且是貼著中國標簽的前沿科技的亮點。 于是軟件工程師們獻計獻策,討論如何改進 12306 網上購票系統 [3]。其中比較有代表性的,有兩篇 [4,5]。 網友的評論中,有觀點認為,[4] 利用“虛擬排隊”的手段,將過程拉長負載降低,是網游的設計思路。而 [5] 利用緩存技術,一層層地降低系統負荷, 是互聯網的設計思路。 個人認為,[4] 和 [5] 并不是相互排斥的兩種路線,兩者著重解決的問題不同,不妨結合起來使用,取長補短。

          下面介紹一下我們的設計草案,追求實用,擯棄花哨。拋磚引玉,歡迎拍磚。
          圖一。12306.cn 網站系統架構設想圖。
          Courtesy http://i879.photobucket.com/albums/ab351/kan_deng/12306.png

          圖一是系統架構圖,典型的“展現層”/ “業務層”/ “數據層”的三段論。 用戶接入有兩類,一個是運行在電腦里的瀏覽器,例如 IE,另一個是手機。 無論用戶用電腦瀏覽器,還是手機訪問 http://www.12306.cn 網站,用戶請求首先被網站的負載均衡器接收。負載均衡器連接著一群門戶服務器,根據各個門戶服務器的負載輕重,負載均衡器把用戶請求,轉發到某一相對清閑的門戶服務器。 門戶服務器的任務類似于收發室老頭兒,它只讀每個用戶請求的前幾個 bytes,目的是確定用戶請求的類型,然后把請求投放到相應類型的隊列中去。門戶服務器的處理邏輯非常簡單,這樣做的好處,是讓它能夠快速處理大批量用戶請求。

          根據 [5] 的分析,12306 處理的用戶請求,大致分為三類,
          1. 查詢。用戶訂票前,查詢車次以及余票。用戶下訂單后,查詢是否已經訂上票。
          2. 訂票,包括確定車次和票數,然后付款。用戶付款時,需要在網銀等網站上操作。
          3. 第一次訪問的用戶,需要登記,包括姓名和信用卡等信息。

          三類請求的業務處理過程,被分為兩個階段,
          1. 運行于緩存中的任務隊列。設置隊列的目的,是防止處理過程耗時太長,導致大量用戶請求擁塞于門戶服務器,導致系統癱瘓。
          2. 業務處理處理器,對于每一類業務,分別有一群業務服務器。不同業務的處理流程,各不相同。
          圖二。12306.cn 網站查詢和訂票業務流程設想圖。
          Courtesy http://i879.photobucket.com/albums/ab351/kan_deng/12306-1.png
          圖二描述了查詢和訂票,兩個業務的處理流程。登記業務流程從略。 查詢的業務流程,參見圖二上半部,分五步。
          這里有兩個問題需要注意,
          1. 用戶發出請求后,經過短暫的等待時間,能夠迅速看到結果。平均等待時間不能超過 1 秒。
          2. 影響整個查詢速度的關鍵,是“查詢服務器”的設計。

          查詢任務可以進一步細化,大致分成三種。
          1. 查詢車次和時間表,這是靜態內容,很少與數據庫交互,數據量也不大,可以緩存在內存中。 車次和時間表的數據結構,不妨采用 Key-Value 的方式,開發簡單,使用效率高。Key-Value 的具體實現有很多產品,[5] 建議使用 Redis。 這些是技術細節,不妨通過對比實驗,針對火車票訂票系統的實際流量,以及峰值波動,確定哪一個產品最合適。
          2. 查詢某一班次的剩余車票,這需要調用數據庫中不斷更新的數據。 [5] 建議把剩余車票只分為兩種,“有”或“無”,這樣減少調用訪問數據庫的次數,降低數據庫的壓力。但是這樣做,不一定能夠滿足用戶的需求,說不定會招致網友的批評譏諷。 [4] 建議在訂票隊列中,增加測算訂票隊列長度的功能,根據訂票隊列長度以及隊列中每個請求的購票數量,可以計算出每個車次的剩余座位。如果 12306.cn 網站只有一個后臺系統,這個辦法行之有效。 但是假如 12306.cn 網站采用分布式結構,每個鐵路分局設有子系統,分別管理各個鐵路分局轄區內的各個車次。在分布式系統下,這個辦法面臨任務轉發的麻煩。不僅開發工作量大,而且會延長查詢流程處理時間,導致用戶長久等待。
          3. 已經下單的用戶,查詢是否已經成功地訂上票。 每個用戶通常只關心自己訂的票。如果把每個用戶訂購的車票的所有內容,都緩存在內存里,不僅非常耗用內存空間,內存空間使用效率低下,更嚴重的問題是,訪問數據庫過于頻繁,數據量大,增大數據庫的壓力。

          解決上述分布式同步,以及數據庫壓力的兩個問題,不妨從訂票的流程設計和數據結構設計入手。
          假如有個北京用戶在網上訂購了一套聯票,途經北京鐵路局和鄭州鐵路局轄區的兩個車次。
          用戶從北京上網,由北京鐵路局的子系統,處理他的請求。
          北京鐵路局的訂票服務器把他的請求一分為二,北京鐵路局的車次的訂票,在北京子系統完成,鄭州鐵路局的車次在鄭州子系統完成。
          每個子系統處理四種 Key-Value 數據組。
          1. 用戶ID:多個 (訂單ID)s。
          2. 訂單ID:多個 (訂票結果ID)s。
          3. 訂票結果ID: 一個 (用戶ID,車次ID)。
          4. 車次ID:一個(日期),多個 (座位,用戶ID)。
          北京訂票服務器完成訂票后,把上述四個數據組,寫入北京子系統的數據庫,同時緩存進北京的查詢服務器,參見圖二下半部第6步和第7步。
          鄭州訂票服務器完成訂票后,把上述四個數據組,寫入鄭州子系統的數據庫,同時緩存進北京的查詢服務器,而不是鄭州的服務器。 讓訂票服務器把訂票數據,同時寫入數據庫和查詢服務器的緩存,目的是讓數據庫永久保留訂票記錄,而讓大多數查詢,只訪問緩存,降低數據庫的壓力。
          北京用戶的訂票數據,只緩存在北京的查詢服務器,不跨域緩存,從而降低緩存空間的占用,和同步的麻煩。這樣做,有個前提假設,查詢用戶與訂票用戶,基本上是同一個人,而且從同一個城市上網。
           但是這里有個缺陷,某用戶在北京上網訂了票。過了幾天,他在北京上網,輸入用戶ID和密碼后,就會看到他訂購的所有車票??墒怯诌^了幾天,他去了鄭州,從鄭州上網,同樣輸入用戶ID和密碼,卻看不到他訂購的所有車票。
           解決這個缺陷的辦法并不麻煩,在用戶查詢訂票信息時,需要注明訂票地點,系統根據訂票地點,把查詢請求轉發到相應區域的子系統。 另外,每次訂票的時候,網站會給他的手機發送短信,提供訂票信息,參見圖二下半部第8步和第9步。

          以上是一個初步設計,還有不少細節需要完善,例如防火墻如何布置等等。
          這個設計不僅適用于單一的集中式部署,而且也適合分布式部署。
          或許有讀者會問,為什么沒有用到云計算?其實上述架構設計,為將來向云計算演變,留下了伏筆。
          在上述架構設計中,我們假定每個環節需要用多少服務器,需要多大容量的數據庫,預先都已經規劃好。
          但是假如事先的規劃,低于實際承受的流量和數據量,那么系統就會崩潰。
          所以,事先的規劃,只能以峰值為基準設立。 但是峰值將會是多少?
          事先難以確定。即便能夠確定峰值,然后以峰值為基準,規劃系統的能力,那么春運過后,就會有大量資源冗余,造成資源浪費? 如何既能抗洪,又不造成資源浪費?解決方案是云計算,而且目前看來,除了云計算,沒有別的辦法。

          Reference,
          [1] 海量事務高速處理系統。 http://www.douban.com/note/195179318/
          [2] 去你*的‘海量事務高速處理系統’。 http://weibo.com/1577826897/y0jGYcZfW
          [3] 火車訂票系統的設想。 http://weibo.com/1570303725/y0l9Y2mwE
          [4] 鐵路訂票系統的簡單設計。 http://blog.codingnow.com/2012/01/ticket_queue.html
          [5] 鐵路訂票網站個人的設計淺見。 http://hi.baidu.com/caoz/blog/item/f4f1d7caee09b558f21fe780.html
          題圖來自 Designyoutrust

          posted @ 2012-01-13 13:39 paulwong 閱讀(325) | 評論 (0)編輯 收藏

          臺灣圖書

           
          http://www.tenlong.com.tw/items/9861811915?item_id=59633
           
          商譽管理─看見危機,穿透危機,決勝於未戰之前
          http://www.tenlong.com.tw/items/9861578269?item_id=375391
           
          全面品質管理, 2/e
          http://www.tenlong.com.tw/items/9866184560?item_id=390199
           
          曼陀羅九宮格思考術─達成目標成功圓夢
          http://www.tenlong.com.tw/items/9866151018?item_id=58621
           
          六個標準差的品質管制─ 60 小時學會實務應用的手冊
          http://www.tenlong.com.tw/items/9572182579?item_id=377554
           
          在失業中創業:被炒魷魚又怎樣!
          http://www.tenlong.com.tw/items/9868768004?item_id=382010
           
          領導未來的 CEO-12 堂 EMBA 名師的管理必修課
          http://www.tenlong.com.tw/items/9862720581?item_id=383127
           
          早上 3 分鐘變身管理大師, 2/e
          http://www.tenlong.com.tw/items/9866487997?item_id=384625
           
          整合行銷傳播策略與企劃
          http://www.tenlong.com.tw/items/9576598761?item_id=384636
           
          Photoshop 視訊課程合集 (21)
          http://www.tenlong.com.tw/items/4712839503?item_id=385316
           
          DTP 視訊課程合集 (7)
          http://www.tenlong.com.tw/items/4712839503?item_id=385314
           
          3ds Max 視訊課程合集(22)
          http://www.tenlong.com.tw/items/4712839503?item_id=348746
           
          Photoshop 視訊課程合集 (22)
          http://www.tenlong.com.tw/items/4712839503?item_id=395988
           
          Photoshop 視訊課程合集 (21)
          http://www.tenlong.com.tw/items/4712839503?item_id=385316
           
          巴菲特 & 索羅斯聯手出擊─不看會後悔的投資策略
          http://www.tenlong.com.tw/items/9862572752?item_id=387693
           
          揭開肥貓經理人薪酬的黑盒子
          http://www.tenlong.com.tw/items/9862572485?item_id=387694
           
          圖解第一次看懂經濟指標就上手
          http://www.tenlong.com.tw/items/9866434192?item_id=389815
           
          把鳥事變好事的神奇手帳術
          http://www.tenlong.com.tw/items/9862295635?item_id=390569
           
          用 Please 換 Yes 的職場成功學
          http://www.tenlong.com.tw/items/9866009017?item_id=390570
           
          Pose 這樣擺最 OK ─人像攝影與場景的完美結合
          http://www.tenlong.com.tw/items/9862015454?item_id=392624
           
          寫給 SA 的 UML / UseCase 實務手冊
          http://www.tenlong.com.tw/items/9861817786?item_id=51507
           
          Thinking in Java 中文版 (Thinking in Java, 4/e)
          http://www.tenlong.com.tw/items/9861815023?item_id=45896
           
          jQuery 實戰手冊 (jQuery in Action, 2/e)
          http://www.tenlong.com.tw/items/9861811915?item_id=59633
           
          讓人不自覺說 YES 的交涉力
          http://www.tenlong.com.tw/items/9866363368?item_id=54347
           
          翻譯大師教你寫出好句子
          http://www.tenlong.com.tw/items/9577297390?item_id=49007
           
          日本超級店長首次公開讓客戶「好想再見到妳」的心機說話術
          http://www.tenlong.com.tw/items/9866097250?item_id=352822
           
          iPhone 基礎程式設計
          http://www.tenlong.com.tw/items/9866649091?item_id=351448
           
          圖解 NLP 惡魔說話術─實例篇
          http://www.tenlong.com.tw/items/9866363872?item_id=248045
           
          大膽想 出狠招 (Think Big And Kick Ass In Business And Life) http://www.tenlong.com.tw/items/9866662659?item_id=44764
           
          3ds Max 視訊課程合集 1
          http://www.tenlong.com.tw/items/4712839503?item_id=46426
           
          寫給經理人的專案管理發達之路-使用 Project 2010
          http://www.tenlong.com.tw/items/9572239325?item_id=371017
           
          軟體測試專案實作-技術、流程與管理
          http://www.tenlong.com.tw/items/9572239473?item_id=351121
           

          posted @ 2012-01-10 14:55 paulwong 閱讀(239) | 評論 (0)編輯 收藏

          JBoss下DataSource加密(上)

          1.先來看一個普通的數據源配置文件
          <?xml version="1.0" encoding="UTF-8"?>
          <datasources>
             
          <local-tx-datasource>
               
          <!-- jndi名字 -->
               
          <jndi-name>MySqlDS</jndi-name>
               
          <!--URL地址 --> 
               
          <use-java-context>false</use-java-context>
               
          <connection-url>jdbc:mysql://10.16.175.137:3306/test</connection-url>
               
          <!-- 驅動 --> 
               
          <driver-class>com.mysql.jdbc.Driver</driver-class>
                
          <!-- 用戶名 --> 
               
          <user-name>root</user-name>
                
          <!-- 密碼 --> 
              
          <password>123456</password>
              
          <exception-sorter-class-name> org.jboss.resource.adapter.jdbc.vendor.MySQLExceptionSorter </exception-sorter-class-name> 
               
          <metadata> 
                  
          <type-mapping>mySQL</type-mapping> 
               
          </metadata>
             
          </local-tx-datasource>
          </datasources>


          看一下這個文件,里面用戶名與密碼都是以明文方式存儲的,這樣子對系統的安全而言帶來了極大的威協。所以我們要為我們這個明文的密碼加一下密,這就是本文的目的.

          2.說到密碼加密,這里我們用到了JBoss下的一個類org.jboss.resource.security.SedureIdentityLoginModule,看看我們該如何用它來幫我們的密碼加密。
          先看個配置數據源的例子(mysql-ds.xml)

          <?xml version="1.0" encoding="UTF-8"?>
          <datasources>
          <local-tx-datasource>
          <jndi-name>MySqlDS</jndi-name>
          <use-java-context>false</use-java-context>
          <connection-url>jdbc:mysql://192.168.1.91:3306/atteam</connection-url>
          <driver-class>com.mysql.jdbc.Driver</driver-class>
          <!--這里不用寫上你的用戶名與密碼了,我們可以在login-config.xml里做點手腳,就OK了 -->
          <security-domain>EncryptDBPassword</security-domain>
          <exception-sorter-class-name>org.jboss.resource.adapter.jdbc.vendor.MySQLExceptionSorter</exception-sorter-class-name>
          <metadata>
          <type-mapping>mySQL</type-mapping>
          </metadata>
          </local-tx-datasource>
          </datasources>

          接著我們修改server\default\conf\login-config.xml文件,加上下面這一段配置文件

          <application-policy name="EncryptDBPassword">
          <!--這里的name應該是你在配置數據源時寫的security-domain里的字符串-->
          <authentication>
          <login-module code="org.jboss.resource.security.SecureIdentityLoginModule" flag="required">
          <!-- 數據庫的用戶名 -->
          <module-option name="username">test</module-option>
          <!--數據庫的密碼,不過是加密過的了 -->
          <module-option name="password">64c5fd2979a86168</module-option>
          <!-- 注意name等于你的數據源的jndi-name,這里是MySqlDS -->
          <module-option name="managedConnectionFactoryName">jboss.jca:service=LocalTxCM,name=MySqlDS</module-option>
          </login-module>
          </authentication>
          </application-policy>

          3.補充一下,這個加密的密碼是哪來的

          java -cp "D:\TDdownload\jboss-4.2.0.CR1\jboss-4.2.0.CR1\lib\jboss-jmx.jar;D:\TDdownload\jboss-4.2.0.CR1\jboss-4.2.0.CR1\lib\jboss-common.jar;D:\TDdownload\jboss-4.2.0.CR1\jboss-4.2.0.CR1\server\default\lib\jboss-jca.jar;D:\TDdownload\jboss-4.2.0.CR1\jboss-4.2.0.CR1\server\default\lib\jbosssx.jar" org.jboss.resource.security.SecureIdentityLoginModule 123456 Encoded password: 64c5fd2979a86168

          posted @ 2012-01-09 00:51 paulwong 閱讀(630) | 評論 (0)編輯 收藏

          實戰JBossMQ JMS集群

          一、環境
          數據庫服務器:Oracle 9i2
          操作系統:Windows XP SP2
          JBoss版本:4.2.2
          JDK:Sun 1.5.0.13
          網絡配置:同一機器的一個網卡上綁定兩個ip地址192.168.1.18和192.168.1.147


          二、配置
          1.配置消息和事務日志持久保存的數據源,從JBoss安裝位置的docs\examples\jca目錄下拷貝到server\all\deploy目錄下,并修改其中的連接配置,這里使用OracleDS作為持久保存的數據源。注意:別忘了把Oracle的jdbc驅動程序拷貝到server\all\lib目錄下。

          2.修改DestinationManager配置,刪除server\all\deploy-hasingleton\jms目錄下的hsqldb-jdbc2-service.xml文件,拷貝docs\examples\jms目錄下的oracle-jdbc2-service.xml到server\all\deploy-hasingleton目錄下,使用OracleDS作為DestinationManager的數據源。

          3. 修改StateManager配置,將其中的數據源配置由
          jboss.jca:service=DataSourceBinding,name=DefaultDS 
          jboss.jca:service=DataSourceBinding,name=OracleDS

          4. 配置測試的Topic,在server\all\deploy-hasingleton\jms目錄下新建一個名為jbossweek-jms-service.xml文件,
          <mbean code="org.jboss.mq.server.jmx.Topic" name="jboss.mq.destination:service=Topic,name=jbossweekTopic">
                  
          <depends optional-attribute-name="DestinationManager">jboss.mq:service=DestinationManager</depends>
          </mbean>

          5. 創建node1的服務器配置,將server\all目錄復制一份改名為node1

          6. 配置完成。


          三、驗證
          1. 分別以run –c all –b192.168.1.17和run –c node1–b192.168.1.148先后啟動all和node1配置。此時192.168.1.17為主節點,瀏覽http://192.168.1.17:8080/jmx-console/。打開JNDIView可以看到jbossweekTopic的JNDI名稱。此時192.168.1.17為主節點,瀏覽http://192.168.1.148:8080/jmx-console/。打開JNDIView就會發現沒有jbossweekTopic的JNDI名稱。

          2. 關閉192.168.1.17上的all服務器,此時在192.168.1.148上的node服務器的控制臺上會出現如下信息:
          13:11:13,921 INFO [TreeCache] viewAccepted(): [192.168.1.17:2292|2] [192.168.1.148:2327]
          13:11:14,015 INFO [TreeCache] viewAccepted(): [192.168.1.17:2288|2] [192.168.1.148:2321]
          13:11:14,218 INFO [DefaultPartition] New cluster view for partition DefaultPartition (id: 2, delta: -1) : [192.168.1.148:1099]
          13:11:14,218 INFO [DefaultPartition] I am (192.168.1.148:1099) received members hipChanged event: 13:11:14,218 INFO [DefaultPartition] Dead members: 1 ([192.168.1.17:1099])
          13:11:14,218 INFO [DefaultPartition] New Members : 0 ([])
          13:11:14,218 INFO [DefaultPartition] All Members : 1 ([192.168.1.148:1099])
          13:11:14,453 INFO [TreeCache] viewAccepted(): [192.168.1.17:2279|2] [192.168.1.148:2306]
          13:11:16,218 INFO [TomcatDeployer] deploy, ctxPath=/jbossmq-httpil, warUrl=.../deploy-hasingleton/jms/jbossmq-httpil.sar/jbossmq-httpil.war/
          13:11:17,406 INFO [jbossweekTopic] Bound to JNDI name: topic/jbossweekTopic
          13:11:17,453 INFO [A] Bound to JNDI name: queue/A
          13:11:17,453 INFO [B] Bound to JNDI name: queue/B
          13:11:17,468 INFO [C] Bound to JNDI name: queue/C
          13:11:17,468 INFO [D] Bound to JNDI name: queue/D
          13:11:17,468 INFO [ex] Bound to JNDI name: queue/ex
          13:11:17,484 INFO [testTopic] Bound to JNDI name: topic/testTopic
          13:11:17,500 INFO [securedTopic] Bound to JNDI name: topic/securedTopic
          13:11:17,500 INFO [testDurableTopic] Bound to JNDI name: topic/testDurableTopic
          13:11:17,500 INFO [testQueue] Bound to JNDI name: queue/testQueue
          13:11:17,562 INFO [UILServerILService] JBossMQ UIL service available at : /192.168.1.148:8093 13:11:17,609 INFO [DLQ] Bound to JNDI name: queue/DLQ

          3. JMS集群的主節點自動切換到192.168.1.148上的node1節點,瀏覽http://192.168.1.148:8080/jmx-console/。打開JNDIView就會找到jbossweekTopic的JNDI名稱。


          http://linliangyi2007.iteye.com/blog/316997
          http://docs.redhat.com/docs/zh-CN/JBoss_Enterprise_Application_Platform/5/html/JBoss_Messaging_User_Guide/index.html

          posted @ 2012-01-08 23:58 paulwong 閱讀(806) | 評論 (0)編輯 收藏

          jboss-4.2.x運行多個instance

          找到你運行的instance的conf/jboss-service.xml, eg: $JBOSS_HOME/server/default/conf/jboss-service.xml
          找到
          mbean服務中,名字為 ServiceBindingManager 的,里面有個叫做ports-01的內容,打開這個注釋,就可以了。

          如果你要運行多個,那么就需要有多個ServiceBindingManager ports-02,這是第三個,ports-03這是地四個,

          這個文件,對應${jboss.home.url}/docs/examples/binding-manager/sample-bindings.xml里面的ports-01部分,ports-02部分,只不過需要在這里啟用,啟動的同時,$JBOSS_HOME/server/default/deploy/jboss-web.deployer/server.xml里面的就不起作用了。

          posted @ 2012-01-08 21:33 paulwong 閱讀(318) | 評論 (0)編輯 收藏

          軟件開發流程

          1. 記錄業務流程,使用活動圖,有時業務流程可能太長,因此會每個流程加一個總結的圖,需要的元素有:輸入,輸出,目標,參與者,輸入可以是對象,資訊和事件。
          2. 以業務流程為基礎,找出系統工程功能需求,使用系統用例圖
          3. 找出領域對象,又稱實體模型,概念模型,領域在設計階段,就是數據表,這里有個模式可以用:交易模式,例如網上商城,下訂單的事件,通常會被分解為這幾個概念:訂單,訂單明細,商品,訂購者,倉庫,下一個動作的概念,如出貨,出貨明細,大致有這幾類:事件,人和地點。
          4. 為了驗證領域模型是否正確,引入分析類,這里又有一個模式:BCE模式,就是不管哪個系統,都可以分成:邊界(B),控制(C)和實體(E),以上這些就是分析模型。
          5. 分析模型是和語言無關的模型:PIM(Platform Independen Model),下面一步就是與語言有關的設計模型,PSM(Platform Specific Model),這里我們采用MDA(Model Driven Architec)模式,即設計類并不由我們人手去加,而是由工具根據上面的分析類生成,如果使用EA就會有這個功能了,上面的控制類在這里也會轉成控制類,但方法中的參數類型會轉為象String這種與開發語言更加密切的東西,也就是一個分析控制類轉成一個設計控制類,還會根據需要增加象DAO這些分析中沒有的設計類。
          6. 數據模型:根據領域模型生成具體的設計類,一個分析實體轉成一個設計實體類。
          7. 為了更加具體表達設計,可以增加狀態圖,例如請假流程,前面的請假流程已經用活動圖表達了,但請假的核心是請假單,我們會就請假單畫出所有的狀態,并加上觸發的事件。
          8. 根據設計類生成JAVA代碼。
          9. 根據前面的用例,設計出測試用例。
          最后完成。。

          posted @ 2012-01-06 14:46 paulwong 閱讀(338) | 評論 (0)編輯 收藏

          討論火車票訂購網站架構

          提交訂票訂單的處理流程如下:
          1)用戶通過瀏覽器訪問系統URL
          2)界面集群F5將請求轉發至某一節點,通過比較用戶數據庫的內容進行身份鑒權。
          3)鑒權成功后進入訂票,提交訂票訂單(查詢流程暫不討論)界面顯示請等待
          4)訂票消息被發送至總線部件(接口可用web Service、RMI、甚至自定義協議都可以)
          5)總線收到訂票消息、去Cache集群查詢相關車次
          6)Cache根據自身維護的車次余票表,返回查詢結果,如果有余票,轉7)。如果無票了,則總線返回界面集群“沒票了”,界面提示用戶明天再試。
          7)若有余票,則總線返回界面集群“正在出票,請等待”,并將訂票請求壓入隊列。且發消息至Cache,告訴CACHE將訂票請求加入隊列。
          8)Cache收到總線隊列增加1個的消息,將自身維護的對應車次余票數減1個。
          9)總線另一線程負責從隊列中取消息,并發送至出票部件。
          10)出票部件產生訂票結果,并修改數據庫,發送“訂票成功”消息回總線。
          11)總線將訂票成功消息直接回傳至界面集群。
          12)用戶看到訂票結果。

           

          posted @ 2012-01-06 11:10 paulwong 閱讀(365) | 評論 (0)編輯 收藏

          Using an Example of Sharding with Hibernate

          AMAZON的關于HIBERNATE SHARD的例子:
          http://aws.amazon.com/articles/0040302286264415

          posted @ 2012-01-04 23:21 paulwong 閱讀(289) | 評論 (0)編輯 收藏

          HIBERNATE SHARD

          數據上千萬,都擠在一個表里,導致查詢太慢?分庫分表洛!但已經用了HIBERNATE了,不想轉其他框架?用HIBERNATE SHARD!

          在向大家詳細介紹Hibernate Shard三種策略之前,首先讓大家了解下Hibernate Shard簡介,然后全面介紹Hibernate Shard三種策略。

          1. Hibernate Shard簡介
          Hibernate Shard多數據庫水平分區解決方案。Hibernate 的一個擴展,用于處理多數據庫水平分區架構。由google工程師 2007年 捐獻給 Hibernate社區。目前版本: 3.0.0 beta2, 未發GA版。條件:Hibernate Core 3.2, JDK 5.0

          2. 水平分區原理
          一個庫表如 Order 存在于多個數據庫實例上。按特定的分區邏輯,將該庫表的數據存儲在這些實例中,一條記錄的主鍵 PK,在所有實例中不得重復。水平分區在大型網站,大型企業應用中經常采用。目的出于海量數據分散存儲,分散操作,分散查詢以便提高數據處理量和整體數據處理性能。使用:google工程師的設計還是非常好的,完全兼容 Hibernate本身的主要接口。
          org.hibernate.Session  
            org.hibernate.SessionFactory  
            org.hibernate.Criteria  
            org.hibernate.Query 

          因此程序員開發變化不大,甚至不需要關心后臺使用了分區數據庫。程序遷移問題不大。而且配置上比較簡明。

          3. Hibernate Shard三種策略:
          ◆ShardAccessStrategy, 查詢操作時,到那個分區執行。默認提供兩個實現:
          順序策略:SequentialShardAccessStrategy, 每個query按順序在所有分區上執行。
          平行策略:ParallelShardAccessStrategy, 每個query以多線程方式并發平行的在所有分區上執行。此策略下,需要使用線程池機制滿足特定的性能需要,java.util.concurrent.ThreadPoolExecutor.

          ◆ShardSelectionStrategy, 新增對象時,存儲到哪個分區。框架默認提供了一個輪詢選擇策略 RoundRobinShardSelectionStrategy, 但一般不這樣使用。通常采用“attribute-based sharding”機制,基于屬性分區。一般是用戶根據表自己實現一個基于屬性分區的策略類ShardSelectionStrategy ,例如,以下WeatherReport基于continent屬性選擇分區:  
          public class WeatherReportShardSelectionStrategy implements ShardSelectionStrategy {  
          public ShardId selectShardIdForNewObject(Object obj) {  
          if(obj instanceof WeatherReport) 
          {  
          return ((WeatherReport)obj).getContinent().getShardId();  
          }
            
          throw new IllegalArgumentException();  
          }
           

          ◆ShardResolutionStrategy, 該策略用于查找單個對象時,判斷它在哪個或哪幾個分區上。默認使用 AllShardsShardResolutionStrategy ,可以自定義例如:  

          public class WeatherReportShardResolutionStrategy extends AllShardsShardResolutionStrategy
          {
          public WeatherReportShardResolutionStrategy(List<ShardId> shardIds)
          {
          super(shardIds);
          }


          public List<ShardId> selectShardIdsFromShardResolutionStrategyData( ShardResolutionStrategyData srsd)
          {
          if(srsd.getEntityName().equals(WeatherReport.class.getName()))
          {
          return Continent.getContinentByReportId(srsd.getId()).getShardId();
          }

          return super.selectShardIdsFromShardResolutionStrategyData(srsd);
          }

          }

          posted @ 2012-01-04 22:40 paulwong 閱讀(899) | 評論 (0)編輯 收藏

          Webx-淘寶的框架

          淘寶的一個框架:
          Webx:http://openwebx.org/docs/preface.html

          代碼下載:
          https://github.com/webx/citrus

          posted @ 2012-01-04 22:04 paulwong 閱讀(1248) | 評論 (0)編輯 收藏

          僅列出標題
          共115頁: First 上一頁 91 92 93 94 95 96 97 98 99 下一頁 Last 
          主站蜘蛛池模板: 鄯善县| 涪陵区| 灵璧县| 六枝特区| 天全县| 石棉县| 皋兰县| 芦溪县| 英德市| 彰化市| 巴里| 腾冲县| 洪洞县| 象山县| 莱西市| 望谟县| 琼结县| 黄山市| 涟水县| 永登县| 马山县| 扎赉特旗| 灯塔市| 赫章县| 伊川县| 霸州市| 泌阳县| 四平市| 永州市| 太仆寺旗| 芦山县| 务川| 友谊县| 新乡县| 临高县| 五原县| 阿鲁科尔沁旗| 洪洞县| 河北省| 同德县| 阿勒泰市|