1. 程式人生 > >activeMQ面試總結

activeMQ面試總結


1. 大量的訊息每頁被消費,能否發生oom異常?
1. 可以控制每個訊息佇列中資料的大小,不允許無線填充資料,避免該佇列多大,導致過度消耗系統資源問題; 可以控制佇列的記憶體大小;


2. activeMQ資料丟失怎麼辦?

可以使用對資料進行持久化JDBC,AMQ(日誌檔案),KahaDB和LevelDB,




3. activeMQ如何持久化資料?
*** 準確答案:http://www.360doc.com/content/11/1027/19/1542811_159664188.shtml
            本文只介紹三種方式,分別是持久化為檔案,MYSql,Oracle。


***很準確的答案:https://www.jianshu.com/p/deb1816271d1
以mysql為例子,說明如何持久化,並解釋了3張表機構;


 
**** 更準確的答案:https://www.jianshu.com/p/43cd33dc96af

        提到了多種持久化方案的優缺點;

ActiveMQ的訊息持久化機制有JDBC,AMQ(日誌檔案),KahaDB和LevelDB
KahaDB是從ActiveMQ 5.4開始預設的持久化外掛
從ActiveMQ 5.6版本之後,又推出了LevelDB的持久化引擎。目前預設的持久化方式仍然是KahaDB,不過LevelDB持久化效能高於KahaDB,可能是以後的趨勢。
在ActiveMQ 5.9版本提供了基於LevelDB和Zookeeper的資料複製方式,用於Master-slave方式的首選資料複製方案。


 

*其他參考: http://www.360doc.com/content/11/1027/19/1542811_159664912.shtml

利用訊息佇列的非同步策略,可以從很大程式上緩解程式的壓力,但是,如果MQ所在的機器down機了,又如果佇列中的資料不是持久的就會發生資料丟失,後果是可想而知的, 所以訊息的持久化是不可不討論的話題。



方式一:利用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 區別 

    參考: https://blog.csdn.net/gaohuanjie/article/details/42197703

      1、點對點(point-to-point,簡稱PTPQueue訊息傳遞模型:

        在該訊息傳遞模型下,一個訊息生產者向訊息伺服器端一個特定的佇列傳送訊息,一個消費者從該佇列中讀取訊息。在這種模型下,訊息生產者知道訊息消費者的佇列並直接將訊息傳送到訊息消費者的佇列。這種模型的特點為:

        能夠保證資料安全;

    2、釋出/訂閱(publish/subscribe,簡稱pub/subTopic訊息傳遞模型:

        在該訊息傳遞模型下,一個訊息釋出者向一個特定的訊息主題釋出訊息,0或多個對此訊息主題感興趣的並且處於活動狀態的訊息訂閱者或者建立了持久訂閱的訊息訂閱者才可以接收到所釋出的訊息。

       資料容易丟失;

5. RocketMQ特點:
作為一款分散式訊息引擎,RocketMQ有如下特性:
低延遲、高併發:99.6%以上的響應延遲在1毫秒以內
面向金融:滿足跟蹤和審計的高可用性
工業級適用:可確保萬億量級的訊息傳送
中立性:支援多種訊息傳遞協議,如JMS和OpenMessaging
效能可靠:給予足夠的磁碟空間,訊息可以累積存放而沒有效能損失。
   

6. activeMQ傳送訊息的方式有哪些?

同步
非同步

參考一: https://blog.csdn.net/asdfsadfasdfsa/article/details/53583741
參考二: https://blog.csdn.net/QH_JAVA/article/details/61932295

訊息通訊的基本方式有兩種:
1、同步方式
兩個通訊應用服務之間必須要進行同步,兩個服務之間必須都是正常執行的。傳送程式和接收程式都必須一直處於執行狀態,並且隨時做好相互通訊的準備。
傳送程式首先向接收程式發起一個請求,稱之為傳送訊息,傳送程式緊接著就會堵塞當前自身的程序,不與其他應用進行任何的通訊以及互動,等待接收程式的響應,待發送訊息得到接收程式的返回訊息之後會繼續向下執行,進行下一步的業務處理。
2、非同步方式
兩個通訊應用之間可以不用同時線上等待,任何一方只需各自處理自己的業務,比如傳送方傳送訊息以後不用登入接收方的響應,可以接著處理其他的任務。也就是說傳送方和接收方都是相互獨立存在的,傳送方只管方,接收方只能接收,無須去等待對方的響應。
Java中JMS就是典型的非同步訊息處理機制,JMS訊息有兩種型別:點對點、釋出/訂閱。


7. 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);  
        }  
  
    }  


activeMQ系列內容: https://blog.csdn.net/u012758088/article/category/7179327

影響ActiveMQ效能的幾個重要因素 : http://setting.iteye.com/blog/989593

        **** ActiveMQ效能調優 http://zcf9916.iteye.com/blog/2356128


8. activeMQ埠號
埠號:61616


9. jsm的同步與非同步
訊息通訊的基本方式有兩種:
1、同步方式
兩個通訊應用服務之間必須要進行同步,兩個服務之間必須都是正常執行的。傳送程式和接收程式都必須一直處於執行狀態,並且隨時做好相互通訊的準備。
傳送程式首先向接收程式發起一個請求,稱之為傳送訊息,傳送程式緊接著就會堵塞當前自身的程序,不與其他應用進行任何的通訊以及互動,等待接收程式的響應,待發送訊息得到接收程式的返回訊息之後會繼續向下執行,進行下一步的業務處理。
2、非同步方式
兩個通訊應用之間可以不用同時線上等待,任何一方只需各自處理自己的業務,比如傳送方傳送訊息以後不用登入接收方的響應,可以接著處理其他的任務。也就是說傳送方和接收方都是相互獨立存在的,傳送方只管方,接收方只能接收,無須去等待對方的響應。
Java中JMS就是典型的非同步訊息處理機制,JMS訊息有兩種型別:點對點、釋出/訂閱。