1. 程式人生 > >java面試—訊息佇列ActiveMQ

java面試—訊息佇列ActiveMQ

1.如何使用ActiveMq解決分散式事物
    在應用中,都會有使用者註冊功能:收集使用者錄入資訊,儲存到資料庫—向用戶的手機或郵箱發驗證碼······
    在傳統集中式架構,實現功能:開啟一個本地事物,往本地資料庫中插入一條使用者資料,傳送驗證碼,提交事物。
    在分散式架構中,使用者和傳送驗證碼是兩個獨立的服務,他們都有各自的資料庫,那麼就不能通過本地事物保證操作的原子性,這時候我們需要用到mq來實現:在使用者進行註冊操作的時候,我們為該操作創造一條訊息,當用戶儲存成功時,把這條訊息傳送到訊息佇列,驗證碼系統會監聽訊息,一旦接受到訊息,就會給改使用者傳送驗證嗎。
    ##如何防止訊息重複傳送:增加訊息狀態表,通俗來說就是一個賬本,用來記錄訊息的處理狀態,每次處理訊息之前,都去狀態表中查詢一次,如果已經有相同的訊息存在,那麼不處理,可以防止重複傳送。
2.瞭解哪些訊息佇列
    ActiveMQ、RabbitMq、kafka
    RabbitMq:是Erlang編寫的一個開源的訊息佇列,本身支援很多的協議:AMQP,XMPP,SMTP,STOMP;適合企業開發,同時實現了broker架構,這就意味著訊息在傳送給客戶端時現在中心佇列排隊,對路由,負載均衡或者資料持久化都有很好的支援。
    ActiveMQ:是apache下的一個子專案。類似於zeromq,能以代理人和點對點的技術實現佇列。同時類似於RabbitMQ,少量的程式碼高效實現高階應用場景。
    Kafka/Jafka:apache下的一個子專案,一個高效能跨語言分散式釋出/訂閱訊息佇列系統,而jafka是在kafka上孵化來,kafka的一個升級版,具有:快速持久化,可以在O的系統開銷下進行訊息持久化;高吞吐;完全的分散式系統;支援Hadoop資料進行載入,
3.activeMq訊息傳送失敗:
    ActiveMQ有兩種通訊方式,點到點形式和釋出訂閱模式。
    如果是點到點模式的話,如果訊息傳送不成功,此訊息預設會儲存到activemq服務端知道有消費者將其消費,所以此訊息是不會丟失的。
    如果是釋出訂閱模式的通訊方式,預設情況只通知一次,如果接受不到此訊息就沒有了,這種場景使用於對訊息傳送率要求不高的情況,如果要求訊息必須送達不可以丟失的話,需要配置持久訂閱。每個訂閱端定義一個id,在訂閱是向activemq註冊,釋出訊息和接受訊息時需要配置傳送模式為持久化,此時如果客戶端接受不到訊息,訊息會持久化到服務端,直到客戶端正常接收後為止。