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

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

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

    心有多大舞臺(tái)便有多大

    Embrace changes, pursue excellence, share niceness.

    我的JMS實(shí)踐

    本文中只是把我的一些使用JMS的心得寫(xiě)出來(lái),并非什么"最佳實(shí)踐",有錯(cuò)誤的請(qǐng)大家盡管拍磚!

    1.消息類型的選擇
    Java的JMS消息類型有文本類型,對(duì)象類型,字節(jié)類型,流類型,XML類型,在實(shí)際項(xiàng)目中,用的最多的是文本類型,對(duì)象類型和xml類型的消息.建議最好不用對(duì)象類型,因?yàn)槿绻脤?duì)象類型的話,調(diào)試的時(shí)候是很麻煩的,首先你必須要寫(xiě)專門(mén)的測(cè)試代碼用來(lái)發(fā)送消息,第二,必須要管理對(duì)象所屬的類的不同版本,第三,不方便查看queue或者topic中的消息內(nèi)容.而如果使用文本類型或者xml類型的消息,那么可以很容易的通過(guò)JMS中間件提供的一些管理工具來(lái)發(fā)送測(cè)試消息,查看消息內(nèi)容,并且更加容易管理不同版本之間的兼容性.如果一定要用對(duì)象類型消息的話,建議使用xstream把對(duì)象轉(zhuǎn)化為xml

    2.是使用queue還是topic?
    這兩者的定義是很清楚的,也很容易區(qū)分.但是在實(shí)際項(xiàng)目中,如何來(lái)取舍呢?我的建議是盡量用queue.如果你的項(xiàng)目用到了JMS,那么你的系統(tǒng)也應(yīng)該是到了需要部署在集群環(huán)境的規(guī)模了.用topic在集群環(huán)境下會(huì)帶來(lái)很多麻煩.舉個(gè)簡(jiǎn)單的例子,如果你是用MDB來(lái)處理topic的消息,你有一個(gè)MDB名為SampleMDB,它以集群的方式分別部署在A服務(wù)器和B服務(wù)器上.那么有可能同一條topic消息被同一個(gè)MDB處理兩次.雖然一些JMS中間件提供商為解決這種問(wèn)題提供了一些解決方案,例如把subsriber分組,但是它為開(kāi)發(fā)和調(diào)試都帶來(lái)了很大的麻煩.topic消息的處理也要比queue的復(fù)雜,很難跟蹤topic消息的處理過(guò)程.
    那么,如果不用topic的話,怎么來(lái)實(shí)現(xiàn)topic這種性質(zhì)的消息處理呢?可以寫(xiě)一個(gè)消息轉(zhuǎn)發(fā)器,把一個(gè)queue上的消息轉(zhuǎn)發(fā)給所有關(guān)注這個(gè)queue的其它queue中.例如,有一個(gè)queue,名為SampleQ1,一個(gè)消息發(fā)送者sender,一個(gè)消息轉(zhuǎn)發(fā)器router,有三個(gè)handler A,B,C需要處理這個(gè)queue中的消息.那么,sender發(fā)送消息到SampleQ1,router接收SampleQ1的消息后分別發(fā)送到SampleQ1_A,SampleQ1_B,SampleQ1_C,handler A,B,C分別從隊(duì)列SampleQ1_A,SampleQ1_B,SampleQ1_C中接收消息.

    3.用JMS來(lái)解決什么問(wèn)題?
    一提起JMS可以做什么,第一想到的就是異步處理.面試的時(shí)候問(wèn)JMS可以做什么?大多數(shù)的回答是:用JMS來(lái)異步發(fā)送郵件!(到底應(yīng)該怎么樣構(gòu)建一個(gè)郵件發(fā)送系統(tǒng)不是本文的主題,以后有時(shí)間我會(huì)專門(mén)來(lái)談?wù)勗谖业捻?xiàng)目中,我是怎么來(lái)設(shè)計(jì)郵件發(fā)送系統(tǒng)的).其實(shí),還可以用JMS來(lái)解決很多復(fù)雜的問(wèn)題,例如分布,并發(fā),系統(tǒng)解耦,負(fù)載均衡,熱部署,觸發(fā)器等等,這些復(fù)雜的問(wèn)題因?yàn)橐肓薐MS而變的更加簡(jiǎn)單.下面簡(jiǎn)單介紹下解決分布,并發(fā)問(wèn)題的場(chǎng)景.
    3.1 用JMS來(lái)解決并發(fā)問(wèn)題
    queue的概念大家都很清楚了,那就是queue里的一條消息只會(huì)被一個(gè)消息接收者處理.基于這個(gè)概念,我們可以在系統(tǒng)中對(duì)并發(fā)要求很嚴(yán)格的模塊中引入JMS的使用.例如,系統(tǒng)的送積分,一般這個(gè)模塊是用一個(gè)定時(shí)器,例如quartz,每天定期查詢數(shù)據(jù)庫(kù),如果發(fā)現(xiàn)有滿足條件的記錄,那么就把積分送給會(huì)員.如果同時(shí)有多個(gè)quartz在運(yùn)行,那么必須嚴(yán)格控制防止并發(fā)的對(duì)同一條記錄送多次積分.解決這個(gè)問(wèn)題有很多方法,可以通過(guò)業(yè)務(wù)的設(shè)計(jì),系統(tǒng)的部署,數(shù)據(jù)庫(kù)的設(shè)計(jì),事務(wù)的控制等方法來(lái)實(shí)現(xiàn),在這里提一個(gè)用JMS來(lái)解決問(wèn)題的方法:在插入記錄的同時(shí)發(fā)送一個(gè)queue的消息.這樣即使有多個(gè)送積分的MDB實(shí)例在運(yùn)行,也只會(huì)被一個(gè)實(shí)例處理.

    3.2用JMS來(lái)解決分布的問(wèn)題
    解決分布有兩種類型,第一種是指消息是集中的,但消息的處理是分布的.例如,系統(tǒng)可能會(huì)被分為前臺(tái)與后臺(tái),這兩個(gè)系統(tǒng)是部署在不同的網(wǎng)段里的.那么怎么把前臺(tái)發(fā)生的業(yè)務(wù)通知后臺(tái)系統(tǒng)呢?當(dāng)然,可以通過(guò)一個(gè)類似定時(shí)器的玩意定期去數(shù)據(jù)庫(kù)查詢.但這種方式要么就是浪費(fèi)系統(tǒng)資源,可能在定期查詢中80%的時(shí)間都是在做無(wú)用功,要么就是業(yè)務(wù)請(qǐng)求沒(méi)有被及時(shí)處理.,因?yàn)槎ㄆ诘臅r(shí)間總是有一個(gè)時(shí)間間隔的.用JMS來(lái)處理這個(gè)問(wèn)題會(huì)怎么樣呢?前臺(tái)系統(tǒng)在處理完業(yè)務(wù)請(qǐng)求后的同時(shí)發(fā)送一個(gè)消息到queue中,后臺(tái)系統(tǒng)的消息接收者接收到消息后立即處理.這里消息的處理也可能有一定的延期,但這主要取決于消息服務(wù)器的硬件能力,網(wǎng)絡(luò)帶寬,消息接收者的處理速度等.

    第二中是指消息也是分布的.很多消息中間件都提供了消息路由的功能,即消息發(fā)送到一個(gè)消息服務(wù)器后,這個(gè)消息服務(wù)器根據(jù)定義的規(guī)則再把這條消息路由轉(zhuǎn)發(fā)到其它的消息服務(wù)器.例如,可能在北京的一個(gè)數(shù)據(jù)中心部署了數(shù)據(jù)采集系統(tǒng),采集到數(shù)據(jù)后以消息的方式發(fā)送到消息服務(wù)器,然后消息服務(wù)器再把這條消息路由到上海的數(shù)據(jù)中心,再由上海數(shù)據(jù)中心部署的數(shù)據(jù)處理系統(tǒng)來(lái)處理這條消息.

    4.JMS與事務(wù),一定要用JTA事務(wù)嗎
    很多人接觸到JTA事務(wù)都是從用JMS開(kāi)始的,畢竟同時(shí)要連多個(gè)數(shù)據(jù)庫(kù)的的系統(tǒng)并不是那么的多!而要用JTA事務(wù)的話,就得要在笨重的應(yīng)用服務(wù)器中部署.(當(dāng)然,你也可以用類似atomikos的輕量級(jí)JTA事務(wù)管理器),更重要的是,并不是事務(wù)本身的技術(shù)有多復(fù)雜,而是事務(wù)的界定,這種事務(wù)的界定有時(shí)都不是程序員能決定的事情,需要在設(shè)計(jì)的時(shí)候就要考慮清楚,甚至可能還需要業(yè)務(wù)人員的參與.(題外話:經(jīng)常問(wèn)面試的,用spring的aop做什么?大多數(shù)答:用來(lái)管理事務(wù)!事務(wù)要真這么簡(jiǎn)單該多好啊!)
    我也不是要反對(duì)用JTA事務(wù),而是要說(shuō)明一下,用JMS,并非一定要用JTA事務(wù).這可以分為三種場(chǎng)景:
    一,必須用JTA事務(wù),這種情況下,一般消息的接收者只從消息本身獲得數(shù)據(jù)并進(jìn)行處理.所以必須要保證消息的發(fā)送與所依賴的業(yè)務(wù)保持一致.
    二.不需要用事務(wù),這種情況下, 要么是業(yè)務(wù)無(wú)關(guān)緊要,例如用JMS來(lái)記錄日志.要么是發(fā)送的消息僅僅是一個(gè)作為后續(xù)業(yè)務(wù)處理的一個(gè)觸發(fā)器!消息接收者僅僅是從消息中獲得一個(gè)id,然后根據(jù)這個(gè)id去查詢所依賴的其它數(shù)據(jù)進(jìn)行業(yè)務(wù)處理.即使消息丟失也沒(méi)關(guān)系,可以通過(guò)其它的機(jī)制來(lái)補(bǔ)償.
    三.消息丟失可以通過(guò)補(bǔ)償事務(wù)來(lái)完成.這個(gè)依賴與具體實(shí)現(xiàn),就不詳細(xì)說(shuō)了.

    5.處理消息永遠(yuǎn)比發(fā)送消息慢!
    要保證你的JMS應(yīng)用穩(wěn)定的運(yùn)行,那么你必須在開(kāi)發(fā),部署的時(shí)候時(shí)刻重視這個(gè)問(wèn)題.
    首先,需要把發(fā)送消息的連接池與接收消息的連接池分開(kāi).以避免接收消息的連接過(guò)過(guò)而導(dǎo)致發(fā)送消息的應(yīng)用拿不到連接.
    在一個(gè)連接上并發(fā)的處理消息,而不是連接打開(kāi),處理一個(gè)消息,馬上關(guān)閉連接.
    合理的設(shè)置消息的過(guò)期時(shí)間,否則消息日積月累,最終超出queue的size
    對(duì)于非關(guān)鍵業(yè)務(wù)的消息處理,可以采用異步處理的方法:接收到消息后并不是立刻處理,而是放到一個(gè)任務(wù)池或者線程池中處理.如果消息處理失敗,則把消息重新發(fā)送回隊(duì)列中.

    posted on 2008-06-26 15:43 pony 閱讀(5840) 評(píng)論(3)  編輯  收藏 所屬分類: Java

    評(píng)論

    # re: 我的JMS實(shí)踐 2008-06-26 17:47 popoer

    寫(xiě)得非常好!謝謝!  回復(fù)  更多評(píng)論   

    # re: 我的JMS實(shí)踐 2008-06-26 18:33 JMS 實(shí)踐者

    對(duì)于你說(shuō)的
    “到底應(yīng)該怎么樣構(gòu)建一個(gè)郵件發(fā)送系統(tǒng)不是本文的主題,以后有時(shí)間我會(huì)專門(mén)來(lái)談?wù)勗谖业捻?xiàng)目中,我是怎么來(lái)設(shè)計(jì)郵件發(fā)送系統(tǒng)的”
    我想知道你是怎么做的,謝謝!
    我的msn:bsli123@hotmail.com  回復(fù)  更多評(píng)論   

    # re: 我的JMS實(shí)踐 2014-04-21 17:50 leehow1988

    不知“消息丟失可以通過(guò)補(bǔ)償事務(wù)來(lái)完成”這是怎么做的,博主估計(jì)也不會(huì)看此文章了,有好心的朋友可以幫忙解答下 leehow1988@hotmail.com  回復(fù)  更多評(píng)論   

    主站蜘蛛池模板: 国产a不卡片精品免费观看 | 国产特级淫片免费看| 亚洲国产夜色在线观看| 国产精品美女午夜爽爽爽免费| 亚洲精品av无码喷奶水糖心| 亚洲精品国产精品乱码不卡| 亚洲视频免费在线观看| 亚洲国产av玩弄放荡人妇| 日韩一卡2卡3卡4卡新区亚洲| 999久久久免费精品播放| 精品亚洲成A人在线观看青青| 久久精品国产亚洲夜色AV网站| 最近中文字幕免费mv视频8| 久久国产福利免费| 亚洲一级毛片在线播放| 亚洲一区无码精品色| 国产卡一卡二卡三免费入口| 一个人看www免费高清字幕| 国产99在线|亚洲| 亚洲午夜福利AV一区二区无码| 免费a级毛片高清视频不卡| 国精产品一区一区三区免费视频| 亚洲中文字幕久久久一区| 国产亚洲一区二区三区在线不卡 | 无码av免费毛片一区二区| 九九久久精品国产免费看小说| 亚洲国产中文在线视频| 亚洲午夜久久久久久久久电影网| 成人免费午夜在线观看| 久久大香香蕉国产免费网站| 香蕉视频免费在线| 亚洲一区二区三区在线观看网站| 亚洲第一区香蕉_国产a| 伊人婷婷综合缴情亚洲五月| 免费大学生国产在线观看p| 国国内清清草原免费视频99| 全免费a级毛片免费看| 国产精品无码永久免费888| 校园亚洲春色另类小说合集| 丁香婷婷亚洲六月综合色| 亚洲黄色网址大全|