初识RabbitMQ
生活随笔
收集整理的這篇文章主要介紹了
初识RabbitMQ
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
1.安裝
rabbitmq官網:http://www.rabbitmq.com/
下載地址:https://packagecloud.io/rabbitmq
下載rabbitmq-server
安裝腳本文件
# curl -s https://packagecloud.io/install/repositories/rabbitmq/rabbitmq-server/script.rpm.sh | bash
安裝rabbitmq
# yum install rabbitmq-server -y
安裝報錯如下:
Resolving Dependencies
--> Running transaction check
---> Package rabbitmq-server.noarch :-.el6 will be installed
--> Processing Dependency: erlang >= -.el6.noarch
--> Processing Dependency: socat -.el6.noarch
--> Finished Dependency Resolution
Error: Package: rabbitmq-server--.el6.noarch (rabbitmq_rabbitmq-server)
Requires: erlang >= 19.3
Error: Package: rabbitmq-server--.el6.noarch (rabbitmq_rabbitmq-server)
Requires: socat
You could try using --skip-broken to work around the problem
You could try running: rpm -Va --nofiles --nodigest
#
意思是要安裝rabbitmq-server,必須先安裝erlang才行 安裝rabbitmq必須先安裝Erlang,版本信息可以參照:http://www.rabbitmq.com/which-erlang.html
版本信息如下:
安裝Erlang網址:https://packagecloud.io/rabbitmq/erlang下載腳本文件
# curl -s https://packagecloud.io/install/repositories/rabbitmq/erlang/script.rpm.sh | bash
安裝erlang
# yum install erlang
此路很坑,需要多試幾次
Downloading Packages: https://packagecloud.io/rabbitmq/erlang/el/6/x86_64/erlang-21.0.4-1.el6.x86_64.rpm: [Errno 14] problem making ssl connection Trying other mirror. Error Downloading Packages: erlang--.el6.x86_64: failure: erlang--.el6.x86_64.rpm from rabbitmq_erlang: [Errno ] No more mirrors to try. [root@localhost soft]#
安裝完erlang后繼續安裝rabbitmq-server
# yum install rabbitmq-server -y
報錯如下:
... Loading mirror speeds from cached hostfile * base: mirrors.tuna.tsinghua.edu.cn * extras: mirrors..com * updates: mirrors.tuna.tsinghua.edu.cn No package socat available. Error: Nothing to do
導入阿里云源,然后安裝socat,網址:https://opsx.alibaba.com/mirror
操作方法:
CentOS 、備份 mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.backup 、下載新的CentOS-Base.repo 到/etc/yum.repos.d/ CentOS wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-5.repo 或者 curl -o /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-5.repo CentOS wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-6.repo 或者 curl -o /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-6.repo CentOS wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo 或者 curl -o /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo 、之后運行yum makecache生成緩存
安裝阿里云源
# wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-6.repo # yum makecache
安裝socat
# yum install socat -y
安裝rabbitmq-server如果不行的話,可以參照文檔:https://blog.csdn.net/chenkui199/article/details/76254871
# yum install rabbitmq-server
安裝之路一路坑呀。。。
2.rabbitmq相關概念介紹
AMQP:一個提供統一消息服務的應用層標準高級消息隊列協議
RabbitMQ相關概念:
生產者創建消息,然后發布到RabbitMQ中,消息分為兩個部分:信息體和標簽,rabbitmq會根據標簽把消息發送給消費者。
名詞解釋:
Producer:生產者 簡稱P
Consumer:消費者 簡稱C
Broker:消息中間件的服務節點(一個節點可以通俗的理解為一臺rabbitmq服務器)
Queue:隊列
Exchange:交換機
RoutingKey:路由鍵 生產者將消息發送給交換機時,會指定一個RountingKey,key需要與交換機類型進行綁定鍵(BindingKey)聯合使用才能夠最終生效
Binding:綁定
通信過程和消費過程
生產 P1連接到RabbitMQ Broker,建立一個連接,開啟一個信道,聲明一個交換機,聲明一個隊列,通過RoutingKey將交換機和隊列進行綁定, P1將信息發送至RabbitMQ Broker,包含RoutingKey等信息 交換機根據RoutingKey找到相應的隊列,并且將信息發送給隊列 關閉信號 關閉連接 消費 C1連接至RabbitMQ Broker上,建立一個連接,開啟一個信道 C1向RabbitMQ Broker請求消費的隊列中的信息 隊列回應并且投遞信息 C1接收信息,向隊列確認收到信息 RabbitMQ從隊列中刪除已經確認的信息 關閉信號 關閉連接
3.利用python代碼實現發送隊列和接受隊列
生產者代碼
本實例,采用python去編寫,需要預先安裝pika(pip install pika)即可
如果沒有python環境,快速搭建一個python環境就可以了
下載python包: # wget https://www.python.org/ftp/python/3.6.6/Python-3.6.6.tgz 解壓: # .tgz 安裝必要依賴包 # yum install gcc gcc-c++ zlib zlib-devel openssl openssl-devel -y 源碼安裝 # cd Python- # ./configure --prefix=/usr/local/python3 # make # make install 安裝pika包 # /usr/local/python3/bin/pip3 install pika 如果是想使用系統自帶的python 2.6,但是沒有安裝pip的話,可以參考 網址:https://pypi.org/project/pip/#files 下載pip包: # wget https://files.pythonhosted.org/packages/69/81/52b68d0a4de760a2f1979b0931ba7889202f302072cc7a0d614211bc7579/pip-18.0.tar.gz 解壓: # tar xf pip-18.0.tar.gz 安裝: # cd pip-18.0 # python setup.py install 如果報setuptools錯誤,則看下面 網址:https://pypi.org/project/setuptools/#files 下載setuptools包 # https://files.pythonhosted.org/packages/d3/3e/1d74cdcb393b68ab9ee18d78c11ae6df8447099f55fe86ee842f9c5b166c/setuptools-40.0.0.zip 使用unzip解壓 如果沒有unzip軟件的話,就使用yum install unzip -y 安裝即可 # .zip # cd setuptools- # python setup.py install
生產者代碼:
查看例子:
http://www.rabbitmq.com/tutorials/tutorial-one-python.html
https://pypi.org/project/pika
https://github.com/pika/pika部分截圖如下:
代碼實現:
#!/usr/local/python3/bin/python3
import pika
conn = pika.BlockingConnection(pika.ConnectionParameters('127.0.0.1',credentials=(pika.PlainCredentials('guest','guest'))))
chan = conn.channel()
chan.queue_declare(queue='test')
chan.basic_publish(exchange='',routing_key='test',body='Hello World')
conn.close()
其中rabbit默認的用戶是guest密碼也是guest
執行代碼后
# send_sample_rabbitmq_message.py # ./send_sample_rabbitmq_message.py
可以使用rabbitmqctl list_queues看到隊列信息
# rabbitmqctl list_queues Timeout: 60.0 seconds ... Listing queues for vhost / ... test #
可以看到,rabitmq生產者信息已經給到隊列了
消費者代碼:
github例子:
代碼實現:
剛已經已經發送了隊列,現在用此代碼獲取下
# get_sample_rabbitmq_message.py [root@localhost python_script]# ./get_sample_rabbitmq_message.py <Basic.Deliver(['consumer_tag=ctag1.ca8ba5916dd24d8e9e5ab383a1d5a032', 'delivery_tag=1', 'exchange=', 'redelivered=False', 'routing_key=test'])> <BasicProperties> b'Hello World' #
如果隊列中還沒消息的話,程序會一直等待,等待rabbitmq將信息發送至隊列,然后它再獲取
5.RabbitMQ的管理
rabbitmqctl管理rabbitmq
參考文檔:http://www.rabbitmq.com/man/rabbitmqctl.8.html
rabbitmqctl — rabbitmq的命令管理行工具
用法:
rabbitmqctl [-q] [-l] [-n node] [-t timeout] command [command_options]
OPTIONS:
-q: --quiet Quiet output mode is selected. Informational messages are suppressed when quiet mode is in effect.
靜默的輸出模式,提示性信息被隱藏
-t timeout, --timeout timeout
超時命令,僅對list命令有效
-q 參數
例如:
普通模式
# rabbitmqctl list_queues
Timeout: 60.0 seconds ...
Listing queues for vhost / ...
test
#
靜默模式
# rabbitmqctl -q list_queues
test
#
-t 參數
沒有模擬出實際效果出來
command:
-l 打印所有有用的命令
例如:
# rabbitmqctl -l
即可打印有用的命令執行參數
User Management
用戶管理
add_user username password
創建用戶名和密碼
例如:
# rabbitmqctl add_user tonyg
Adding user "tonyg" ...
list_users
列出用戶
例如:
# rabbitmqctl list_users
Listing users ...
guest [administrator]
tonyg []
#
change_password username newpassword
修改用戶密碼
例如:
# rabbitmqctl change_password tonyg
Changing password for user "tonyg" ...
#
clear_password username
清楚用戶名的密碼
例如:
# rabbitmqctl clear_password tonyg
Clearing password for user "tonyg" ...
#
authenticate_user username password
例如:
待測試
set_user_tags username [tag ...]
設置用戶名的標簽
針對于Management Plugin,tag標簽有5種
標簽有五種:
none:沒有任何權限
management:可以在AMQP上做任何事情,查看自己虛擬主機的隊列、交換機等
policymaker:management的都能夠做,還能夠查看,創建和刪除可通過AMQP登錄的虛擬主機的策略和參數
monitoring:management的都能夠做,還可以列出所有的虛擬主機,不僅僅從AMQP登錄的,查看其它用戶的鏈接情況,查看節點數據等
administrator:所有權限
例如:
# rabbitmqctl set_user_tags tonyg administrator
Setting tags for user "tonyg" to [administrator] ...
查看用戶標簽
# rabbitmqctl list_users | grep tonyg
tonyg [administrator]
#
delete_user username
刪除用戶
例如:
# rabbitmqctl delete_user tonyg
Deleting user "tonyg" ...
#
Access Control
訪問控制
add_vhost vhost
增加vhost
例如:
# rabbitmqctl add_vhost test
Adding vhost "test" ...
#
list_vhosts [vhostinfoitem ...]
列出vhost
# rabbitmqctl list_vhosts
Listing vhosts ...
/
test
#
set_permissions [-p vhost] user conf write read
設置用戶權限
例如:
配置用戶tonyg對vhost test具有全部權限,即可讀可寫
# rabbitmqctl set_permissions -p test tonyg ".*" ".*" ".*"
Setting permissions for user "tonyg" in vhost "test" ...
#
配置用戶tonyg對vhost / 且資源名稱以test開頭的資源具有可讀可寫權限
# rabbitmqctl set_permissions -p / tonyg "test.*" ".*" ".*"
Setting permissions for user "tonyg" in vhost "/" ...
#
list_permissions [-p vhost]
列出虛擬主機允許訪問權限的用戶以及相應的權限
例如:
# rabbitmqctl list_permissions -p /
Listing permissions for vhost "/" ...
guest .* .* .*
tonyg test.* .* .*
#
list_user_permissions username
列出用戶的權限
例如:
# rabbitmqctl list_user_permissions tonyg
Listing permissions for user "tonyg" ...
test .* .* .*
/ test.* .* .*
#
set_topic_permissions [-p vhost] user exchange write read
這個參數還沒有看明白...
詳細信息如下:
set_topic_permissions [-p vhost] user exchange write read
vhost
The name of the virtual host to which to grant the user access, defaulting to “/”.
user
The name of the user the permissions apply to in the target virtual host.
exchange
The name of the topic exchange the authorisation check will be applied to.
write
A regular expression matching the routing key of the published message.
read
A regular expression matching the routing key of the consumed message.
Sets user topic permissions.
For example, this command instructs the RabbitMQ broker to let the user named “tonyg” publish and consume messages going through the “amp.topic” exchange of the “/myvhost” virtual host with a routing key starting with “tonyg-”:
rabbitmqctl set_topic_permissions -p /myvhost tonyg amq.topic “^tonyg-.*” “^tonyg-.*”
Topic permissions support variable expansion for the following variables: username, vhost, and client_id. Note that client_id is expanded only when using MQTT. The previous example could be made more generic by using “^{username}-.*”:
rabbitmqctl set_topic_permissions -p /myvhost tonyg amq.topic “^{username}-.*” “^{username}-.*”
Server Status
服務狀態
list_queues [-p vhost] [--offline | --online | --local] [queueinfoitem ...]
返回隊列的狀態信息
--offline:僅列出當前不可用的持久隊列(節點不可用)
--online:列出當前可用的隊列
--local:僅列出主進程位于當前節點上的隊列
queueinfoitem:
name:名稱
durable:是否可持久化
auto_delete:是否不再使用隊列時自動刪除隊列
arguments:隊列參數
messages_ready:準備傳遞給客戶端的消息數
messages_unacknowledged:傳遞給客戶端但是未被確認的消息數
messages:準備好和未確認消息的總和
consumers:消費者數量
例如:
# rabbitmqctl list_queues -p / --online
Timeout: 60.0 seconds ...
Listing queues for vhost / ...
test
#
查看vhost / 的隊列是否有傳遞給客戶端但是未被確認的消息數
# rabbitmqctl list_queues -p / messages_unacknowledged
Timeout: 60.0 seconds ...
Listing queues for vhost / ...
#
如果此參數不是為0,則需要注意了,隊列會越累積越多的,最后可能會導致rabbitmq的崩塌
list_exchanges [ -p vhost ] [ exchangeinfoitem ... ]
返回交換機的信息
exchangeinfoitem:
name:返回交換機的名稱
type:返回交換機的類型
direct
topic
headers
fanout
durable:當交換機重啟后是否仍然存在
auto_delete:當交換機不再使用時,是否是自動刪除
internal:查看交換機是否是內部的,即不能由客戶直接發布
例如:
# rabbitmqctl list_exchanges
Listing exchanges for vhost / ...
amq.direct direct
amq.topic topic
amq.match headers
amq.headers headers
amq.fanout fanout
amq.rabbitmq.trace topic
direct
#
查看交換機重啟后是否仍然存在
# rabbitmqctl list_exchanges name durable
Listing exchanges for vhost / ...
amq.direct true
amq.topic true
amq.match true
amq.headers true
amq.fanout true
amq.rabbitmq.trace true
true
#
list_bindings [ -p vhost ] [ bindinginfoitem ... ]
返回綁定信息
bindinginfoitem:
source_name:附加綁定信息源的信息
source_kind:附加綁定信息源的類型
destination_name:附加綁定信息的目標名稱
destination_kind:附加綁定的消息的目標類型
routing_key:綁定的路由秘鑰
arguments:綁定的參數
例如:
# rabbitmqctl list_bindings
Listing bindings for vhost /...
exchange test queue test []
#
list_connections [ connectioninfoitem ... ]
返回TCP/IP連接統計信息
connectioninfoitem:
name:連接的名稱
port:服務器端口
host:主機名稱
例如:
返回連接的信息:
# rabbitmqctl list_connections name port host
Listing connections ...
-> 127.0.0.1
#
list_channels [ channelinfoitem ... ]
返回有關通道的信息
channelinfoitem:
connection:與通道有關所屬的連接管理的ID
name:頻道的可讀名稱
number:通道的編號
user:關聯的用戶名
vhost:與通道的運行主機
consumer_count:通過通道檢索消息的邏輯AMQP使用者數。
messages_unacknowledged:通過此渠道發送但尚未確認的消息數。
messages_uncommitted:在尚未提交的事務中收到的消息數。
acks_uncommitted:尚未提交的交易中收到的確認數量。
例如:
查看當前的通道信息
# rabbitmqctl list_channels name number user vhost consumer_count messages_unacknowledged
Listing channels ...
-> () guest /
#
list_consumers [ -p vhost ]
列出消費者信息
例如:
# rabbitmqctl list_consumers
Listing consumers on vhost / ...
test <rabbit@localhost.> ctag1.e1733293b7f9419583e67260e562f424 []
#
node_health_check
rabbitmq節點的運行狀況
例如:
# rabbitmqctl node_health_check
Timeout: seconds ...
Checking health of node rabbit@localhost ...
Health check passed
#
6.RabbitMQ運維
web管理界面
啟用插件 # rabbitmq-plugins enable rabbitmq_management 目前還未發現不重啟rabbitmq讓rabbitmq_managemnet生效的辦法 開放端口,重啟rabbitmq # iptables -I INPUT -p tcp --dport -j ACCEPT # iptables -I INPUT -p udp --dport -j ACCEPT # /etc/init.d/iptables save # /etc/init.d/rabbitmq-server restart 登錄網頁 http://hostname:15672就可以登錄了
guest只能夠通過localhost進行訪問
創建用戶 # rabbitmqctl add_user test test 賦予tag # rabbitmqctl set_user_tags test administrator
添加用戶后就可以使用Test用戶登錄了,
Queued messages
Ready:可以傳遞的消息數
Unacknowledged:未確認的消息數
Total:總的消息數
Message rates
Publish:信息進入服務器的速率
Publisher confirm:服務器確認發布的速率
Return:將速率返回給發布者
Disk read:隊列從磁盤讀取速度
Disk write:隊列從磁盤寫入速度
需要注意的是,Unacknowledged一把情況下為0,若不為0,則證明危險了,rabbitmq可能消息會越積越多,導致系統崩掉
Global counts
返回的是總對象數
連接數、信道數、交換機數、隊列數、消費者數等
Nodes
節點信息(節點可以粗略的看做是一臺服務器)
File descriptors:文件描述符(# ulimit -n可以顯示當前系統的文件秒速符,也可更改)
Socket descriptors:socket文件描述符數量
Erlang processes:Erlang進程的數量
Memory:內存
Disk space:磁盤剩余
Uptime:啟動時間
RabbitMQ配置文件
如果不確定配置是否有配置文件,可以查看rabbitmq的log
# /var/log/rabbitmq/rabbit\@localhost.log
...
Starting RabbitMQ on Erlang
Copyright (C) - Pivotal Software, Inc.
Licensed under the MPL. See http://www.rabbitmq.com/
...
node : rabbit@localhost
home dir : /var/lib/rabbitmq
config file(s) : (none)
cookie hash : C1eEyzogKIXagAsaVuyVLw==
log(s) : /var/log/rabbitmq/rabbit@localhost.log
: /var/log/rabbitmq/rabbit@localhost_upgrade.log
database dir : /var/lib/rabbitmq/mnesia/rabbit@localhost
...
#
可以看到conf file(s)這行,值為none,說明還沒有配置rabbitmq的配置文件
configure說明:http://www.rabbitmq.com/configure.html
rabbitmq.conf.example文件:https://github.com/rabbitmq/rabbitmq-server/blob/master/docs/rabbitmq.conf.example
rabbitmq.conf 和 rabbitmq-env.conf 位置官網如下圖:
默認rabbitmq是沒有默認配置文件的,需要創建,可以將github上面的conf文件復制進/etc/rabbitmq/rabbitmq.conf中
配置文件說明:
參考內容:http://www.rabbitmq.com/configure.html關于網絡部分的配置:
參考內容:http://www.rabbitmq.com/networking.html
默認的話,rabbitmq監聽所有IP,端口為5672 isteners.tcp.default = 也可以對IP進行監聽 listeners.tcp.local = rabbitmq可以設置多個監聽,比如:監聽ipv4的192.168.56.209的5672端口和ipv6的5672端口 listeners.tcp. = listeners.tcp.local_v6 = ::: TCP監聽Erlang的進程數,默認是10個 num_acceptors.tcp = AMQP timeout時間,單位為毫秒 handshake_timeout = 是否啟動DNS反向查找,默認為False reverse_dns_lookups = true
關于安全的配置:
關于TLS配置,參考文檔:http://www.rabbitmq.com/ssl.html
客戶提供的SASL身份驗證機制參考文檔:https://yq.aliyun.com/articles/41959
身份驗證和授權(表示不理解),參考文檔:http://www.rabbitmq.com/access-control.html
TLS配置 關于TLS配置,參考文檔:http://www.rabbitmq.com/ssl.html ssl_options.verify = verify_peer ssl_options.fail_if_no_peer_cert = false ssl_options.cacertfile = /path/to/cacert.pem ssl_options.certfile = /path/to/cert.pem ssl_options.keyfile = /path/to/key.pem 向客戶提供的SASL身份驗證機制,默認PLAIN、AMQPLAIN auth_mechanisms. = PLAIN auth_mechanisms. = AMQPLAIN auth_backends. = rabbit_auth_backend_ldap 關于默認User / VHost配置 rabbitmq默認的虛擬主機,默認/ default_vhost = / rabbitmq默認的用戶名,默認guest default_user = guest rabbitmq默認密碼,默認guest default_pass = guest 默認分配的權限,默認".*".".*",".*" default_permissions.configure = .* default_permissions.read = .* default_permissions.write = .*
關于網絡協議相關配置:
heartbeat延遲,默認為60秒,若設置為0,則不能遵守服務器協議,若設置為0,可能會在大量連接的情況下提高性能,但可能會導致存在非活動連接的網絡設備時連接中斷。 heartbeat = 最大允許通道數,默認為2047(官網上的寫的是2047),若設置為0,則代表不做限制,可能會出現通道泄露,官方建議不設置為0 channel_max =
資源限制于流量控制:
內存的閾值,默認為0.,.4是相對的值40%,默認為0. vm_memory_high_watermark.relative = 0.4 可以使用如下絕對值,2G vm_memory_high_watermark.absolute = 2GB 隊列分頁磁盤的值,默認0. vm_memory_high_watermark_paging_ratio = 0.5 RabbitMQ存儲在分頁磁盤的可用空間限制,當可用磁盤低于此限制時,將觸發流量控制,默認50M disk_free_limit.absolute = 50mb
MISC/Advices配置:
是否啟用Erlang即時編譯器,默認為flase,若修改為true,可能在啟動時延遲幾分鐘,用來增加服務的吞吐量,如果HiPE沒有編譯到Erlang中,會顯示警告信息,啟動正常起來,但是在windows平臺上,HiPE不可用 hipe_compile = false 消息字節大小,若低于該大小,消息將直接嵌入到隊列索引中,默認值4kb queue_index_embed_msgs_below =
Management配置:
參考文檔:http://www.rabbitmq.com/management.html
配置management端口 management.listener.port =
如上就是配置文件的大概
官方建議的服務器配置:
參考文檔:http://www.rabbitmq.com/production-checklist.html
針對于虛擬追、用戶、權限
虛擬主機:如果不是搭建集群,且服務于單個系統時,默認虛擬主機 / 足夠了
如果是有多用戶時,建議使用單獨的vhost
用戶:刪除默認用戶guest,為每個應用程序分配獨立的用戶
資源限制:
內存:
保持默認40%即可,默認情況下,當rabbitmq檢測到它使用超過40%的可用內存時,它將不接受任何消息,這是一個安全默認值,修改時要小心一點,因為操作系統和文件系統也要使用內存來加速所有進程操作,如果內存太小,可能會導致rabbitmq進程被Kill掉
官方建議內存的范圍為0.——,因為系統必須留有至少30%的內存來處理其他進程。
磁盤空間
默認disk_free_limit是50M,默認適用于開發和教學,生產部署需要更高的磁盤空間,因為空間不足可能會導致節點故障,數據丟失等
官方建議,
.disk_free_limit設置值是總內存大小,當磁盤空間低于此大小時,所有發布者都將被阻止,并且不會受到任何消息
.disK_free_limit設置為內存的1.5倍,是一個更安全的生產價值
.disk_free_limit設置為內存的2倍,是最保守的生產價值
7.利用RabbitMQ提供的API進行監控
rabbitmq提供的api例子:http://127.0.0.1:15672/api/
例如如下api所代表的含義:
這里就介紹nodes 和 overview api
nodes:
查看:
# curl -i -u test:test http://localhost:15672/api/nodes
內容如下:
overview也是類似的
api所監視的工具其實和網頁版監視是一樣的,只不過rabbitmq提供了一個接口,允許寫代碼去調用這個接口而已。
可以使用python代碼來實現此功能:
#!/usr/local/python3/bin/python3
import requests
import json
import sys
def getjson_nodes():
#定義url
url = "http://localhost:15672/api/nodes"
#獲取內容,并且格式化為str
r = requests.get(url=url,auth=('test','test')).text
#去除頭和尾的 [] 符號,因為頭和尾[] 不符合json規范
text = r.strip('[').strip(']')
#返回str
return text
def getjson_overview():
#和上面類似
url = "http://localhost:15672/api/overview"
r = requests.get(url=url,auth=('test','test')).text
text = r.strip('[').strip(']')
return text
def get_runqueue(jsondata):
return jsondata["run_queue"]
def get_fd_used(jsondata):
fd_total = int(jsondata["fd_total"])
fd_used = int(jsondata["fd_used"])
fd_used_per = round((),)
return fd_used_per
def get_uptime(jsondata):
return jsondata["uptime"]
def get_socket_used(jsondata):
sockets_total = int(jsondata["sockets_total"])
sockets_used = int(jsondata["sockets_used"])
sockets_used_per = round((),)
return sockets_used_per
def get_rabbitmq_version(jsondata):
return jsondata["rabbitmq_version"]
def get_erlang_version(jsondata):
return jsondata["erlang_version"]
def get_rabbitmq_node(jsondata):
return jsondata["node"]
def get_queue_messages_unacknowledged(jsondata):
queue_total = jsondata["queue_totals"]
if 'messages_unacknowledged' in queue_total:
return queue_total["messages_unacknowledged"]
else:
return
def get_queue_messages_ready(jsondata):
queue_total = jsondata["queue_totals"]
if 'messages_ready' in queue_total:
return queue_total["messages_ready"]
else:
return
def get_message_stats_publish(jsondata):
message_stats = jsondata["message_stats"]
if 'publish' in message_stats:
return message_stats["publish"]
else:
return
def get_message_stats_no_ack(jsondata):
message_stats = jsondata["message_stats"]
if 'get_no_ack' in message_stats:
return message_status["get_no_ack"]
else:
return
#定義main方法
def main():
#定義key的值,是python腳本的第一個參數
key = sys.argv[]
#返回nodes的json文檔
jsondata_nodes = json.loads(getjson_nodes())
#返回overview的json文檔
jsondata_overview = json.loads(getjson_overview())
#獲取隊列的運行數
if key == "get_runqueue":
print (get_runqueue(jsondata_nodes))
#獲取fd的使用率
elif key == "get_fd_used":
print (get_fd_used(jsondata_nodes))
#獲取運行時間
elif key == "get_uptime":
print (get_uptime(jsondata_nodes))
#獲取socket的使用率
elif key == "get_socket_used":
print (get_socket_used(jsondata_nodes))
#獲取rabbitmq的版本
elif key == "get_rabbitmq_version":
print (get_rabbitmq_version(jsondata_overview))
#獲取erlang的版本
elif key == "get_erlang_version":
print (get_erlang_version(jsondata_overview))
#node的內容
elif key == "get_rabbitmq_node":
print (get_rabbitmq_node(jsondata_overview))
#獲取未確認的message個數
elif key == "get_queue_messages_unacknowledged":
print (get_queue_messages_unacknowledged(jsondata_overview))
#獲取隊列的reday數量
elif key == "get_queue_messages_ready":
print (get_queue_messages_unacknowledged(jsondata_overview))
#獲取messate狀態信息
elif key == "get_message_stats_publish":
print (get_message_stats_publish(jsondata_overview))
elif key == "get_message_stats_no_ack":
print (get_message_stats_publish(jsondata_overview))
#如果不符合上面的規則,那就打印錯誤
else:
print ("Using:api.py {get_runqueue|get_fd_used|get_uptime|get_socket_used|get_rabbitmq_version|get_erlang_version|get_rabbitmq_node|get_queue_messages_unacknowledged|get_queue_messages_ready|get_message_stats_publish|get_message_stats_no_ack}")
if __name__ == "__main__" :
main()
可以讓python腳本結合zabbix來實現對rabbitmq的監控,可以參考:https://github.com/jasonmcintosh/rabbitmq-zabbix
終于對rabbitmq有了一個基本的了解了,加油!
總結
以上是生活随笔為你收集整理的初识RabbitMQ的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: A - Wireless Network
- 下一篇: MongoDB的使用技巧(转)