rabbitmq技術的一些感悟(一)

Rabbitmq

初識rabbitmq

RabbitMQ是流行的開源消息隊列系統,用erlang語言開發。RabbitMQAMQP(高級消息隊列協議)的標準實現。如果不熟悉AMQP,直接看RabbitMQ的文檔會比較困難。不過它也只有幾個關鍵概念,這裏簡單介紹

幾個概念說明:

Broker:簡單來說就是消息隊列服務器實體。
Exchange:消息交換機,它指定消息按什麼規則,路由到哪個隊列。
Queue:消息隊列載體,每個消息都會被投入到一個或多個隊列。
Binding:綁定,它的作用就是把exchangequeue按照路由規則綁定起來。
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,在exchangequeue之間建立好綁定關係。
  (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個部分:
  (1exchange持久化,在聲明時指定durable => 1
  (2queue持久化,在聲明時指定durable => 1
  (3)消息持久化,在投遞時指定delivery_mode=> 21是非持久化)

如果exchangequeue都是持久化的,那麼它們之間的binding也是持久化的。如果exchangequeue兩者之間有一個持久化,一個非持久化,就不允許建立綁定。

安裝開發環境和庫

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 connectionsockfd進行綁定

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);

    接口說明:用於關聯connchannel

 

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爲單位,0unlimited

                  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,當exchangedirect,此處爲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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章