Rabbitmq
初識rabbitmq
RabbitMQ是流行的開源消息隊列系統,用erlang語言開發。RabbitMQ是AMQP(高級消息隊列協議)的標準實現。如果不熟悉AMQP,直接看RabbitMQ的文檔會比較困難。不過它也只有幾個關鍵概念,這裏簡單介紹
幾個概念說明:
Broker:簡單來說就是消息隊列服務器實體。
Exchange:消息交換機,它指定消息按什麼規則,路由到哪個隊列。
Queue:消息隊列載體,每個消息都會被投入到一個或多個隊列。
Binding:綁定,它的作用就是把exchange和queue按照路由規則綁定起來。
Routing Key:路由關鍵字,exchange根據這個關鍵字進行消息投遞。
vhost:虛擬主機,一個broker裏可以開設多個vhost,用作不同用戶的權限分離。
producer:消息生產者,就是投遞消息的程序。
consumer:消息消費者,就是接受消息的程序。
channel:消息通道,在客戶端的每個連接裏,可建立多個channel,每個channel代表一個會話任務。
由Exchange,Queue,RoutingKey三個才能決定一個從Exchange到Queue的唯一的線路。
消息隊列的使用過程大概如下:
(1)客戶端連接到消息隊列服務器,打開一個channel。
(2)客戶端聲明一個exchange,並設置相關屬性。
(3)客戶端聲明一個queue,並設置相關屬性。
(4)客戶端使用routing key,在exchange和queue之間建立好綁定關係。
(5)客戶端投遞消息到exchange。
exchange接收到消息後,就根據消息的key和已經設置的binding,進行消息路由,將消息投遞到一個或多個隊列裏。
exchange也有幾個類型,完全根據key進行投遞的叫做Direct交換機,例如,綁定時設置了routing key爲”abc”,那麼客戶端提交的消息,只有設置了key爲”abc”的纔會投遞到隊列。對key進行模式匹配後進行投遞的叫做Topic交換機,符號”#”匹配一個或多個詞,符號”*”匹配正好一個詞。例如”abc.#”匹配”abc.def.ghi”,”abc.*”只匹配”abc.def”。還有一種不需要key的,叫做Fanout交換機,它採取廣播模式,一個消息進來時,投遞到與該交換機綁定的所有隊列。
RabbitMQ支持消息的持久化,也就是數據寫在磁盤上,爲了數據安全考慮,我想大多數用戶都會選擇持久化。消息隊列持久化包括3個部分:
(1)exchange持久化,在聲明時指定durable
=> 1
(2)queue持久化,在聲明時指定durable
=> 1
(3)消息持久化,在投遞時指定delivery_mode=> 2(1是非持久化)
如果exchange和queue都是持久化的,那麼它們之間的binding也是持久化的。如果exchange和queue兩者之間有一個持久化,一個非持久化,就不允許建立綁定。
安裝開發環境和庫
1.將目錄中的librabbitmq.so.1放到目錄 /usr/local/lib/librabbitmq.so.1
2.安裝rabbitm需要的環境和庫
yum install -y ncurses-devel
yum install gcc
yum install g++
yum install cmake
yum install make
yum install PHP
yum install MySQL
yum install php-process
yum install php-devel
yum install mysql-server
#安裝php的amq支持擴展
wget http://pecl.php.NET/get/amqp-1.0.3.tgz
tar zxvf amqp-1.0.3.tgz
cd amqp-1.0.3
/usr/bin/phpize
./configure--with-php-config=/usr/bin/php-config --with-amqp
make && make install
#php.ini 添加
vi /etc/php.ini
extension="amqp.so"
#安裝erlang支持
wgethttp://www.erlang.org/download/otp_src_R15B01.tar.gz
tar -zxvf otp_src_R15B01.tar.gz
cd otp_src_R15B01
./configure --prefix=/home/erlang--without-javac
make && make install
ln -s /home/erlang/bin/erl/usr/local/bin/erl
3. 安裝rabbitma
解壓rabbitmq-server-generic-unix-3.3.4.tar
進入sbin目錄:
啓動rabbitmq服務,執行 nohup./rabbitmq-server start &
啓動rabbitmq服務器以及命令
當第一次啓動服務,檢測數據庫是否未初始化或者被刪除,它會用下面的資源初始化一個新的數據庫:
一個命名爲 / 的虛擬宿主一個名爲guest密碼也爲guest的用戶,他擁有/虛擬宿主的所有權限如果你的中間件是公開訪問的,最好修改guest用戶的密碼。管理概觀rabbitmqctl 是RabbitMQ中間件的一個命令行管理工具。它通過連接一箇中間件節點執行所有的動作。本地節點默認被命名爲”rabbit”。可以通過這個命令前使用”-n”標誌明確的指定節點名稱, 例如:# rabbitmqctl -n rabbit@shortstop add_user tonyg changeit
這個命令指示RabbitMQ中間件在rabbit@shortstop 節點創建一個tonyg/changeit的用戶。
在一個名爲”server.example.com”的主機,RabbitMQ Erlang節點的名稱通常是rabbit@server(除非RABBITMQ_NODENAM在中間件啓動時候被設置)。hostnam -s 的輸出通常是”@”符號正確的後綴。rabbitmqctl 默認產生詳細輸出。通過”-q”標示可選擇安靜模式。rabbitmqctl -q status應用和集羣管理1.停止RabbitMQ應用,關閉節點
# rabbitmqctl stop
2.停止RabbitMQ應用
# rabbitmqctl stop_app
3.啓動RabbitMQ應用
# rabbitmqctl start_app
4.顯示RabbitMQ中間件各種信息
# rabbitmqctl status
5.重置RabbitMQ節點
# rabbitmqctl reset
# rabbitmqctl force_reset
從它屬於的任何集羣中移除,從管理數據庫中移除所有數據,例如配置過的用戶和虛擬宿主, 刪除所有持久化的消息。
force_reset命令和reset的區別是無條件重置節點,不管當前管理數據庫狀態以及集羣的配置。如果數據庫或者集羣配置發生錯誤才使用這個最後的手段。
注意:只有在停止RabbitMQ應用後,reset和force_reset才能成功。
6.循環日誌文件
# rabbitmqctl rotate_logs[suffix]
7.集羣管理
# rabbitmqctl cluster clusternode…
用戶管理
1.添加用戶
# rabbitmqctl add_user username password
2.刪除用戶
# rabbitmqctl delete_user username
3.修改密碼
# rabbitmqctl change_password usernamenewpassword
4.列出所有用戶
# rabbitmqctl list_users
權限控制1.創建虛擬主機
# rabbitmqctl add_vhost vhostpath
2.刪除虛擬主機
# rabbitmqctl delete_vhost vhostpath
3.列出所有虛擬主機
# rabbitmqctl list_vhosts
4.設置用戶權限
# rabbitmqctl set_permissions [-pvhostpath] username regexp regexp regexp
5.清除用戶權限
# rabbitmqctl clear_permissions [-pvhostpath] username
6.列出虛擬主機上的所有權限
# rabbitmqctl list_permissions [-pvhostpath]
7.列出用戶權限
# rabbitmqctl list_user_permissionsusername
例子:
添加 rabbitmqctl add_vhost az
rabbitmqctl set_permissions -p az guest".*" ".*" ".*"
接口描述
amqp_connection_state_tamqp_new_connection(void);
接口說明:聲明一個新的amqp connection
intamqp_open_socket(char const *hostname, int portnumber);
接口說明:獲取socket.
參數說明:hostname RabbitMQ server所在主機
portnumber RabbitMQ server監聽端口
voidamqp_set_sockfd(amqp_connection_state_t state,int sockfd);
接口說明:將amqp connection和sockfd進行綁定
amqp_rpc_reply_tamqp_login(amqp_connection_state_t state, char const *vhost,intchannel_max,int frame_max,int heartbeat,amqp_sasl_method_enum sasl_method,...);
接口說明:用於登錄RabbitMQ server,主要目的爲了進行權限管理;
參數說明:state amqpconnection
vhost rabbit-mq的虛機主機,是rabbit-mq進行權限管理的最小單位
channel_max 最大鏈接數,此處設成0即可
frame_max 和客戶端通信時所允許的最大的frame size.默認值爲131072,增大這個值有助於提高吞吐,降低這個值有利於降低時延
heartbeat 含義未知,默認值填0
sasl_method 用於SSL鑑權,默認值參考後文demo
amqp_channel_open_ok_t*amqp_channel_open(amqp_connection_state_t state, amqp_channel_t channel);
接口說明:用於關聯conn和channel
amqp_exchange_declare_ok_t*amqp_exchange_declare(amqp_connection_state_t state, amqp_channel_t channel,amqp_bytes_t exchange, amqp_bytes_t type, amqp_boolean_t passive,amqp_boolean_t durable, amqp_table_t arguments);
接口說明:聲明declare
參數說明:state
channel
exchange
type "fanout" "direct" "topic"三選一
passive
curable
arguments
amqp_queue_declare_ok_t*amqp_queue_declare(amqp_connection_state_t state, amqp_channel_t channel,amqp_bytes_t queue, amqp_boolean_t passive, amqp_boolean_t durable,amqp_boolean_t exclusive, amqp_boolean_t auto_delete, amqp_table_targuments);
接口說明:聲明queue
參數說明:state amqp connection
channel
queue queue name
passive
durable 隊列是否持久化
exclusive 當前連接不在時,隊列是否自動刪除
aoto_delete 沒有consumer時,隊列是否自動刪除
arguments 用於拓展參數,比如x-ha-policy用於mirrored queue
amqp_queue_bind_ok_t*amqp_queue_bind(amqp_connection_state_t state, amqp_channel_t channel,amqp_bytes_t queue, amqp_bytes_t exchange, amqp_bytes_t routing_key, amqp_table_t arguments);
接口說明:聲明binding
amqp_basic_qos_ok_t*amqp_basic_qos(amqp_connection_state_t state, amqp_channel_t channel, uint32_tprefetch_size, uint16_t prefetch_count, amqp_boolean_t global);
接口說明:qos是 quality of service,我們這裏使用主要用於控制預取消息數,避免消息按條數均勻分配,需要和no_ack配合使用
參數說明:state
channel
prefetch_size 以bytes爲單位,0爲unlimited
prefetch_count 預取的消息條數
global
amqp_basic_consume_ok_t*amqp_basic_consume(amqp_connection_state_t state, amqp_channel_t channel,amqp_bytes_t queue, amqp_bytes_t consumer_tag, amqp_boolean_t no_local,amqp_boolean_t no_ack, amqp_boolean_t exclusive, amqp_table_t arguments);
接口說明:開始一個queue consumer
參數說明:state
channel
queue
consumer_tag
no_local
no_ack 是否需要確認消息後再從隊列中刪除消息
exclusive
arguments
int amqp_basic_ack(amqp_connection_state_tstate,amqp_channel_t channel,uint64_t delivery_tag,amqp_boolean_t multiple);
intamqp_basic_publish(amqp_connection_state_t state,amqp_channel_tchannel,amqp_bytes_t exchange,amqp_bytes_t routing_key,amqp_boolean_tmandatory,amqp_boolean_t immediate,struct amqp_basic_properties_t_ const*properties,amqp_bytes_t body);
接口說明:發佈消息
參數說明:state
channel
exchange
routing_key 當exchange爲默認“”時,此處填寫queue_name,當exchange爲direct,此處爲binding_key
mandatory 參見參考文獻2
immediate 同上
properties 更多屬性,如何設置消息持久化,參見文後demo
body 消息體
amqp_rpc_reply_tamqp_channel_close(amqp_connection_state_t state,amqp_channel_t channel,intcode);
amqp_rpc_reply_tamqp_connection_close(amqp_connection_state_t state,int code);
intamqp_destroy_connection(amqp_connection_state_t state);
轉自:http://blog.csdn.net/pbymw8iwm/article/details/38686575?locationNum=9