在工作過程中,對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可以解決問題。
流程示意圖: