2024-05-25

[MQTT] 1 - 試著來架設 MQTT - RabbitMQ

*先說個前言,其實在下個人覺得,直接用 docker 來創建可以方便許多

前言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}
  • 設定 RabbitMQ 指定帳戶標籤(tags)
  • 保險起見,重新起動 RabbitMQ 服務
    • sudo systemctl restart rabbitmq-server
至此,RabbitMQ 的 MQTT 服務就架起來了,可以試著用瀏覽打開 RabbitMQ Management 的網址,以新建立的帳戶登入就可以看到服務狀態

之後,我再來寫一篇應用

註: 理論上應該可以用 guest/guest 登入 management

沒有留言: