• <nav id="wkkge"><strong id="wkkge"></strong></nav>
  • <menu id="wkkge"></menu>
  • 第一部分 Java基礎
    第二部分 Java進階

    Java ActiveMQ面試題

     

     

    1、如何使用ActiveMQ解決分布式事務?

     

    在互聯網應用中,基本都會有用戶注冊的功能。在注冊的同時,我們會做出如下操作:

     

    ● 收集用戶錄入信息,保存到數據庫

     

    ● 向用戶的手機或郵箱發送驗證碼

     

    如果是傳統的集中式架構,實現這個功能非常簡單:開啟一個本地事務,往本地數據庫中插入一條用戶數據,發送驗證碼,提交事物。但是在分布式架構中,用戶和發送驗證碼是兩個獨立的服務,它們都有各自的數據庫,那么就不能通過本地事物保證操作的原子性。這時我們就需要用到ActiveMQ(消息隊列)來為我們實現這個需求。在用戶進行注冊操作的時候,我們為該操作創建一條消息,當用戶信息保存成功時,把這條消息發送到消息隊列。驗證碼系統會監聽消息,一旦接受到消息,就會給該用戶發送驗證碼。

     

     

    2、如何防止消息重復發送?

     

    解決方法很簡單:增加消息狀態表。通俗來說就是一個賬本,用來記錄消息的處理狀態,每次處理消息之前,都去狀態表中查詢一次。如果已經有相同的消息存在,那么不處理,可以防止重復發送。

     

     

    3、了解哪些消息隊列?

     

    ActiveMQ、RabbitMQ、kafka。

     

    RabbitMQ是使用Erlang編寫的一個開源的消息隊列,本身支持很多的協議:AMQP,XMPP,SMTP,STOMP,也正因如此,它非常重量級,更適合于企業級的開發。同時實現了Broker構架,這意味著消息在發送給客戶端時先在中心隊列排隊。對路由,負載均衡或者數據持久化都有很好的支持。

     

    ActiveMQ是Apache下的一個子項目。類似于ZeroMQ,它能夠以代理人和點對點的技術實現隊列。同時類似于RabbitMQ,它少量代碼就可以高效地實現高級應用場景。

     

    Kafka是Apache下的一個子項目,是一個高性能跨語言分布式發布/訂閱消息隊列系統,而Jafka是在Kafka之上孵化而來的,即Kafka的一個升級版。具有以下特性:快速持久化,可以在O(1)的系統開銷下進行消息持久化;高吞吐,在一臺普通的服務器上既可以達到10W/s的吞吐速率;完全的分布式系統,Broker、Producer、Consumer都原生自動支持分布式,自動實現負載均衡;支持Hadoop數據并行加載,對于像Hadoop的一樣的日志數據和離線分析系統,但又要求實時處理的限制,這是一個可行的解決方案。Kafka通過Hadoop的并行加載機制統一了在線和離線的消息處理。Apache Kafka相對于ActiveMQ是一個非常輕量級的消息系統,除了性能非常好之外,還是一個工作良好的分布式系統。

     

    ● MQ選型對比圖

     

     

     

    4、ActiveMQ如果消息發送失敗怎么辦?

     

    Activemq有兩種通信方式,點到點形式和發布訂閱模式。

     

    如果是點到點模式的話,如果消息發送不成功,此消息默認會保存到activemq服務端知道有消費者將其消費,所以此時消息是不會丟失的。

     

    如果是發布訂閱模式的通信方式,默認情況下只通知一次,如果接收不到此消息就沒有了。這種場景只適用于對消息送達率要求不高的情況。如果要求消息必須送達不可以丟失的話,需要配置持久訂閱。每個訂閱端定義一個id,在訂閱是向activemq注冊。發布消息和接收消息時需要配置發送模式為持久化。此時如果客戶端接收不到消息,消息會持久化到服務端,直到客戶端正常接收后為止。

     

    全部教程
  • <nav id="wkkge"><strong id="wkkge"></strong></nav>
  • <menu id="wkkge"></menu>
  • 面对面棋牌游戏