activemq优先级_ActiveMQ消息优先级:工作原理
activemq優(yōu)先級(jí)
在郵件列表中 ,通常會(huì)圍繞ActiveMQ的消息優(yōu)先級(jí)支持不斷提出一些問(wèn)題,以及有關(guān)觀察到的行為和“真正支持什么”的好問(wèn)題? 我希望可以幫助您了解幕后情況以及可以支持的優(yōu)先級(jí)。 詳細(xì)信息可能會(huì)有些麻煩。 如果您對(duì)這些細(xì)節(jié)不感興趣,請(qǐng)查看ActiveMQ Wiki ,以獲取高級(jí)概述。
首先,由于ActiveMQ支持JMS 1.1,所以讓我們看一下JMS規(guī)范對(duì)支持“ JMSPriority”的看法:
JMS定義了一個(gè)十級(jí)優(yōu)先級(jí)值,最低優(yōu)先級(jí)為0,最高優(yōu)先級(jí)為9。 此外,客戶(hù)應(yīng)將優(yōu)先級(jí)0-4視為正常優(yōu)先級(jí),將優(yōu)先級(jí)5-9視為快速優(yōu)先級(jí)。 JMS不需要提供者嚴(yán)格執(zhí)行消息的優(yōu)先級(jí)排序; 但是,它應(yīng)該盡力在普通消息之前傳遞加急消息。
ActiveMQ觀察到三個(gè)不同級(jí)別的“優(yōu)先級(jí)”:
- 默認(rèn)(JMSPriority == 4)
- 高(JMSPriority> 4 && <= 9)
- 低(JMSPriority> 0 && <4)
如果您沒(méi)有為MessageProducer或單個(gè)消息指定優(yōu)先級(jí)(請(qǐng)參閱MessageProducer#send(message,deliveryMode,priority,timeToLive) ),則ActiveMQ的客戶(hù)端將默認(rèn)使用JMSPriority ==4。作為JMS使用者,您可以期望如果生產(chǎn)者沒(méi)有使用優(yōu)先級(jí),或者您沒(méi)有在目的地使用其他形式的選擇標(biāo)準(zhǔn),則使用FIFO排序。
規(guī)范指出,ActiveMQ還“盡其所能”在“正常”消息之前傳遞加速消息。 代理使用的消息存儲(chǔ)對(duì)完成操作有很大的幫助,但是通常,您可以期望代理僅接受JDBC支持的消息存儲(chǔ)的嚴(yán)格(0-9)優(yōu)先級(jí)支持。 對(duì)于支持KahaDB的消息存儲(chǔ)庫(kù),僅支持“類(lèi)別優(yōu)先級(jí)”(“低”,“默認(rèn)”,“高”,其中每個(gè)類(lèi)別中的優(yōu)先級(jí)并非總是有區(qū)別的,即5和9被視為“高”)。 但是,使用正確的設(shè)置和消息傳遞配置文件,即使使用KahaDB,您也可以影響[嚴(yán)格]優(yōu)先級(jí)排序的方式,因此讓我們快速看一下。
啟用郵件優(yōu)先級(jí)
您可以使用activemq.xml配置文件中的以下設(shè)置在隊(duì)列上啟用消息優(yōu)先級(jí):
<destinationPolicy><policyMap><policyEntries><policyEntry queue='queueName' prioritizeMessages='true' /></policyEntries></policyMap> </destinationPolicy>對(duì)于queueName ,具有通配符支持,因此您可以在消息層次結(jié)構(gòu)上啟用優(yōu)先級(jí)支持。
啟用優(yōu)先級(jí)支持后,代理將在其消息游標(biāo)中使用優(yōu)先級(jí)鏈表結(jié)構(gòu),并向KahaDB提示在將消息存儲(chǔ)到磁盤(pán)時(shí)使用優(yōu)先級(jí)類(lèi)別。 優(yōu)先級(jí)排序的嚴(yán)格程度有不同的級(jí)別,但是在最壞的情況下,您可以假定優(yōu)先級(jí)將按類(lèi)別維護(hù)。 以下因素起作用,這些因素控制使用KahaDB存儲(chǔ)時(shí)優(yōu)先級(jí)排序的嚴(yán)格程度:
- 在隊(duì)列游標(biāo)中啟用/禁用緩存
- MaxPageInSize,用于從一批存儲(chǔ)中分頁(yè)多少條消息
- 消費(fèi)者預(yù)取
- 過(guò)期消息檢查
- 代理內(nèi)存設(shè)置
- 持久/非持久消息
下一節(jié)將詳細(xì)介紹KahaDB中為支持優(yōu)先級(jí)而發(fā)生的事情,而下一節(jié)將探討代理內(nèi)存中的情況如何發(fā)生并最終分發(fā)給消費(fèi)者,并指出與上述不同因素的關(guān)系發(fā)揮作用。
KahaDB優(yōu)先級(jí)分類(lèi)
首先,我們將從如何將消息存儲(chǔ)在磁盤(pán)上并加載到目標(biāo)位置開(kāi)始。 KahaDB(默認(rèn)消息存儲(chǔ))是基于文件的消息數(shù)據(jù)庫(kù),代理使用該數(shù)據(jù)庫(kù)將消息持久存儲(chǔ)在“日志”或“日志”中。 代理還通過(guò)保持一個(gè)單獨(dú)的“索引”來(lái)跟蹤日志中包含哪些消息,該“索引”保存有關(guān)消息的信息(例如其在日志中的位置,與之關(guān)聯(lián)的目的地,訂購(gòu)等)。 索引還具有消息“優(yōu)先級(jí)”的概念,該概念由三個(gè)B + Tree結(jié)構(gòu)實(shí)現(xiàn),每個(gè)優(yōu)先級(jí)級(jí)別一個(gè)(請(qǐng)參見(jiàn)org.apache.activemq.store.kahadb.MessageDatabase中的MessageOrderIndex)。 此實(shí)現(xiàn)細(xì)節(jié)是消息優(yōu)先級(jí)排序的根,當(dāng)消息從存儲(chǔ)中刪除時(shí),它將對(duì)其余的代理產(chǎn)生影響。
從商店中檢索消息時(shí),將成批完成(maxPageInSize),并且首先檢索“ highPriority” BTree中的消息。 當(dāng)高優(yōu)先級(jí)消息耗盡時(shí),存儲(chǔ)將隨后提供默認(rèn)優(yōu)先級(jí),并隨后提供低優(yōu)先級(jí)消息。
您可以這樣設(shè)置maxPageInSize:
<policyEntry queue='queueName' prioritizeMessages='true'maxPageSize='500'>頁(yè)面大小越大,批處理中的消息數(shù)量就越大,并且每次“快照”一次可以看到的消息越多。 對(duì)于進(jìn)入內(nèi)存的每個(gè)批次,將嚴(yán)格按照商店游標(biāo)的說(shuō)明,對(duì)消息進(jìn)行優(yōu)先級(jí)排序。 缺點(diǎn)是,如果您的消息量很大,一次輸入500條消息可能會(huì)耗盡代理內(nèi)存。 默認(rèn)設(shè)置為200。
消息光標(biāo)優(yōu)先級(jí)列表
當(dāng)持久性消息從生產(chǎn)者進(jìn)入代理時(shí),它們將被存儲(chǔ)到磁盤(pán)上,但也將被緩存在內(nèi)存中,等待分發(fā)給消費(fèi)者。 這是默認(rèn)設(shè)置,因此無(wú)需顯式設(shè)置。 其背后的想法是能夠調(diào)度到快速使用方,而不必直接從磁盤(pán)檢索它(如果使用方變慢,則代理將自動(dòng)調(diào)整自身以使其在填充后不使用高速緩存,從而避免OOM)。 這樣做的好處是,當(dāng)對(duì)隊(duì)列使用優(yōu)先級(jí)支持時(shí),用于游標(biāo)的內(nèi)部列表將支持嚴(yán)格的優(yōu)先級(jí)(0-9),因此對(duì)于當(dāng)前在內(nèi)存(在緩存中)的所有消息,它們將按照從高到低的順序正確排序。 訣竅在于,當(dāng)緩存中的所有消息都是“低優(yōu)先級(jí)消息”,然后高優(yōu)先級(jí)消息進(jìn)入代理,但由于緩存已滿(mǎn)而無(wú)法容納在緩存中時(shí),這種情況將發(fā)生。直接在商店中進(jìn)行索引,并在“高優(yōu)先級(jí)”索引中進(jìn)行索引,但是在下一批優(yōu)先級(jí)消息被分頁(yè)到內(nèi)存中之前,將無(wú)法在低優(yōu)先級(jí)消息之前進(jìn)行分發(fā)。
當(dāng)NON持久消息進(jìn)入代理時(shí),它們將不會(huì)進(jìn)入消息存儲(chǔ)。 它們將盡可能長(zhǎng)時(shí)間地保留在內(nèi)存中,并且僅在內(nèi)存超過(guò)定義的閾值(默認(rèn)情況下> 70%)時(shí)才推送到磁盤(pán)(在臨時(shí)存儲(chǔ)中)。 因此,上面的緩存消息的相同行為適用于非持久消息,即內(nèi)存中的消息將嚴(yán)格排序(0-9),但是一旦將它們推送到磁盤(pán),就只會(huì)觀察到類(lèi)別。
如果禁用游標(biāo)的緩存(具有以下設(shè)置)
<policyEntry queue='queueName' prioritizeMessages='true'useCache='false' />那么您可以幫助消除上述情況,即當(dāng)高優(yōu)先級(jí)消息進(jìn)入時(shí),高速緩存將充滿(mǎn)低優(yōu)先級(jí)消息(由于無(wú)法分頁(yè)到內(nèi)存而卡在磁盤(pán)上)。 但是,這樣做會(huì)降低吞吐量,因?yàn)楸仨毾葘⒋疟P(pán)中的消息分頁(yè)到發(fā)送給使用者之前,這會(huì)減慢調(diào)度速度。 但是請(qǐng)注意,這樣做時(shí),即使光標(biāo)中具有優(yōu)先級(jí)列表,您也更有可能看到不遵循“嚴(yán)格”優(yōu)先級(jí)的消息。 但是,它們將正確遵循優(yōu)先級(jí)類(lèi)別(高,默認(rèn),低)。 綜上所述,如果禁用緩存,則與啟用緩存并填充優(yōu)先級(jí)較低的消息相比,可以更快地發(fā)送優(yōu)先級(jí)較高的消息。 但是,僅禁用緩存不會(huì)使您獲得嚴(yán)格的優(yōu)先權(quán)。
禁用緩存有助于將高優(yōu)先級(jí)的消息先于低優(yōu)先級(jí)的消息發(fā)送給使用者,但是要使其按預(yù)期工作(并且已經(jīng)使我感到痛苦),則需要禁用異步message expiry check 。 此過(guò)期檢查每30秒將郵件分頁(yè)到內(nèi)存中,無(wú)論它們是否準(zhǔn)備好進(jìn)行分派(默認(rèn)情況下),并對(duì)其執(zhí)行TTL檢查(生存時(shí)間),并丟棄那些應(yīng)過(guò)期的郵件。 這種檢查有效地將消息帶入內(nèi)存,并且將停滯正常的“頁(yè)面調(diào)度”,足以錯(cuò)過(guò)更高優(yōu)先級(jí)的消息。
<policyEntry queue='queueName' prioritizeMessages='true'useCache='false' expireMessagesPeriod='0' >但是,關(guān)閉到期檢查將使過(guò)期消息在存儲(chǔ)區(qū)中保留的時(shí)間更長(zhǎng),因?yàn)槲ㄒ坏牡狡跈z查將在發(fā)送之前進(jìn)行,因此請(qǐng)對(duì)此進(jìn)行有根據(jù)的決定,并修改所有ActiveMQ設(shè)置。 但是,為了朝著嚴(yán)格的順序優(yōu)先順序前進(jìn),您需要禁用此功能。
最后,消費(fèi)者的預(yù)取在實(shí)現(xiàn)“嚴(yán)格訂購(gòu)”方面發(fā)揮了作用。 默認(rèn)情況下,隊(duì)列使用者的預(yù)取設(shè)置為1000,這意味著將批量發(fā)送1000條消息。 這有助于加快消費(fèi)者在使用消息時(shí)的速度,但是就優(yōu)先級(jí)而言,從本質(zhì)上講,它還像消息的緩存一樣(如上所述),可能會(huì)導(dǎo)致看不到“嚴(yán)格排序”。 如果您的預(yù)取中填充了較低優(yōu)先級(jí)的消息,并且代理中出現(xiàn)了新的高優(yōu)先級(jí)消息,那么您也不會(huì)看到它,直到下一條消息分發(fā)給消費(fèi)者為止。 因此,預(yù)取越低,在優(yōu)先級(jí)較低的消息之前看到較高優(yōu)先級(jí)的消息的可能性就越大。 預(yù)取為1時(shí),您將始終獲得商店游標(biāo)知道的最高優(yōu)先級(jí)消息。
<policyEntry queue='queueName' prioritizeMessages='true'useCache='false' expireMessagesPeriod='0' queuePrefetch='1' >客戶(hù)端消息優(yōu)先級(jí)
ActiveMQ還具有消息客戶(hù)端中內(nèi)置的優(yōu)先級(jí)支持,并且默認(rèn)情況下已啟用。 這意味著,當(dāng)將消息發(fā)送到您的使用者時(shí)(甚至在您的消費(fèi)者使用預(yù)取功能接收到它們之前),它們將被緩存在使用者端,并且默認(rèn)情況下具有優(yōu)先級(jí)。 這與您是否在代理方使用優(yōu)先級(jí)支持無(wú)關(guān)。 這可能會(huì)影響您在消費(fèi)者上看到的訂購(gòu),因此請(qǐng)記住這一點(diǎn)。 要禁用它,請(qǐng)?jiān)诖鞺RL上設(shè)置以下配置選項(xiàng),例如tcp://0.0.0.0:61616?jms.messagePrioritySupported=false
但是如上所述,您需要將預(yù)取降低到1,以獲得獲得嚴(yán)格排序的最佳機(jī)會(huì)。
權(quán)衡
因此,最終可以通過(guò)KahaDB獲得嚴(yán)格排序的消息,但是要進(jìn)行重大折衷考慮,并且它并不適用于所有消息傳遞情況。 您想要優(yōu)化的快速消息傳遞嗎? 還是要放慢消息傳遞速度,以實(shí)現(xiàn)對(duì)優(yōu)先級(jí)的嚴(yán)格排序。 每種情況都不同,應(yīng)根據(jù)具體情況進(jìn)行評(píng)估。 但是,通常,您可以依賴(lài)類(lèi)別級(jí)別的優(yōu)先級(jí)。
在大隊(duì)列中對(duì)消息進(jìn)行重新排序并保持高性能是有問(wèn)題的,大多數(shù)Message Queue供應(yīng)商都做得不太好。 ActiveMQ的優(yōu)先級(jí)支持很強(qiáng),但正如ActiveMQ Wiki上討論的描述消息優(yōu)先級(jí)的討論一樣,還有另一個(gè)不錯(cuò)的選擇,那就是:使用消息選擇器并以高優(yōu)先級(jí)的消息最終被首先使用的方式平衡使用者。 這種方法傾向于提供更多的靈活性和控制力,但這是另一篇文章。
翻譯自: https://www.javacodegeeks.com/2013/04/activemq-message-priorities-how-it-works.html
activemq優(yōu)先級(jí)
總結(jié)
以上是生活随笔為你收集整理的activemq优先级_ActiveMQ消息优先级:工作原理的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: hpm128fn连接电脑端口(惠普打印机
- 下一篇: Java 9概览