Rabblimq
? AMQP,即Advanced Message Queuing Protocol,高級消息隊列協議,是應用層協議的一個開放標準,爲面向消息的中間件設計。
? 消息中間件主要用於組件之間的解耦,消息的發送者無需知道消息使用者的存在,反之亦然。 AMQP的主要特徵是面向消息、隊列、路由(包括點對點和發佈/訂閱)、可靠性、安全。 RabbitMQ是一個開源的AMQP實現,服務器端用Erlang語言編寫,支持多種客戶端,如:Python、Ruby、.NET、Java、JMS、C、PHP、ActionScript、XMPP、STOMP等,支持AJAX。用於在分佈式系統中存儲轉發消息,在易用性、擴展性、高可用性等方面表現不俗。
安裝
環境
CentOS Linux release 7.4.1708 (Core)
主機名:lek01
IP地址:172.16.50.104
Rabbitmq version: 3.7.3
配置erlang源
/etc/yum.repos.d/erlang.repo
[erlang]
gpgcheck=0
humanname=erlang Repository
baseurl=http://packages.erlang-solutions.com/rpm/centos/$releasever/$basearch
name=erlang Repository
安裝
yum install https://dl.bintray.com/rabbitmq/all/rabbitmq-server/3.7.5/rabbitmq-server-3.7.5-1.el7.noarch.rpm -y
配置Rabbitmq(可選)
添加/etc/rabbitmq/rabbitmq-env.conf
RABBITMQ_NODENAME=rabbit@lek01
啓動
systemctl enable rabbitmq-server && systemctl start rabbitmq-server
rabbitmq-plugins enable rabbitmq_management #啓動 web ui 插件
命令參考
語法:rabbitmqctl -n <node> -l <command> [<command options>]
-n node
-q quiet
-t timeout
-l longnames
默認 node "rabbit@server",server爲主機名稱
虛擬主機默認是 ‘’‘/’
Commands:
# 添加用戶
add_user <username> <password>
# 添加虛擬主機
add_vhost <vhost>
# 驗證用戶密碼
authenticate_user <username> <password>
# 停止同步
cancel_sync_queue [-p <vhost>] queue
# 更改羣集節點的類型
change_cluster_node_type <disc|ram>
# 更改用戶密碼
change_password <username> <password>
# 清除參數值
clear_global_parameter <key>
# 清除運算策略,與clear_policy相同
clear_operator_policy [-p <vhost>] <key>
# 清除參數
clear_parameter [-p <vhost>] <component_name> <key>
# 清除密碼
clear_password <username>
# 清除用戶某個虛擬主機權限
clear_permissions [-p vhost] <username>
# 清除虛擬主機策略
clear_policy [-p <vhost>] <key>
clear_topic_permissions [-p vhost] <username> [<exchange>]
clear_vhost_limits [-p <vhost>]
close_all_connections [-p <vhost> --limit <limit>] [-n <node> --global] [--per-connection-delay <delay>] <explanation>
close_connection <connectionpid> <explanation>
# 顯示集羣所有節點狀態
cluster_status
decode value passphrase [--cipher cipher] [--hash hash] [--iterations iterations]
# 刪除用戶
delete_user <username>
# 刪除虛擬主機
delete_vhost <vhost>
encode value passphrase [--cipher cipher] [--hash hash] [--iterations iterations]
environment
eval <expr>
exec <expr> [--offline]
force_boot
force_reset
forget_cluster_node [--offline] <existing_cluster_member_node>
help <command>
hipe_compile <directory>
join_cluster [--disc|--ram] <existing_cluster_member_node>
# 列出虛擬主機binding信息
list_bindings [-p <vhost>] [<bindinginfoitem> ...]
list_channels [<channelinfoitem> ...]
list_ciphers
list_connections [<connectioninfoitem> ...]
list_consumers [-p vhost] [<consumerinfoitem> ...]
list_exchanges [-p <vhost>] [<exchangeinfoitem> ...]
list_global_parameters
list_hashes
list_operator_policies [-p <vhost>]
list_parameters [-p <vhost>]
list_permissions [-p <vhost>]
list_policies [-p <vhost>]
list_queues [-p <vhost>] [--online] [--offline] [--local] [<queueinfoitem> ...]
list_topic_permissions [-p <vhost>]
list_unresponsive_queues [--local] [--queue-timeout <queue-timeout>] [<unresponsiveq_ueueinfoitem> ...]
# 列出用戶虛擬主機權限
list_user_permissions <username>
list_user_topic_permissions <username>
# 列出所有用戶
list_users
list_vhost_limits [-p <vhost>] [--global]
# 列出所有虛擬主機
list_vhosts [<vhostinfoitem> ...]
# 驗證節點狀態
node_health_check
# 清除隊列信息
purge_queue [-p vhost] queue
rename_cluster_node <oldnode1> <newnode1> [oldnode2] [newnode2] ...
# 打印服務器運行報告
report
# 清空節點所有信息,包含用戶,虛擬主機等
reset
# 清空虛擬主機下所有信息
restart_vhost [-p <vhost>]
# 日誌切割
rotate_logs
# 設置集羣名稱
set_cluster_name <name>
set_disk_free_limit <disk_limit>
set_disk_free_limit mem_relative <fraction>
# 設置全局運行時參數
set_global_parameter <name> <value>
set_operator_policy [-p <vhost>] [--priority <priority>] [--apply-to <apply-to>] <name> <pattern> <definition>
set_parameter [-p <vhost>] <component_name> <name> <value>
# 設置用戶虛擬主機權限
set_permissions [-p <vhost>] <username> <conf> <write> <read>
set_policy [-p <vhost>] [--priority <priority>] [--apply-to <apply-to>] <name> <pattern> <definition>
set_topic_permissions [-p <vhost>] <username> <exchange> <write_pattern> <read_pattern>
# 設置用戶標籤
set_user_tags <username> <tag> [...]
set_vhost_limits [-p <vhost>] <definition>
set_vm_memory_high_watermark <fraction>
set_vm_memory_high_watermark absolute <value>
shutdown
start_app
status
stop [<pidfile>]
stop_app
sync_queue [-p <vhost>] queue
trace_off [-p <vhost>]
trace_on [-p <vhost>]
update_cluster_nodes <existing_cluster_member_node_to_seed_from>
wait [<pid_file>] [--pid|-P <pid>]
python實列
準備
# 創建虛擬主機
rabbitmqctl add_vhost bbs
# 創建用戶
rabbitmqctl add_user bbs ad1211
# 添加標籤
rabbitmqctl set_user_tags bbs management
# 設置權限
rabbitmqctl set_permissions -p bbs bbs ".*" ".*" ".*"
# 安裝 python 擴展
pip install pika
消費者
# -*- coding: utf-8 -*-
__author__ = 'fan'
import pika
rabbitmq_host = '172.16.50.104'
rabbitmq_user = 'bbs'
rabbitmq_pwd = 'ad1211'
rabbitmq_vhost = 'bbs'
rabbitmq_queue = 'info'
rabbitmq_exchange = 'bbs'
rabbitmq_conn = pika.BlockingConnection(
pika.ConnectionParameters(
rabbitmq_host,
credentials=pika.PlainCredentials(rabbitmq_user, rabbitmq_pwd),
virtual_host=rabbitmq_vhost
)
).channel()
def callback(ch, method, properties, body):
print(" [x] %r:%r" % (method.routing_key, body))
#消費者
rabbitmq_conn.basic_consume(callback,
queue=rabbitmq_queue,
no_ack=True)
rabbitmq_conn.start_consuming()
生產者
# -*- coding: utf-8 -*-
__author__ = 'fan'
import pika
import sys
body = sys.argv[1]
rabbitmq_host = '172.16.50.104'
rabbitmq_user = 'bbs'
rabbitmq_pwd = 'ad1211'
rabbitmq_vhost = 'bbs'
rabbitmq_exchange = 'bbs'
rabbitmq_exchange_type = 'direct'
rabbitmq_quene = 'info'
rabbitmq_routing_key = 'info'
rabbitmq_conn = pika.BlockingConnection(
pika.ConnectionParameters(
rabbitmq_host,
credentials=pika.PlainCredentials(rabbitmq_user, rabbitmq_pwd),
virtual_host=rabbitmq_vhost
)
).channel()
# 創建 exchange
rabbitmq_conn.exchange_declare(exchange=rabbitmq_exchange,exchange_type=rabbitmq_exchange_type,durable=True)
# 創建 queue
rabbitmq_conn.queue_declare(queue=rabbitmq_quene,durable=True)
# queue 與 exchange bind
rabbitmq_conn.queue_bind(queue=rabbitmq_quene,exchange=rabbitmq_exchange,routing_key=rabbitmq_routing_key)
rabbitmq_conn.basic_publish(exchange=rabbitmq_exchange,
routing_key=rabbitmq_routing_key,
body=body
)
運行
先運行生產者 , 在運行消費者
# python production.py "hellow word!"
# python consumption.py
[x] 'info':'hello word'