1. 程式人生 > >在工作過程中,對RabbitMQ的一些體會

在工作過程中,對RabbitMQ的一些體會

   先介紹下背景,這個是公司當前的專案雲管理,自動化部署的一個功能。需要通過伺服器批量下發命令到虛擬機器。每臺虛擬機器都裝有客戶端,可以接收RabbitMQ的訊息和向MQ傳送訊息。伺服器的主要功能也是從RabbitMQ傳送和接收訊息。工作流程是這樣的,通過伺服器,將命令下發到以主機Id(虛擬機器的唯一標識)命名的queue裡,虛擬機器客戶端從對應主機Id獲取訊息,執行完命令後將結果返回。伺服器獲取執行結果。

        安裝RabbitMQ,伺服器的作業系統是CentOS。在裝之前,先得裝Python和Erlang,裝的過程就不細講了,可以在網上搜。裝完之後,進入安裝目錄,安裝web外掛管理介面:rabbitmq-plugins enable rabbitmq_management。新增使用者rabbitmqctl  add_user  <Username>  <Password>。給使用者設定管理者許可權 :rabbitmqctl set_user_tags user administrator。新增新使用者,並設定完使用者許可權後,遠端通過這個使用者還是無法建立佇列,得用預設賬戶(guest,guest)登上去Web頁面之後,在名為Admin的Tab頁給新設定的使用者賦許可權(也可以用命令給其設定許可權)。可以在安裝目錄用rabbitmqctl -h檢視命令詳細資訊。RabbitMQ還提供了一個工具rabbitmqadmin,可以在你web頁面的訪問路徑http://server-name:15672/cli/下載rabbitmqadmin.txt,將字尾去掉,就可以用了。由於在本地命令用的少,也沒有多去了解。之前在網上看到一個刪除全部佇列的方法的命令$ rabbitmqadmin -f tsv -q list connections name | while read conn ;do rabbitmqadmin -q close connection name=${conn} ; done 。還可以通過http://server-name:15672/api/檢視相應的的JAVA介面。

        Java呼叫RabbitMQ介面。由於相對於RabbitMQ都是一對一的接收和傳送訊息,所以呼叫也比較簡單

           ConnectionFactory factory = newConnectionFactory();

          factory.setHost("");//MQ的IP

          factory.setPort();//MQ埠

         factory.setUsername("");//MQ使用者名稱

         factory.setPassword("");//MQ密碼

          Connection connection =factory.newConnection();

          Channel channel =connection.createChannel();

         /*建立訊息佇列,並且傳送訊息*/

         channel.queueDeclare(QUEUE_NAME,false, false, false, null);

       上面第一個引數是佇列名字,第二個是佇列是否持久化(重啟後佇列是否還在),第三個引數是該佇列是否受限於此連線,第四個引數是連線不在時是否刪除佇列。

伺服器端:

channel.basicPublish("",QUEUE_NAME, null, message.getBytes());

客戶端:

/*建立消費者物件,用於讀取訊息*/

       QueueingConsumerconsumer = new QueueingConsumer(channel);

       channel.basicConsume(QUEUE_NAME,true, consumer);

       遇到的問題,由於連線的connection太多,file descriptors爆滿,查了資料,是由於伺服器的檔案開啟數限制,在rabbitmq-server裡新增ulimit-n 10400可以解決問題。

      流程示意圖: