前言2: 啥是 MQTT?是 Message Queuing Telemetry Transport 的縮寫,叫做「訊息隊列遙測傳輸」的意思,但這是啥東東,其實詳細的說明在下也不是很會講,但在下粗略的理解,就是訊息即時相關傳送、接收的意思,透過在指定的 Topic(主題) 進行發布(Publish)訊息,而有關聯的終端可以訂閱(Subscribe)想要接收訊息的 Topic 來取得發布的訊息,而 MQTT 就是為了這個操作而設計出來的協定。
前言3: MQTT 除了可以透過 MQTT 的協定來傳送資料,它另一種傳送的方式是 WebSockets,所以對於網頁前端來說,技術上也是比較友善,上手門檻不會太高;也因為是可以 over WebSockets 的關係,所以 MQTT 的技術是可以開發成即時通訊的架構,而且還有 keep alive 的特性
前言4: Topic 是以 UTF-8 編碼為主的字串,所以...Topic name 是可以使用中文的,大小寫是敏感的,可以被用在 Topic name 的符號中,雖空白是可以用但不建議,「/」是可以用的,但它似乎是有一些定義的用法
前言5: Topic 的訂閱是可以使用 topic filter 的方式來達成一次訂閱多個 Topic 的操作,filter 有點類似 regexp 的方式,但不完全一樣,詳細還是要網路上找一下
目前以網路上能找到比較主流且相關資料比較多的 MQTT Service 平台大至上有三個
- Kafak
- RocketMQ
- RabbitMQ
在下主要是先拿 RabbitMQ 來用,至於為什麼先用它,主要有幾個思維
- 在下在用的環境主要都是 client-server 的架構,所以選 RabbitMQ
- 在下並沒有需要高吞吐量的,所以選 RabbitMQ
- 以前在寫 JAVA 時有吃過 JAVA 吃爆記憶體的虧,所以不會太想選 RocketMQ(註: 這只是在下個人偏見,我知道現在 JAVA 越來越優化這部份,但就是我個人偏見)
- 之後應該也會來玩 Kafak,所以現在先玩 RabbitMQ
接下來來講講怎麼架設 RabbitMQ(以在 Ubuntu 為例)
RabbitMQ 的官網的說明很詳細: https://www.rabbitmq.com/docs/install-debian
基本上就是照官網講的操作就好,以下我只是簡略的說明
- 安裝前置的需求
- sudo apt-get install curl gnupg apt-transport-https -y
- 取得三個相關的 gnu siging key
- curl -1sLf "https://keys.openpgp.org/vks/v1/by-fingerprint/0A9AF2115F4687BD29803A206B73A36E6026DFCA" | sudo gpg --dearmor | sudo tee /usr/share/keyrings/com.rabbitmq.team.gpg > /dev/null
- curl -1sLf https://github.com/rabbitmq/signing-keys/releases/download/3.0/cloudsmith.rabbitmq-erlang.E495BB49CC4BBE5B.key | sudo gpg --dearmor | sudo tee /usr/share/keyrings/rabbitmq.E495BB49CC4BBE5B.gpg > /dev/null
- curl -1sLf https://github.com/rabbitmq/signing-keys/releases/download/3.0/cloudsmith.rabbitmq-server.9F4587F226208342.key | sudo gpg --dearmor | sudo tee /usr/share/keyrings/rabbitmq.9F4587F226208342.gpg > /dev/null
- 增加 apt repos
- sudo tee /etc/apt/sources.list.d/rabbitmq.list <<EOF
## Provides modern Erlang/OTP releases
##
deb [signed-by=/usr/share/keyrings/rabbitmq.E495BB49CC4BBE5B.gpg] https://ppa1.novemberain.com/rabbitmq/rabbitmq-erlang/deb/ubuntu {開發代號} main
deb-src [signed-by=/usr/share/keyrings/rabbitmq.E495BB49CC4BBE5B.gpg] https://ppa1.novemberain.com/rabbitmq/rabbitmq-erlang/deb/ubuntu {開發代號} main
# another mirror for redundancy
deb [signed-by=/usr/share/keyrings/rabbitmq.E495BB49CC4BBE5B.gpg] https://ppa2.novemberain.com/rabbitmq/rabbitmq-erlang/deb/ubuntu {開發代號} main
deb-src [signed-by=/usr/share/keyrings/rabbitmq.E495BB49CC4BBE5B.gpg] https://ppa2.novemberain.com/rabbitmq/rabbitmq-erlang/deb/ubuntu {開發代號} main
## Provides RabbitMQ
##
deb [signed-by=/usr/share/keyrings/rabbitmq.9F4587F226208342.gpg] https://ppa1.novemberain.com/rabbitmq/rabbitmq-server/deb/ubuntu {開發代號} main
deb-src [signed-by=/usr/share/keyrings/rabbitmq.9F4587F226208342.gpg] https://ppa1.novemberain.com/rabbitmq/rabbitmq-server/deb/ubuntu {開發代號} main
# another mirror for redundancy
deb [signed-by=/usr/share/keyrings/rabbitmq.9F4587F226208342.gpg] https://ppa2.novemberain.com/rabbitmq/rabbitmq-server/deb/ubuntu {開發代號} main
deb-src [signed-by=/usr/share/keyrings/rabbitmq.9F4587F226208342.gpg] https://ppa2.novemberain.com/rabbitmq/rabbitmq-server/deb/ubuntu {開發代號} main
EOF - {開發代號}: Ubuntu 18.04 LTS 是 bionic, 20.04 LTS 是 focal, 22.04 LTS 是 jammy
- 更新 apt repos
- sudo apt update -y
- 安裝 ErLang 套件
- sudo apt-get install -y erlang-base erlang-asn1 erlang-crypto erlang-eldap erlang-ftp erlang-inets erlang-mnesia erlang-os-mon erlang-parsetools erlang-public-key erlang-runtime-tools erlang-snmp erlang-ssl erlang-syntax-tools erlang-tftp erlang-tools erlang-xmerl
- 安裝 RabbitMQ
- sudo apt-get install rabbitmq-server -y --fix-missing
- 啟動 RabbitMQ 服務
- sudo systemctl start rabbitmq-server
- 啟用 RabbitMQ Management, MQTT
- sudo rabbitmq-plugins enable rabbitmq_management rabbitmq_mqtt rabbitmq_web_mqtt
- Management: http[s]://localhost:15672/
- 建立 RabbitMQ 使用者帳戶
- rabbitmqctl add_user {username} {password}
- 設定 RabbitMQ 指定帳戶權限
- rabbitmqctl set_permission -p {vhost} {username} {conf-pattern} {write-pattern} {read-pattern}
- conf-pattern: ".*"
- write-pattern: ".*"
- read-pattern: ".*"
- 注意: ".*" 這是指針對所有 entity,是比較無腦的設定,要細部的話,可以參考 https://www.rabbitmq.com/docs/access-control#authorisation
- 設定 RabbitMQ 指定帳戶標籤(tags)
- rabbitmqctl set_user_tags {username} {tag...}
- tag: administrator 是管理者的標籤,要細部的話,可以參考 https://www.rabbitmq.com/docs/management#permissions
- 保險起見,重新起動 RabbitMQ 服務
- sudo systemctl restart rabbitmq-server
至此,RabbitMQ 的 MQTT 服務就架起來了,可以試著用瀏覽打開 RabbitMQ Management 的網址,以新建立的帳戶登入就可以看到服務狀態
之後,我再來寫一篇應用
註: 理論上應該可以用 guest/guest 登入 management
沒有留言:
張貼留言