ActiveMQ相关存储介绍
?ActiveMQ 的存儲(chǔ):
ActiveMQ 在 queue 中存儲(chǔ) Message 時(shí),采用先進(jìn)先出順序(FIFO)存儲(chǔ)。同一時(shí)間一個(gè)消息被分派給單個(gè)消費(fèi)者,且只有當(dāng) Message 被消費(fèi)并確認(rèn)時(shí),它才能從存儲(chǔ)中刪除。
對(duì)于持久化訂閱者來(lái)說(shuō),每個(gè)消費(fèi)者獲得 Message 的副本。為了節(jié)省存儲(chǔ)空間,Provider 僅存儲(chǔ)消息的一個(gè)副本。持久化訂閱者維護(hù)了指向下一個(gè) Message 的指針,并將其副本分派給消費(fèi)者。以這種方式實(shí)現(xiàn)消息存儲(chǔ),因?yàn)槊總€(gè)持久化訂閱者可能以不同的速率消費(fèi) Message,或者它們可能不是全部同時(shí)運(yùn)行。此外,因每個(gè) Message 可能存在多個(gè)消費(fèi)者,所以在它被成功地傳遞給所有持久化訂閱者之前,不能從存儲(chǔ)中刪除。
表格形式展現(xiàn)
| 消息類型 | 是否持久化 | 是否有Durable訂閱者(持久) | 消費(fèi)者延遲啟動(dòng)時(shí),消息是否保留 | Broker重啟時(shí),消息是否保留 |
| Queue | N | - | Y | N |
| Queue | Y | - | Y | Y |
| Topic | N | N | N | N |
| Topic | N | Y | Y | N |
| Topic | Y | N | N | N |
| Topic | Y | Y | Y | Y |
?ActiveMQ 常用的存儲(chǔ)方式
1.KahaDB
ActiveMQ 5.3 版本起的默認(rèn)存儲(chǔ)方式。KahaDB存儲(chǔ)是一個(gè)基于文件的快速存儲(chǔ)消息,設(shè)計(jì)目標(biāo)是易于使用且盡可能快。它使用基于文件的消息數(shù)據(jù)庫(kù)意味著沒(méi)有第三方數(shù)據(jù)庫(kù)的先決條件。
要啟用 KahaDB 存儲(chǔ),需要在 activemq.xml 中進(jìn)行以下配置:
| 12345 | <broker brokerName="broker" persistent="true" useShutdownHook="false">????????<persistenceAdapter>????????????????<kahaDB directory="${activemq.data}/kahadb" journalMaxFileLength="16mb"/>????????</persistenceAdapter></broker> |
2.AMQ
與 KahaDB 存儲(chǔ)一樣,AMQ存儲(chǔ)使用戶能夠快速啟動(dòng)和運(yùn)行,因?yàn)樗灰蕾囉诘谌綌?shù)據(jù)庫(kù)。AMQ 消息存儲(chǔ)庫(kù)是可靠持久性和高性能索引的事務(wù)日志組合,當(dāng)消息吞吐量是應(yīng)用程序的主要需求時(shí),該存儲(chǔ)是最佳選擇。但因?yàn)樗鼮槊總€(gè)索引使用兩個(gè)分開(kāi)的文件,并且每個(gè) Destination 都有一個(gè)索引,所以當(dāng)你打算在代理中使用數(shù)千個(gè)隊(duì)列的時(shí)候,不應(yīng)該使用它。
| 12345678 | <persistenceAdapter>????????<amqPersistenceAdapter????????????????directory="${activemq.data}/kahadb"????????????????syncOnWrite="true"????????????????indexPageSize="16kb"????????????????indexMaxBinSize="100"????????????????maxFileLength="10mb" /></persistenceAdapter> |
3.JDBC
選擇關(guān)系型數(shù)據(jù)庫(kù),通常的原因是企業(yè)已經(jīng)具備了管理關(guān)系型數(shù)據(jù)的專長(zhǎng),但是它在性能上絕對(duì)不優(yōu)于上述消息存儲(chǔ)實(shí)現(xiàn)。事實(shí)是,許多企業(yè)使用關(guān)系數(shù)據(jù)庫(kù)作為存儲(chǔ),是因?yàn)樗麄兏敢獬浞掷眠@些數(shù)據(jù)庫(kù)資源。
| 123456789101112131415 | <beans>????????<broker brokerName="test-broker" persistent="true" xmlns="http://activemq.apache.org/schema/core">????????????????<persistenceAdapter>????????????????????????<jdbcPersistenceAdapter dataSource="#mysql-ds"/>????????????????</persistenceAdapter>????????</broker>????????<bean id="mysql-ds" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">????????????????<property name="driverClassName" value="com.mysql.jdbc.Driver"/>????????????????<property name="url" value="jdbc:mysql://localhost/activemq?relaxAutoCommit=true"/>????????????????<property name="username" value="activemq"/>????????????????<property name="password" value="activemq"/>????????????????<property name="maxActive" value="200"/>????????????????<property name="poolPreparedStatements" value="true"/>????????</bean></beans> |
4.內(nèi)存存儲(chǔ)
內(nèi)存消息存儲(chǔ)器將所有持久消息保存在內(nèi)存中。在僅存儲(chǔ)有限數(shù)量 Message 的情況下,內(nèi)存消息存儲(chǔ)會(huì)很有用,因?yàn)?Message 通常會(huì)被快速消耗。在 activemq.xml 中將 broker 元素上的 persistent 屬性設(shè)置為 false 即可。
| 12345 | <broker brokerName="test-broker" persistent="false" xmlns="http://activemq.apache.org/schema/core">????????<transportConnectors>????????????????<transportConnector uri="tcp://localhost:61635"/>????????</transportConnectors></broker> |
講講 ActiveMQ 的部署模式
1.單例模式
這個(gè)就不啰嗦了,略過(guò)。
2.無(wú)共享主從模式
這是最簡(jiǎn)單的 Provider 高可用性的方案,主從節(jié)點(diǎn)分別存儲(chǔ) Message。從節(jié)點(diǎn)需要配置為連接到主節(jié)點(diǎn),并且需要特殊配置其狀態(tài)。
所有消息命令(消息,確認(rèn),訂閱,事務(wù)等)都從主節(jié)點(diǎn)復(fù)制到從節(jié)點(diǎn),這種復(fù)制發(fā)生在主節(jié)點(diǎn)對(duì)其接收的任何命令生效之前。并且,當(dāng)主節(jié)點(diǎn)收到持久消息,會(huì)等待從節(jié)點(diǎn)完成消息的處理(通常是持久化到存儲(chǔ)),然后再自己完成消息的處理(如持久化到存儲(chǔ))后,再返回對(duì) Producer 的回執(zhí)。
從節(jié)點(diǎn)不啟動(dòng)任何傳輸,也不能接受任何客戶端或網(wǎng)絡(luò)連接,除非主節(jié)點(diǎn)失效。當(dāng)主節(jié)點(diǎn)失效后,從節(jié)點(diǎn)自動(dòng)成為主節(jié)點(diǎn),并且開(kāi)啟傳輸并接受連接。這是,使用 failover 傳輸?shù)目蛻舳司蜁?huì)連接到該新主節(jié)點(diǎn)。
Broker 連接配置如下:
| 1 | failover://(tcp://masterhost:61616,tcp://slavehost:61616)?randomize=false |
但是,這種部署模式有一些限制,
- 主節(jié)點(diǎn)只會(huì)在從節(jié)點(diǎn)連接到主節(jié)點(diǎn)時(shí)復(fù)制其活動(dòng)狀態(tài),因此當(dāng)從節(jié)點(diǎn)沒(méi)有連接上主節(jié)點(diǎn)之前,任何主節(jié)點(diǎn)處理的 Message 或者消息確認(rèn)都會(huì)在主節(jié)點(diǎn)失效后丟失。不過(guò)你可以通過(guò)在主節(jié)點(diǎn)設(shè)置 waitForSlave 來(lái)避免,這樣就強(qiáng)制主節(jié)點(diǎn)在沒(méi)有任何一個(gè)從節(jié)點(diǎn)連接上的情況下接受連接。
- 就是主節(jié)點(diǎn)只能有一個(gè)從節(jié)點(diǎn),并且從節(jié)點(diǎn)不允許再有其他從節(jié)點(diǎn)。
- 把正在運(yùn)行的單例配置成無(wú)共享主從,或者配置新的從節(jié)點(diǎn)時(shí),你都要停止當(dāng)前服務(wù),修改配置后再重啟才能生效。
在可以接受一些故障停機(jī)時(shí)間的情況下,可以使用該模式。
從節(jié)點(diǎn)配置:
| 123 | <services>????????<masterConnector remoteURI="tcp://remotehost:62001" userName="Rob" password="Davies"/></services> |
此外,可以配置 shutdownOnMasterFailure 項(xiàng),表示主節(jié)點(diǎn)失效后安全關(guān)閉,保證沒(méi)有消息丟失,允許管理員維護(hù)一個(gè)新的從節(jié)點(diǎn)。
3.共享存儲(chǔ)主從模式
允許多個(gè)代理共享存儲(chǔ),但任意時(shí)刻只有一個(gè)是活動(dòng)的。這種情況下,當(dāng)主節(jié)點(diǎn)失效時(shí),無(wú)需人工干預(yù)來(lái)維護(hù)應(yīng)用的完整性。另外一個(gè)好處就是沒(méi)有從節(jié)點(diǎn)數(shù)的限制。
有兩種細(xì)分模式:
(1)基于數(shù)據(jù)庫(kù)
它會(huì)獲取一個(gè)表上的排它鎖,以確保沒(méi)有其他 ActiveMQ 代理可以同時(shí)訪問(wèn)數(shù)據(jù)庫(kù)。其他未獲得鎖的代理則處于輪詢狀態(tài),就會(huì)被當(dāng)做是從節(jié)點(diǎn),不會(huì)開(kāi)啟傳輸也不會(huì)接受連接。
(2)基于文件系統(tǒng)
需要獲取分布式共享文件鎖,linux 系統(tǒng)下推薦用 GFS2。? ? ? ? ? ??
看到這些干貨,成小胖欣喜若狂一邊聽(tīng)一邊記,等老王講完后他還沒(méi)記完。而老王則趁機(jī)喝了杯鐵觀音潤(rùn)潤(rùn)嗓子。
在記錄完老王所講的部署模式后,成小胖也不好意思再讓老王繼續(xù)講下去了,畢竟他知道老王常年加班腰間盤突出,不能長(zhǎng)時(shí)間站著。
“王哥您坐著休息下,我再給您講講我所理解的 ActiveMQ 的網(wǎng)絡(luò)連接,中不中?”
“中。沒(méi)事兒,我身體好著呢~”老王知道成小胖擔(dān)心他的腰,但他還是那個(gè)倔脾氣。成小胖也不敢多耽誤時(shí)間,立馬開(kāi)講。
1.代理網(wǎng)絡(luò)
支持將 ActiveMQ 消息代理鏈接到不同拓?fù)?#xff0c;這就是被人們熟知的代理網(wǎng)絡(luò)。
ActiveMQ 網(wǎng)絡(luò)使用存儲(chǔ)和轉(zhuǎn)發(fā)的概念,其中消息總是存儲(chǔ)在本地代理中,然后通過(guò)網(wǎng)絡(luò)轉(zhuǎn)發(fā)到另一個(gè)代理。? ? ? ? ? ??
當(dāng)連接建立后,遠(yuǎn)程代理將把包含其所有持久和活動(dòng)消費(fèi)者目的地的信息傳遞給本地代理,本地代理根據(jù)信息決定遠(yuǎn)程代理感興趣的 Message 并將它發(fā)送給遠(yuǎn)程代理。
如果希望網(wǎng)絡(luò)是雙向的,您可以使用網(wǎng)絡(luò)連接器將遠(yuǎn)程代理配置為指向本地代理,或?qū)⒕W(wǎng)絡(luò)連接器配置為雙工,以便雙向發(fā)送消息。
| 12345678 | <networkConnectors>????????<networkConnector uri="static://(tcp://backoffice:61617)"??????????????????????????????name="bridge"??????????????????????????????duplex="true"??????????????????????????????conduitSubscriptions="true"??????????????????????????????decreaseNetworkConsumerPriority="false">????????</networkConnector></networkConnectors> |
注意,配置的順序很重要:
1.網(wǎng)絡(luò)連接——需要在消息存儲(chǔ)前建立好連接,對(duì)應(yīng) networkConnectors 元素
2.消息存儲(chǔ)——需要在傳輸前配置好,對(duì)應(yīng) persistenceAdapter 元素
3.消息傳輸——最后配置,對(duì)應(yīng) transportConnectors 元素
2.網(wǎng)絡(luò)發(fā)現(xiàn)
(1)動(dòng)態(tài)發(fā)現(xiàn)
使用多播來(lái)支持網(wǎng)絡(luò)動(dòng)態(tài)發(fā)現(xiàn)。配置如下:
| 123 | <networkConnectors> <networkConnector uri="multicast://default"/></networkConnectors> |
其中,multicast:// 中的默認(rèn)名稱表示該代理所屬的組。因此使用此方式時(shí),強(qiáng)烈推薦你使用一個(gè)獨(dú)特的組名,避免你的代理連接到其他不相關(guān)代理。
(2)靜態(tài)發(fā)現(xiàn)
靜態(tài)發(fā)現(xiàn)接受代理 URI 列表,并將嘗試按列表中確定的順序連接到遠(yuǎn)程代理。
| 123 | <networkConnectors> <networkConnector uri="static:(tcp://remote-master:61617,tcp://remote-slave:61617)"/></networkConnectors> |
相關(guān)配置如下:
- initialReconnectDelay:默認(rèn)值1000,表示嘗試連接前的時(shí)延。
- maxReconnectDelay:默認(rèn)值30000,表示連接失敗后到重新建立連接之間的時(shí)延,僅在 useExponentialBackOff 啟用時(shí)生效。
- useExponentialBackOff:默認(rèn)值 true,如果啟用,表示每次失敗后增加重建連接的時(shí)延。
- backOffMultiplier:默認(rèn)值2,表示啟用 useExponentialBackOff 后每次的時(shí)延增量需要注意的是,網(wǎng)絡(luò)連接將始終嘗試建立到遠(yuǎn)程代理的連接。
需要注意的是,網(wǎng)絡(luò)連接將始終嘗試建立到遠(yuǎn)程代理的連接。
(3)多連接場(chǎng)景? ? ? ? ? ?
當(dāng)網(wǎng)絡(luò)負(fù)載高時(shí),使用多連接很有意義。但是你需要確保不會(huì)重復(fù)傳遞消息,這可以通過(guò)過(guò)濾器來(lái)實(shí)現(xiàn)。
| 12345678910111213141516 | <networkConnectors> <networkConnector uri="static://(tcp://remotehost:61617)"??????????????????????????????name="queues_only"??????????????????????????????duplex="true" <excludedDestinations> <topic physicalName=">"/> </excludedDestinations> </networkConnector> <networkConnector uri="static://(tcp://remotehost:61617)"??????????????????????????????name="topics_only"??????????????????????????????duplex="true" <excludedDestinations> <queue physicalName=">"/> </excludedDestinations> </networkConnector></networkConnectors> |
講完后成小胖如釋重負(fù),因?yàn)樯厦孢@些知識(shí)點(diǎn)雖然看起來(lái)很少,但他卻花了很多時(shí)間看了很多英文資料,同時(shí)反復(fù)實(shí)踐才理解透的呢。
在成小胖講的這段時(shí)間,老王一直坐在轉(zhuǎn)椅上,這會(huì)兒他的腰也舒服了很多。老王站起來(lái)拍了拍成小胖的肩膀:“這個(gè)知識(shí)點(diǎn)雖然理解起來(lái)有點(diǎn)晦澀,但是你解釋得還是挺不錯(cuò)的。通過(guò)今天的交流,可以看出你對(duì) ActiveMQ 的基礎(chǔ)知識(shí)有了不錯(cuò)的掌握,今后呢還是要多加深入實(shí)踐,這樣才能使用它提供高質(zhì)量的服務(wù)?!?/p>
老王的手機(jī)突然響了,是要去開(kāi)會(huì)了:“今天就到這兒吧,我有個(gè)會(huì)議要參加?!?/p>
“好,謝謝王哥的耐心指導(dǎo)。希望你多注意身體?!?/p>
老王鬼魅的一笑:“嗯,放心吧,隔壁有對(duì)年輕人剛結(jié)婚,聽(tīng)Ta們說(shuō)最近想要個(gè)小baby,所以我肯定會(huì)保養(yǎng)好自己的身體的?!?/p>
成小胖:“……”
“哈哈,開(kāi)玩笑的!”
“……”
相關(guān)文章
發(fā)表評(píng)論
Name*郵箱*網(wǎng)站 (請(qǐng)以 http://開(kāi)頭)(*) 表示必填項(xiàng)
提交評(píng)論3 條評(píng)論
有點(diǎn)像小說(shuō),哈哈哈哈哈
?0??0
回復(fù)像是在講故事,過(guò)程很不錯(cuò)
?2??0
回復(fù)感覺(jué)是來(lái)搞笑的
?0??3
回復(fù)0如何定位那些SQL產(chǎn)生了大量的redo...
1使用FastBootWeixin框架快速開(kāi)發(fā)...
2跨平臺(tái)長(zhǎng)連接組件設(shè)計(jì)及可插拔改造
3MyBatis 解析 XML 標(biāo)簽及占...
4一次非典型性 Redis 阻塞總結(jié)
5談?wù)?JDK8 中的字符串拼接
6基于Multiple treatment的營(yíng)銷評(píng)估...
7Java日志框架:slf4j作用及其實(shí)現(xiàn)原...
8基于接口設(shè)計(jì)與編程
9從 Spring Cloud 看一個(gè)微服務(wù)...
0Transaction 在 Controller 層...
1JDK 10 的 109 項(xiàng)新特性
2在 Java 8 中避免 Null 檢查
3Java 8 和 Java 9 中并發(fā)工具...
4通向架構(gòu)師的道路(第二十二天)萬(wàn)能框架spri...
5MySQL分頁(yè)優(yōu)化中的“INNER...
6Java 虛擬機(jī) 6:內(nèi)存溢出和內(nèi)存泄露、并行和并發(fā)、...
7如何定位那些SQL產(chǎn)生了大量的redo...
820 個(gè)使用 Java CompletableFutu...
9Spring AOP 的實(shí)現(xiàn)機(jī)制
android23days?Android開(kāi)發(fā)?AOP?APIArrayList?ConcurrentHashMap?Eclipse?GCGuava?Hadoop?HashMap?HashSet?HBaseHibernate?IntelliJ?io?Java?java8?java 8Java9?Java NIO?Java編程入門?JDBC?JDK?JMXJPA?Jsoup?JUnit?JVM?Lambda?log4j?mavenMybatis?mysql?Netty?nio?oracle?ORM?redisRESTful?Scala?Servlet?Socket?solr?Springspringboot?spring boot?Spring MVCSpringMVC?Spring Security?SSH?Stringsynchronized?TestNG?ThreadLocal?Tomcatvolatile?Web Service?Zookeeper?事務(wù)?內(nèi)存管理分布式?動(dòng)態(tài)代理?單元測(cè)試?反射?垃圾回收?基礎(chǔ)技術(shù)?多線程?字符串?字節(jié)碼?并發(fā)?并發(fā)編程序列化?異常?異常處理?性能?性能優(yōu)化?性能調(diào)優(yōu)?教程?數(shù)據(jù)結(jié)構(gòu)?日志?架構(gòu)?架構(gòu)師?死鎖?泛型?注解?測(cè)試?游戲?源碼分析?算法?線程?線程池?緩存?自動(dòng)化測(cè)試?虛擬機(jī)?設(shè)計(jì)模式?資訊?集合?面試?面試題
最新評(píng)論
- Re:?Java垃圾回收機(jī)制Hi,請(qǐng)到伯樂(lè)在線的小組發(fā)帖提問(wèn),支持微信登錄。鏈接是: http://group.jobbole....唐尤華
- Re:?Java垃圾回收機(jī)制String str = new String(\"hello\");SoftReference sr ...qiaolin
- Re:?Java垃圾回收機(jī)制Object aobj = new Object ( ) ;Object bobj = new Ob...qiaolin
- Re:?Transaction 在 Controller...受教了,感謝分享馬俊
- Re:?如何定位那些SQL產(chǎn)生了大量的re...受教了,加油!www.wuliaokankan.cn
- Re:?Java8系列之重新認(rèn)識(shí)HashMap是我發(fā)錯(cuò)了哈...才發(fā)現(xiàn)屈定
- Re:?在 Java 8 中避免 Null ...沒(méi)有if判斷簡(jiǎn)單直觀www.wuliaokankan.cn
- Re:?JDK 10 的 109 項(xiàng)新特性我還在用8www.wuliaokankan.cn
總結(jié)
以上是生活随笔為你收集整理的ActiveMQ相关存储介绍的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: ActiveMQ相关概念
- 下一篇: ActiveMQ部署模式