RabbitMQ 是Advanced Message Queuing Protocol (AMQP) 的開源實現,由以高性能、健壯以及可伸縮性出名的 Erlang 寫成,所以也是繼承了這些優勢。AMQP的主要特徵是面向消息、隊列、路由(包括點對點和發佈/訂閱)、可靠性、安全。RabbitMQ支持多種客戶端有:Python、Ruby、.NET、Java、JMS、C、PHP、ActionScript、XMPP、STOMP等,支持AJAX。用於在分佈式系統中存儲轉發消息,在易用性、擴展性、高可用性等方面表現不俗。RabbitMQ解決了應用程序之間的互聯(connect)和規模(scale)的問題,消息發送和接收是隔離,發送方不知道消息最終由誰接收,接收方也沒必要關心消息是誰步發出的;發送和接收是隔離的,消息本質上就是異步的.這種隔離也就解耦了應用程序之間的依賴。RabbitMQ的角色就是應用程序中間的路由器。php
幾個概念說明:
Broker:簡單來講就是消息隊列服務器實體。
Exchange:消息交換機,它指定消息按什麼規則,路由到哪一個隊列。
Queue:消息隊列載體,每一個消息都會被投入到一個或多個隊列。
Binding:綁定,它的做用就是把exchange和queue按照路由規則綁定起來。
Routing Key:路由關鍵字,exchange根據這個關鍵字進行消息投遞。
vhost:虛擬主機,一個broker裏能夠開設多個vhost,用做不一樣用戶的權限分離。
producer:消息生產者,就是投遞消息的程序。
consumer:消息消費者,就是接受消息的程序。
channel:消息通道,在客戶端的每一個鏈接裏,可創建多個channel,每一個channel表明一個會話任務。web
消息隊列的使用過程大概以下:
(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交換機,它採起廣播模式,一個消息進來時,投遞到與該交換機綁定的全部隊列。centos
RabbitMQ支持消息的持久化,也就是數據寫在磁盤上,爲了數據安全考慮,我想大多數用戶都會選擇持久化。消息隊列持久化包括3個部分:
(1)exchange持久化,在聲明時指定durable => 1
(2)queue持久化,在聲明時指定durable => 1
(3)消息持久化,在投遞時指定delivery_mode => 2(1是非持久化)
若是exchange和queue都是持久化的,那麼它們之間的binding也是持久化的。若是exchange和queue二者之間有一個持久化,一個非持久化,就不容許創建綁定。瀏覽器
因爲RabbitMQ是用erlang開發的,RabbitMQ 徹底依賴 Erlang 的 Cluster,而Erlang集羣很是方便,所以配置RabbitMQ集羣變得很是簡單。安全
1,Centos6.5上安裝最新版本bash
wget https://packages.erlang-solutions.com/erlang-solutions-1.0-1.noarch.rpm
rpm -Uvh erlang-solutions-1.0-1.noarch.rpm服務器
rpm --import https://packages.erlang-solutions.com/rpm/erlang_solutions.ascphp7
[erlang-solutions]
name=Centos $releasever - $basearch - Erlang Solutions
baseurl=https://packages.erlang-solutions.com/rpm/centos/$releasever/$basearch
gpgcheck=1
gpgkey=https://packages.erlang-solutions.com/rpm/erlang_solutions.asc
enabled=1curl
將以上內容保存爲erlang.repo放在/etc/yum.repos.d/
yum install -y erlang
curl -s https://packagecloud.io/install/repositories/rabbitmq/rabbitmq-server/script.rpm.sh | bash
yum install -y rabbitmq-server
設置配置文件
通常狀況下,RabbitMQ的默認配置就足夠了。若是但願特殊設置的話,有兩個途徑:
一個是環境變量的配置文件 rabbitmq-env.conf ;
一個是配置信息的配置文件 rabbitmq.config;
注意,這兩個文件默認是沒有的,若是須要必須本身建立。
cd /etc/rabbitmq
cp /usr/share/doc/rabbitmq-server-3.6.9/rabbitmq.config.example /etc/rabbitmq/
mv rabbitmq.config.example rabbitmq.config
rabbitmq-env.conf
這個文件的位置是肯定和不能改變的,位於:/etc/rabbitmq目錄下(這個目錄須要本身建立)。
文件的內容包括了RabbitMQ的一些環境變量,經常使用的有:
#RABBITMQ_NODE_PORT= //端口號
#HOSTNAME=
RABBITMQ_NODENAME=mq
RABBITMQ_CONFIG_FILE= //配置文件的路徑
RABBITMQ_MNESIA_BASE=/rabbitmq/data //須要使用的MNESIA數據庫的路徑
RABBITMQ_LOG_BASE=/rabbitmq/log //log的路徑
RABBITMQ_PLUGINS_DIR=/rabbitmq/plugins //插件的路徑
2,啓動、中止
service rabbitmq-server start
service rabbitmq-server stop
service rabbitmq-server restart
設置開機啓動
chkconfig rabbitmq-server on
3,開啓web界面管理工具
rabbitmq-plugins enable rabbitmq_management
service rabbitmq-server restart
防火牆開放15672端口
/sbin/iptables -I INPUT -p tcp --dport 15672 -j ACCEPT
/etc/rc.d/init.d/iptables save
打開瀏覽器登陸:http://127.0.0.1:15672
添加遠程訪問用戶命令
添加用戶:rabbitmqctl add_user admin password
添加權限:rabbitmqctl set_permissions -p "/" admin ".*" ".*" ".*"
修改用戶角色rabbitmqctl set_user_tags admin administrator
rabbitmqctl status 查看狀態信息
rabbitmqctl list_queues 查看隊列
rabbitmq經常使用命令
新建用戶:rabbitmqctl add_user <UserName> <Password>
刪除用戶:rabbitmqctl delete_user <UserName>
改密碼:rabbimqctlchange_password {username} {newpassword}
給admin賦予管理員administrator角色:rabbitmqctl set_user_tags admin administrator
查看用戶列表:rabbitmqctl list_users
建立vhost:rabbitmqctl add_vhost /myhost
刪除vhost:rabbitmqctl delete_vhost <VHostPath>
查看vhost:rabbitmqctl list_vhosts
list_vhostsset_permissions [-p <VHostPath>] <UserName> <Regexp> <Regexp> <Regexp>
clear_permissions [-p <VHostPath>] <UserName>
list_permissions [-p <VHostPath>]
list_user_permissions <UserName>
list_queues [-p <VHostPath>] [<QueueInfoItem> ...]
list_exchanges [-p <VHostPath>] [<ExchangeInfoItem> ...]
list_bindings [-p <VHostPath>]
list_connections [<ConnectionInfoItem> ...]
PHP7.0的amqp擴展(讓PHP和MQ交互)
rpm -Uvh http://dl.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm
rpm -Uvh http://rpms.famillecollet.com/enterprise/remi-release-6.rpm
yum --enablerepo=remi-php70 install php-pecl-amqp
php -m便可查看擴展