JMS学习(六)--提高非持久订阅者的可靠性 以及 订阅恢复策略
一,非持久訂閱者 和 實時消費消息
在這篇文章中區分了Domain為Pub/Sub、Destination為Topic時,消費者有兩種:持久訂閱者 和 非持久訂閱者。
對于持久訂閱者而言,只要訂閱了某個Topic,就不用擔心自己“離線”(inactive)后,錯過某些消息。
但是對于非持久訂閱者:①生產者發送了若干個消息到Topic后,非持久訂閱者才去訂閱該Topic,則它會錯過(收不到)在它訂閱之前發送的消息。
②生產者向Topic發送了若干個消息,而此時因網絡中斷原因或者非持久訂閱者宕機時,非持久訂閱者剛好不在線(inactive),就會錯過(收不到)生產者發送的消息。
③從消息的角度而言,有些消息是實時消息(如,實時股票價格),需要快速地消費掉,對消息進行持久化就沒有太大的意義,而且會因為存儲消息而造成一定的開銷。
因此,為了提高非持久訂閱者的可靠性,以及實時的消費消息,就需要:消息不進行持久化并緩存消息(Caching message for nondurable consumers);對緩存的消息的消費策略
?
二,Retroactive Consumers
什么是Retroactive Consumer呢?
Retroactive Consumer屬于非持久訂閱者,但它是消費 非持久化消息 的訂閱者。(其他非持久訂閱者 可以消費持久化消息)
The ActiveMQ message broker caches messages in memory for every topic that is used. The only types of topics that are not supported are temporary topics and ActiveMQ advisory topics. Messages that are cached by the broker are only dispatched to a topic consumer if it is retroactive;and never to durable topic subscribers.①ActiveMQ Broker可以為各種Topic緩存消息(但不支持 temporary topic 和 advisory topic)。這說明:該機制只針對Topic而言。
②緩存的消息只會發給 retroactive consumer,并不會發送給持久訂閱者。
那非持久訂閱者如何成為 retroactive consumer呢?最簡單的方式是在創建Topic的時候指定consumer為retroactive
Topic topic = session.createTopic("soccer.division1.leeds?consumer.retroactive=true"); MessageConsumer consumer = session.createConsumer(topic);?
三,消息“訂閱恢復策略”(Subscription Recovery Policies)
正因為 retroactive consumer 消費的是非持久化的消息(消息保存在內存中),所以就會出現 第一部分中提到的這兩個問題:
①生產者發送了若干個消息到Topic后,非持久訂閱者才去訂閱該Topic,則它會錯過(收不到)在它訂閱之前發送的消息。
②生產者向Topic發送了若干個消息,而此時因網絡中斷原因或者非持久訂閱者宕機時,非持久訂閱者剛好不在線(inactive),就會錯過(收不到)生產者發送的消息。
就需要:訂閱恢復策略。訂閱恢復策略的目的就是讓retroactive consumer能夠回到過去某個時間點消費它錯過了的消息。
比如說:生產者發送了消息A,消息B給Broker的Topic之后,retroactive consumer才訂閱該Topic,訂閱恢復策略就可以讓retroactive consumer能收到在它訂閱之前就已經發送的消息(消息A 和消息B)
訂閱恢復策略主要有以下幾類,簡要介紹如下:(具體的配置參數可參考官網)
1)FixedSizedSubscriptionRecoveryPolicy
這是ActiveMQ默認的策略。該恢復訂閱策略最大的特點是:開辟多大的內存緩存發送到該Topic的消息。
?
2)Fixed Count Subscription Recovery Policy
按照數量來緩存消息。即,允許Topic最大緩存多少條消息。舉例如下:
假設設置的Topic最大可緩存1000條消息。當前Topic已經緩存了500條消息了,retroactive consumer在 收到了一些消息之后宕機了,在宕機這段時間內,生產者又向Topic發送了100條消息。那么當retroactive consumer恢復正常后,生產者又向Topic發送了200條消息,那么:retroactive consumer 首先會收到它宕機期間錯過的100條消息,然后就收到剛剛的200條消息。(總的消息條數未超過1000)
.....
還有其他一些恢復訂閱策略就不一 一介紹了。總之,恢復訂閱策略針對的是非持久化的retroactive consumer訂閱者而言的。它提高了非持久化消息的可靠性。
?
四,參考資料:
?ActiveMQ消息傳送機制以及ACK機制詳解
《ActiveMQ in Action》
ActiveMQ官網
本文轉自hapjin博客園博客,原文鏈接:http://www.cnblogs.com/hapjin/p/5649696.html,如需轉載請自行聯系原作者
總結
以上是生活随笔為你收集整理的JMS学习(六)--提高非持久订阅者的可靠性 以及 订阅恢复策略的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 解决:MVC对象转json包含\r \n
- 下一篇: :Windows下RabbitMQ安装及