ActiveMQ专题
生活随笔
收集整理的這篇文章主要介紹了
ActiveMQ专题
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
1. ActiveMQ服務器宕機怎么辦?1.這得從ActiveMQ的儲存機制說起。在通常的情況下,非持久化消息是存儲在內存中的,持久化消息是存儲在
文件中的,它們的最大限制在配置文件的<systemUsage>節點中配置。2.但是,在非持久化消息堆積到一定程度,內存告急的時候,ActiveMQ會將內存中的非持久化消息寫入臨時
文件中,以騰出內存。3.雖然都保存到了文件里,但它和持久化消息的區別是,重啟后持久化消息會從文件中恢復,非持久化的臨時
文件會直接刪除。4.設置2G左右的持久化文件限制,大量生產持久化消息直到文件達到最大限制,此時生產者阻塞,但消費者可
正常連接并消費消息,等消息消費掉一部分,文件刪除又騰出空間之后,生產者又可繼續發送消息,服務自動
恢復正常。5.設置2G左右的臨時文件限制,大量生產非持久化消息并寫入臨時文件,在達到最大限制時,生產者阻塞,
消費者可正常連接但不能消費消息,或者原本慢速消費的消費者,消費突然停止。整個系統可連接,但是無法
提供服務,就這樣掛了。解決方案:盡量不要用非持久化消息,非要用的話,將臨時文件限制盡可能的調大。2. 丟消息怎么辦?用持久化消息,或者非持久化消息及時處理不要堆積,或者啟動事務,啟動事務后,commit()方法會負責任的
等待服務器的返回,也就不會關閉連接導致消息丟失了。3. 持久化消息非常慢。默認的情況下,非持久化的消息是異步發送的,持久化的消息是同步發送的,遇到慢一點的硬盤,發送消息的
速度是無法忍受的。但是在開啟事務的情況下,消息都是異步發送的,效率會有2個數量級的提升。所以在發送
持久化消息時,請務必開啟事務模式。其實發送非持久化消息時也建議開啟事務,因為根本不會影響性能。4. 消息的不均勻消費。解決方案:將prefetch設為1,每次處理1條消息,處理完再去取,這樣也慢不了多少。6. ActiveMQ中的消息重發時間間隔和重發次數嗎?1.ActiveMQ:是Apache出品,最流行的,能力強勁的開源消息總線。2.是一個完全支持JMS1.1和J2EE 1.4規范的 JMS Provider實現。
ActiveMQ
1.什么是activemqactiveMQ是一種開源的,實現了JMS1.1規范的,面向消息(MOM)的中間件,為應用程序提供高效的、 可擴展的、穩定的和安全的企業級消息通信。2.activemq的作用以及原理Activemq 的作用就是系統之間進行通信。 如果使用 Activemq 的話可以對系統之間的調用進行解耦, 實現系統間的異步通信。原理就是生產者生產消息, 把消息發送給activemq。Activemq 接收到消息, 然后查看有多少個消費者, 然后把消息轉發給消費者, 此過程中生產者無需參與。3.activemq的幾種通信方式3.1 publish(發布)-subscribe(訂閱)(發布-訂閱方式)發布/訂閱方式用于多接收客戶端的方式.作為發布訂閱的方式,可能存在多個接收客戶端,并且接收端客戶端 與發送客戶端存在時間上的依賴。一個接收端只能接收他創建以后發送客戶端發送的信息。作為subscriber ,在接收消息時有 兩種方法,destination的receive方法,和實現message listener 接口的onMessage 方法3.2 p2p(point-to-point)(點對點)p2p的過程則理解起來比較簡單。它好比是兩個人打電話,這兩個人是獨享這一條通信鏈路的。 一方發送消息,另外一方接收,就這么簡單。相互通信的雙方是通過一個類似于隊列的方式來進行交流。和前面pub-sub的區別在于一個topic有一個發送者和多個接收者,而在p2p里一個queue只有一個發送者和 一個接收者。1.publish(發布)-subscribe(訂閱)方式的處理發布訂閱模式的通信方式, 默認情況下只通知一次, 如果接收不到此消息就沒有了。這種場景只適用于對消息送達率要求不高的情況。 如果要求消息必須送達不可以丟失的話, 需要配置 持久訂閱。2. p - p(點對點)方式的處理點對點模式的話, 如果消息發送不成功此消息默認會保存到 activemq 服務端直到有消費者將其消費, 所以此時消息是不會丟失的。5.如何解決消息重復問題所謂消息重復,就是消費者接收到了重復的消息,一般來說我們對于這個問題的處理要把握下面幾點,①.消息不丟失(上面已經處理了)②.消息不重復執行一般來說我們可以在業務段加一張表,用來存放消息是否執行成功,每次業務事物commit之后,告知服務端, 已經處理過該消息,這樣即使你消息重發了,也不會導致重復處理大致流程如下:業務端的表記錄已經處理消息的id,每次一個消息進來之前先判斷該消息是否執行過,如果執行過就放棄, 如果沒有執行就開始執行消息,消息執行完成之后存入這個消息的idactiveMQ總結
1. 大量的消息每頁被消費,能否發生oom異常?1. 可以控制每個消息隊列中數據的大小,不允許無線填充數據,避免該隊列多大,導致過度消耗系統資源 問題; 可以控制隊列的內存大小;2. activeMQ數據丟失怎么辦?可以使用對數據進行持久化JDBC,AMQ(日志文件),KahaDB和LevelDB,ActiveMQ的消息持久化機制有JDBC,AMQ(日志文件),KahaDB和LevelDBKahaDB是從ActiveMQ 5.4開始默認的持久化插件從ActiveMQ 5.6版本之后,又推出了LevelDB的持久化引擎。目前默認的持久化方式仍然是KahaDB, 不過LevelDB持久化性能高于KahaDB,可能是以后的趨勢。在ActiveMQ 5.9版本提供了基于LevelDB和Zookeeper的數據復制方式,用于Master-slave方式的首選數據 復制方案。方式一:利用mysql持久化activeMQ數據 1)改動部分主要是設置了mysql的datasource聲明, 還有就是采用mysql作為persistenceAdapter, 并聲明如下;<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:3306/activemq ?relaxAutoCommit=true"/> <property name="username" value="root"/> <property name="password" value=""/> <property name="maxActive" value="200"/> <property<strong> </strong>name="poolPreparedStatements" value="true"/> </bean><persistenceAdapter> <jdbcPersistenceAdapter dataSource="#mysql-ds"/> </persistenceAdapter>2)把數據庫的驅動放入ActiveMQ的lib中,使其能夠訪問相應的數據庫,關于數據庫的表結構,ActiveMQ會 自動創建,但是前提是當ActiveMQ啟動以后,聲明的數據庫要是存在的。測試的時候發現以上條件都滿足ActiveMQ還是會拋異常,看了一下異常,是有一張表(activemq_acks) 創建的時候出了問題,自己手動創建后好了,把表結構列出來。3)當消息發送至ActiveMQ時,數據就被持久化到mysql了,如果消息被消費,數據會自動被刪除,down機后 重啟沒影響,有一點不好的是,這個有點拖數據庫,我在本地的mysql,一開啟ActiveMQ, 數據庫就會變得 很慢,不過這個只是在本地的機子上,想必實際應用時應該好很多。4. queue 與 topic 區別 1、點對點(point-to-point,簡稱PTP)Queue消息傳遞模型:在該消息傳遞模型下,一個消息生產者向消息服務器端一個特定的隊列發送消息,一個消費者從該隊列中 讀取消息。這種模型的特點為:能夠保證數據安全;2、發布/訂閱(publish/subscribe,簡稱pub/sub)Topic消息傳遞模型:在該消息傳遞模型下,一個消息發布者向一個特定的消息主題發布消息,0或多個對此消息主題感興趣的 并且處于活動狀態的消息訂閱者或者建立了持久訂閱的消息訂閱者才可以接收到所發布的消息。5. RocketMQ特點:作為一款分布式消息引擎,RocketMQ有如下特性: 低延遲、高并發:99.6%以上的響應延遲在1毫秒以內 面向金融:滿足跟蹤和審計的高可用性 工業級適用:可確保萬億量級的消息發送 中立性:支持多種消息傳遞協議,如JMS和OpenMessaging 性能可靠:給予足夠的磁盤空間,消息可以累積存放而沒有性能損失。6. activeMQ發送消息的方式有哪些?activeMQ如何調優有兩種簡單方式:1. 使用非持久化消息;2. 需要確保消息發送成功時使用事務來將消息分批組合.public void sendTransacted() throws JMSException {??ActiveMQConnectionFactory cf = new ActiveMQConnectionFactory();??Connection connection = cf.createConnection();??connection.start();??Session session = connection.createSession(true, Session.SESSION_TRANSACTED);??Topic topic = session.createTopic("Test.Transactions");??MessageProducer producer = session.createProducer(topic);??int count = 0;??for (int i = 0; i < 1000; i++) {??Message message = session.createTextMessage("message " + i);??producer.send(message);??if (i != 0 && i % 10 == 0) {??session.commit();??}??}??}??public void sendNonTransacted() throws JMSException {??ActiveMQConnectionFactory cf = new ActiveMQConnectionFactory();??Connection connection = cf.createConnection();??connection.start();??// create a default session (no transactions)??Session session = connection.createSession(false, Session.AUTO_ACKNOWELDGE);??Topic topic = session.createTopic("Test.Transactions");??MessageProducer producer = session.createProducer(topic);??int count = 0;??for (int i = 0; i < 1000; i++) {??Message message = session.createTextMessage("message " + i);??producer.send(message);??}??}??8. activeMQ端口號端口號:616169. jsm的同步與異步消息通信的基本方式有兩種:1、同步方式兩個通信應用服務之間必須要進行同步,兩個服務之間必須都是正常運行的。發送程序和接收程序都必須一直 處于運行狀態,并且隨時做好相互通信的準備。發送程序首先向接收程序發起一個請求,稱之為發送消息,發送程序緊接著就會堵塞當前自身的進程,不與 其他應用進行任何的通信以及交互,等待接收程序的響應,待發送消息得到接收程序的返回消息之后會繼續 向下運行,進行下一步的業務處理。2、異步方式兩個通信應用之間可以不用同時在線等待,任何一方只需各自處理自己的業務也就是說發送方和接收方都是相互獨立存在的,發送方只管方,接收方只能接收,無須去等待對方的響應。Java中JMS就是典型的異步消息處理機制,JMS消息有兩種類型:點對點、發布/訂閱。ActiveMQ基本詳解與總結
MQ簡介:MQ全稱為Message Queue, 消息隊列(MQ)是一種應用程序對應用程序的通信方法。消息傳遞指的是程序之間通過在消息中發送數據進行通信,而不是通過直接調用彼此來通信,直接調用通常是 用于諸如遠程過程調用的技術。排隊指的是應用程序通過隊列來通信。MQ特點:MQ的消費-生產者模型的一個典型的代表,一端往消息隊列中不斷的寫入消息,而另一端則可以讀取或者訂閱 隊列中的消息。MQ和JMS類似,但不同的是JMS是SUN JAVA消息中間件服務的一個標準和API定義,而MQ則是遵循了AMQP協議的 具體實現和產品。使用場景:在項目中,將一些無需即時返回且耗時的操作提取出來,進行了異步處理,而這種異步處理的方式大大的節省了 服務器的請求響應時間,從而提高了系統的吞吐量。JMS簡介:JMS即Java消息服務(Java Message Service)應用程序接口是一個Java平臺中關于面向消息中間件(MOM) 的API,用于在兩個應用程序之間,或分布式系統中發送消息,進行異步通信。Java消息服務是一個與具體平臺無關的API,絕大多數MOM提供商都對JMS提供支持。定義:JMS(Java Messaging Service)是Java平臺上有關面向消息中間件(MOM)的技術規范,它便于消息系統中 的Java應用程序進行消息交換,并且通過提供標準的產生、發送、接收消息的接口簡化企業應用的開發,翻譯 為Java消息服務。簡介:JMS是一種與廠商無關的 API,用來訪問消息收發系統消息。它類似于JDBC(Java DatabaseConnectivity):JDBC 是可以用來訪問許多不同關系數據庫的 API,而 JMS 則提供同樣與廠商無關的訪問方法,以訪問消息 收發服務。JMS 使您能夠通過消息收發服務(有時稱為消息中介程序或路由器)從一個 JMS 客戶機向另一個JMS 客戶機發送消息。消息是 JMS 中的一種類型對象,由兩部分組成:報頭和消息主體。報頭由路由信息以及有關該消息的元數據組成。消息主體則攜帶著應用程序的數據或有效負載。根據有效負載的類型來劃分,可以將消息分為幾種類型,它們分別攜帶:簡單文本(TextMessage)、 可序列化的對象 (ObjectMessage)、屬性集合 (MapMessage)、字節流 (BytesMessage)、 原始值流 (StreamMessage),還有無有效負載的消息 (Message)。JMS和MQ的關系:JMS是一個用于提供消息服務的技術規范,它制定了在整個消息服務提供過程中的所有數據結構和交互流程。而MQ則是消息隊列服務,是面向消息中間件(MOM)的最終實現,是真正的服務提供者;MQ的實現可以 基于JMS,也可以基于其他規范或標準。支持JMS的開源MQ:目前選擇的最多的是ActiveMQ。ActiveMQ 是Apache出品,最流行的,能力強勁的開源消息總線。ActiveMQ 是一個完全支持JMS1.1和 J2EE 1.4規范的 JMS Provider實現,盡管JMS規范出臺已經是很久的事情了,但是JMS在當今的J2EE應用 中間仍然扮演著特殊的地位。主要特點:1. 多種語言和協議編寫客戶端。語言: Java, C, C++, C#, Ruby, Perl, Python, PHP。 應用協議: OpenWire,Stomp REST,WSNotification,XMPP,AMQP2. 完全支持JMS1.1和J2EE 1.4規范 (持久化,XA消息,事務)3. 對Spring的支持,ActiveMQ可以很容易內嵌到使用Spring的系統里面去,而且也支持Spring2.0的特性4. 通過了常見J2EE服務器的配置,可以讓ActiveMQ可以自動的部署到任何兼容J2EE 1.4 商業服務器上5. 支持多種傳送協議:in-VM,TCP,SSL,NIO,UDP,JGroups,JXTA6. 支持通過JDBC和journal提供高速的消息持久化優點:消息異步接受,減少軟件多系統集成的耦合度。消息可靠接收,確保消息在中間件可靠保存,多個消息也可以 組成原子事務。缺點:ActiveMQ默認的配置性能偏低,需要優化配置,但是配置文件復雜,ActiveMQ本身不提供管理工具; 示例代碼少;ActiveMQ應用場景:1、 不同語言應用集成ActiveMQ 中間件用Java語言編寫,因此自然提供Java客戶端 API。但是ActiveMQ 也為C/C++、 .NET、Perl、PHP、Python、Ruby 和一些其它語言提供客戶端。在你考慮如何集成不同平臺不同語言編寫 應用的時候,ActiveMQ 擁有巨大優勢。2、 作為RPC的替代使用RPC同步調用的應用十分普遍。假設大多數客戶端服務器應用使用RPC,包括ATM、大多數WEB應用、 信用卡系統、銷售點系統等等。使用同步請求的系統在規模上有較大的限制,因為請求會被阻塞,從而導致整個系統變慢。如果使用異步消息 替代,可以很容易增加額外的消息接收者,使得消息能被并發消耗,從而加快請求處理。當然,你的系統應用 間應該是解耦的。3、 應用之間解耦松耦合架構,在另一方面,證實了更少的依賴性,能夠更好地處理不可預見的改變。不僅可以在系統中改變 組件而不影響整個系統,而且組件交互也相當的簡單。4、 作為事件驅動架構的主干當用戶下單是,有一個同步的體積表單動作,但整個處理流程并不通過瀏覽器同步處理。相反地,訂單馬上被 接受和反饋。而剩下的步驟就通過異步處理。如果在處理過程中出錯,用戶會通過郵件收到通知。這樣的異步 處理能提供高負載和高可用性。5、 提高系統擴展性很多使用事件驅動設計的系統是為了獲得高可擴展性,例如電子商務,政府,制造業,線上游戲等。通過異步 消息分開商業處理步驟給各個應用,能夠帶來很多可能性。考慮設計一個應用來完成一項特殊的任務。這就是 面向服務的架構(service-oriented architecture SOA)。每一個服務完成一個功能并且只有一個功能。activeMQ是什么?是Apache公司旗下的一個消息總線ActiveMQ是一個開源兼容Java Message Service (JMS) 1.1面向消息的中件間. 來自Apache Software Foundation. ActiveMQ提供松耦合的應用程序架構.activeMQ能干什么?用來在服務與服務之間進行異步通信的activeMQ優勢1.流量削峰2.任務異步處理特點:可以解耦合通信模式:1.點對點(queue)一個消息只能被一個服務接收消息一旦被消費,就會消失如果沒有被消費,就會一直等待,直到被消費多個服務監聽同一個消費空間,先到先得2.發布/訂閱模式(topic)一個消息可以被多個服務接收訂閱一個主題的消費者,只能消費自它訂閱之后發布的消息。消費端如果在生產端發送消息之后啟動,是接收不到消息的,除非生產端對消息進行了持久化(例如廣播, 只有當時聽到的人能聽到信息)注:消息是被推送和拉取的(消息生產端和消費端),不是mq服務器去主動發送的1.發送郵件最經典的就是當用戶注冊時,我們就需要用activeMQ來做為中間件,當用戶注冊后,我門把用戶的郵箱號和 驗證碼等信息通過activeMQ的生產端發送到activeMQ的消息隊列中,而一旦消息隊列中出現了數據,我們的 郵件模塊通過實時的監控activeMQ的消息隊列就能通過消費端獲取到這個數據,染回郵件模塊就會自行的去 對數據進行解析,給用戶發送郵件?
總結
以上是生活随笔為你收集整理的ActiveMQ专题的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Docker 常见问题汇总
- 下一篇: 对于Dubbo一些自己的答案