- rabbitmq 簡介
- ubuntu 安裝rabbitmq
- 一些配置及常用命令
簡介
消息隊列一般用於系統間對接,能夠降低系統耦合度。通過將消息的發送和接收分離來實現應用程序的異步和解耦。你可以使用消息隊列實現:
- 數據分發
- 非阻塞操作或推送通知(如郵件、短信提醒等)
- 實現發布/訂閱,異步處理
- 工作隊列
RabbitMq作為一款消息隊列產品,它由Erlang語言開發,實現AMQP(高級消息隊列協議)的開源消息中間件。
應用場景
-
異步處理
場景說明:用戶注冊后,注冊信息寫入數據庫,再發郵件、短信通知。但后兩項並非必須,傳統做法:數據寫入->發送短信->發送郵件->返回給用戶。用戶等待所有任務完成。
引入rabbitmq:可以將短信通知、郵件通知這兩個非必要的任務寫入到消息隊列,再由專門的任務處理程序去讀取消息發送通知。用戶等待時間變成寫入數據庫時間+寫入消息隊列時間。 -
應用解耦
網上購物,用戶提交訂單后,訂單系統需要通知庫存系統。傳統做法,訂單系統直接調用庫存系統api。當庫存系統出現故障,則訂單失效。
一如rabbitmq:訂單系統完成持久化,將消息寫入消息隊列。庫存系統訂閱消息隊列中的訂單,庫存系統故障了,也不會導致訂單丟失。恢復后可以從消息隊列繼讀取訂單處理。 -
流量削峰
前端加入消息隊列。大批量用戶請求到達后,寫入消息隊列,並設置最大閾值。超過該閾值的請求丟棄返回錯誤給客戶端。系統只需要從消息隊列中取正常的請求來進行處理即可。
安裝
安裝環境:Ubuntu 20.04,使用如下命令安裝。
sudo apt install rabbitmq-server
systemctl status rabbitmq-server #檢查狀態
service rabbitmq-server status #檢查狀態
下面是啟動后,查看狀態的輸出。
● rabbitmq-server.service - RabbitMQ Messaging Server
Loaded: loaded (/lib/systemd/system/rabbitmq-server.service; enabled; vendor preset: enabled)
Active: active (running) since Tue 2021-12-21 14:28:04 CST; 4min 24s ago
Main PID: 94216 (beam.smp)
Status: "Initialized"
Tasks: 85 (limit: 4611)
Memory: 56.2M
CGroup: /system.slice/rabbitmq-server.service
├─94212 /bin/sh /usr/sbin/rabbitmq-server
├─94216 /usr/lib/erlang/erts-9.2/bin/beam.smp -W w -A 64 -P 1048576 -t 5000000 -stbt db -zdbbl 32000 -K tr>
├─94309 /usr/lib/erlang/erts-9.2/bin/epmd -daemon
├─94445 erl_child_setup 65536
├─94465 inet_gethost 4
└─94466 inet_gethost 4
Dec 21 14:28:01 pc-ubuntu systemd[1]: Starting RabbitMQ Messaging Server...
Dec 21 14:28:04 pc-ubuntu systemd[1]: rabbitmq-server.service: Supervising process 94216 which is not our child. We'll >
Dec 21 14:28:04 pc-ubuntu systemd[1]: Started RabbitMQ Messaging Server.
Dec 21 14:28:05 pc-ubuntu systemd[1]: rabbitmq-server.service: Supervising process 94216 which is not our child. We'll >
下面是一些常用管理命令,包括啟用、停用、重啟。
sudo service rabbitmq-server start #啟用
sudo service rabbitmq-server stop #停用
sudo service rabbitmq-server restart #重啟
停用后,再次查看狀態,輸出如下。重點查看Active后面的內容,此時為inactive(dead).
● rabbitmq-server.service - RabbitMQ Messaging Server
Loaded: loaded (/lib/systemd/system/rabbitmq-server.service; enabled; vendor preset: enabled)
Active: inactive (dead) since Tue 2021-12-21 14:33:36 CST; 9s ago
Process: 95123 ExecStop=/usr/sbin/rabbitmqctl stop (code=exited, status=0/SUCCESS)
Main PID: 94216
Status: "Initialized"
Dec 21 14:28:01 pc-ubuntu systemd[1]: Starting RabbitMQ Messaging Server...
Dec 21 14:28:04 pc-ubuntu systemd[1]: rabbitmq-server.service: Supervising process 94216 which is not our child. We'll >
Dec 21 14:28:04 pc-ubuntu systemd[1]: Started RabbitMQ Messaging Server.
Dec 21 14:28:05 pc-ubuntu systemd[1]: rabbitmq-server.service: Supervising process 94216 which is not our child. We'll >
Dec 21 14:33:35 pc-ubuntu systemd[1]: Stopping RabbitMQ Messaging Server...
Dec 21 14:33:36 pc-ubuntu rabbitmq[95131]: Stopping and halting node 'rabbit@pc-ubuntu'
Dec 21 14:33:36 pc-ubuntu systemd[1]: rabbitmq-server.service: Killing process 94216 (beam.smp) with signal SIGKILL.
Dec 21 14:33:36 pc-ubuntu systemd[1]: rabbitmq-server.service: Succeeded.
Dec 21 14:33:36 pc-ubuntu systemd[1]: Stopped RabbitMQ Messaging Server.
開啟Web管理
sudo rabbitmq-plugins enable rabbitmq_management
注意,執行上面的命令時,要確保rabbitmq在運行狀態中。
執行完后,在瀏覽器中輸入http://localhost:15672
並使用guest/guest 作為用戶名密碼登錄。
用戶管理命令
sudo rabbitmqctl list_users #列出用戶
sudo rabbitmqctl add_user admin adminpassword #添加用戶
sudo rabbitmqctl set_user_tags admin administrator #給用戶添加角色
sudo rabbitmqctl delete_user admin #刪除用戶
給用戶配置VirtualHost中的讀寫權限。使用set_permissions命令來將rabbitadmin這個用戶賦予/
這個虛擬主機的讀、寫、配置權限。rabbitmq安裝好后,會默認有這個/
虛擬主機的。通過Web管理端可以看見,guest用戶對其有所有權限。通過下面命令,將我們剛才創建的rabbitadmin也賦權過去。
sudo rabbitmqctl set_permissions -p / rabbitadmin '.*' '.*' '.*'