activemq和jms_保证主题,JMS规范和ActiveMQ的消息传递
activemq和jms
最近,一位客戶要求我仔細研究ActiveMQ的“持久”消息的實現(xiàn),它如何應(yīng)用于主題以及在存在非持久訂戶的故障轉(zhuǎn)移方案中會發(fā)生什么。我已經(jīng)了解到,JMS語義規(guī)定,即使面對消息代理提供程序故障,也只能保證主題的持久訂戶以持久傳遞模式傳遞消息。 但是對于持久消息的非持久訂戶,該怎么說呢? 沒有持久訂閱者時發(fā)送“持久”消息有什么意義?
在查看規(guī)范的確切措辭后,我變得有點不確定。 因此,我查閱了Java消息服務(wù)書(Richards,Monson-Haefel和Chappell),以了解有關(guān)保證消息傳遞的更多討論,并查看了ActiveMQ源代碼,并與我的一些同事進行了咨詢。
首先,讓我們看一下規(guī)格說明:
根據(jù)JMS規(guī)范的第4.10節(jié):
大多數(shù)客戶應(yīng)使用產(chǎn)生PERSISTENT消息的生產(chǎn)者。 這樣可以確保從隊列或持久訂閱中傳遞的消息只有一次的消息傳遞。
很清楚吧? 使用持久消息傳遞可確保為隊列或持久預(yù)訂傳遞消息。
從第6.12節(jié)開始:
不可持久訂戶的未確認消息應(yīng)該能夠在該不可持久訂戶的生命周期中恢復(fù)。
因此,現(xiàn)在應(yīng)該能夠恢復(fù)非持久訂戶的未經(jīng)確認的消息嗎? 我猜是“在那個非持久訂戶的一生中”
但后來成為6.12的一部分:
只有持久訂閱才能可靠地恢復(fù)未確認的消息。
和…
為了確保傳遞,TopicSubscriber應(yīng)該建立持久訂閱。
盡管規(guī)范非常清楚地表明(只有效果),只有隊列和持久訂戶才能利用存儲轉(zhuǎn)發(fā)保證的交付,但是我猜我對“非持久訂戶應(yīng)該能夠在非耐用訂戶的整個生命周期內(nèi)恢復(fù)”
- 主題的持久性協(xié)議是否會根據(jù)其使用者而更改(在此消息中,只有當代理保留了消息并向生產(chǎn)者發(fā)送確認后,消息才被視為代理的責任)?
- 這是否意味著即使發(fā)生經(jīng)紀人失敗? 還是考慮了經(jīng)紀人的失敗以及非耐久潛艇的訂購期限?
- 當存在用于持久性,非持久性主題的代理網(wǎng)絡(luò)時,ActiveMQ會發(fā)生什么? 如果網(wǎng)絡(luò)中的代理失敗,消息會丟失嗎?
- 向具有非持久訂閱者的主題發(fā)送消息“持久”與“非持久”之間的確切區(qū)別是什么?
這是保證交付討論中必須考慮的兩個部分。 發(fā)布者向代理發(fā)送消息的位置,以及消費者從代理接收消息的時間。 對于持久性消息,該協(xié)議僅在將消息持久化到商店之后才由發(fā)送方發(fā)送消息,并且代理由協(xié)議確認。 另一方面,消費者必須在經(jīng)紀人傳遞消息后確認該消息,說“嘿,我現(xiàn)在要對此消息負責”。 只有這樣,經(jīng)紀人才會放棄責任并將其從其商店中刪除。 ?
協(xié)議是否根據(jù)主題的使用者而改變?
因此,對于發(fā)送到某個主題的持久消息(目前未考慮任何消費者),規(guī)范是否說明在代理發(fā)回其確認之前是否應(yīng)該存儲該消息? 不,不是。 它由有關(guān)的JMS代理的實現(xiàn)者來決定。 對于ActiveMQ,如果某個主題上只有非持久訂閱,它將不會保留該消息。
協(xié)議的同步性質(zhì)不會改變,即,如果消息是持久發(fā)送的,則會話將認為與代理的交換是同步的,并且它將在繼續(xù)之前等待代理的響應(yīng),但代理不會實際保留消息。 在ActiveMQ中,如果至少有一個持久訂戶,則這種情況會改變。 然后,代理將保留消息(按照JMS規(guī)范)。 ?
這是否意味著即使發(fā)生經(jīng)紀人失敗?
如果代理失敗,則非持久訂閱的生存期確實會中斷。 因此,如果代理發(fā)生故障(或該非持久子項的任何其他終止),則即使將消息持久發(fā)送,也不會將其傳遞給該非持久訂戶。 此外,面對代理的非持久訂閱失敗,將不會重新發(fā)送消息。 ?
在經(jīng)紀人網(wǎng)絡(luò)中會發(fā)生什么?
消息確實可能丟失。 考慮這個經(jīng)紀人網(wǎng)絡(luò),其中A-> B-> C和訂閱是從C-> B-> A轉(zhuǎn)發(fā)的。因此,如果我們在A處有一個生產(chǎn)者,生產(chǎn)的主題為“ topic.foo”,而一個非耐用的消費者如果代理B在代理C上從“ topic.foo”中消費,則如果代理B發(fā)生故障,此后發(fā)送到A的消息將被丟棄。 據(jù)A所知,訂閱的生存期已終止。
最后, ?
向具有非持久訂閱者的主題發(fā)送消息“持久”與“非持久”之間的確切區(qū)別是什么?
根據(jù)JMS規(guī)范:
| 非持久 | 最多一次(如果不活動則丟失) | 最多一次 |
| 持久性 | 一次僅一次(如果不活動則丟失) | 一次只有一次 |
因此,對于非持久性訂戶,非持久性消息將“??最多”傳遞一次,但如果處于非活動狀態(tài)(或代理失敗)則將丟失。
對于非持久性訂戶,持久消息將“僅一次發(fā)送”,但如果不活動則丟失。 規(guī)范的“非活動”部分實際上意味著,如果沒有持久的主題訂閱者,則消息可能會丟失,并且無論消息是持久發(fā)送還是非持久發(fā)送,都無法保證傳遞。
參考: Christian Posta軟件博客上來自JCG合作伙伴 Christian Posta的主題,JMS規(guī)范和ActiveMQ的有保證的消息傳遞 。
翻譯自: https://www.javacodegeeks.com/2012/08/guaranteed-messaging-for-topics-jms.html
activemq和jms
總結(jié)
以上是生活随笔為你收集整理的activemq和jms_保证主题,JMS规范和ActiveMQ的消息传递的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 服务器被ddos怎么办(服务器ddos怎
- 下一篇: 程序化JCMD访问