RabbitMQ二三事

RabbitMQ概覽

RabbitMQ是一個高性能的分佈式消息中間件。它由Erlang編寫,這種語言天生支持分佈式,並且性能極高(可是比較難上手)。node

通訊概念

RabbitMQ簡單理解就是一個隊列服務,咱們的生產者不斷地往它投遞消息,而消費者不斷地從它那裏獲取消息。但相較於利用redis的List這類簡單隊列,RabbitMQ的消息投遞更靈活一點。首先須要知道一些RabbitMQ中的通訊概念:python

  • exchange(交換器)
  • queue(隊列):消息隊列載體,每一個消息都會被投入到一個或多個隊列。
  • binding(綁定):它的做用就是把exchange和queue按照路由規則綁定起來。
  • routing key(路由關鍵字):exchange根據這個關鍵字進行消息投遞。
  • vhost(虛擬主機):不一樣的vhost下,數據徹底隔離,默認vhost爲「/」
  • channel(信道):在一個tcp鏈接下,可創建多個channel,每一個channel表明一個會話任務。
  • producer(生產者)
  • consumer(消費者)

RabbitMQ中Exchange相似於一個路由器,咱們的consumer並不會把消息直接投遞給隊列,而是投遞給exchangeexchange根據咱們投遞時的路由鍵(routing key)再發送到特定的隊列。這樣的設計讓消息能夠靈活選路,發送到某一類的隊列中,造成一對多的關係,而不單單是一對一。web

Exchange

因此說RabbitMQ中的exchange很方便,很強大,它有這樣幾種類型:redis

  • direct
  • fanout
  • topic
  • headers(幾乎用不到)

direct交換器很簡單,有時候咱們僅僅須要一個很簡單的隊列(消息投遞到其中,而後不斷消費它),這時候咱們就能夠用direct交換器,它的規則是:若是路由鍵匹配,消息就會被投遞到對應的隊列。
python-one-overall.pngdocker

fanout交換器忽略路由鍵,把消息同時發到一批隊列。
exchanges.png
topic則就是根據不一樣路由鍵,把消息發送到某一類隊列中。
python-five.png數據庫

快速安裝

這裏我使用docker安裝RabbitMQ
docker-compose.yml數據結構

version: "2"
services:
  mq:
    image: rabbitmq:3.7.8-management
    restart: always
    mem_limit: 2g
    hostname: mq1
    volumes:
      - ./mnesia:/var/lib/rabbitmq/mnesia
      - ./log:/var/log/rabbitmq
      - ./rabbitmq.conf:/etc/rabbitmq/rabbitmq.conf
    ports:
      - "55672:15672"
      - "56720:5672"
    environment:
      - CONTAINER_NAME=rabbitMQ
      - RABBITMQ_ERLANG_COOKIE=3t182q3wtj1p9z0kd3tb

rabbitmq.conftcp

loopback_users.guest = false
listeners.tcp.default = 5672
default_pass = WbsWebZVOzE5A1Bd
default_user = test
hipe_compile = false
management.listener.port = 15672
management.listener.ssl = false

注意,5672端口是AMQP Client(也就是咱們程序使用的)端口,15672是管理插件的web端口。
mnesia文件夾是RabbitMQ存放數據的地方。
關於RabbitMQ的一個重要注意事項是它根據所謂的節點名稱存儲數據,默認爲主機名。
當前節點會在該目錄下創建一個rabbit@node-name的文件夾,用來存放節點數據,node-name就是節點名字,默認爲hostname(其實mnesia數據庫是Erlang內置的一個DBMS,能夠直接存儲Erlang的各類數據結構),在上述例子中,這個目錄名爲rabbit@mq1(由於docker-compose中設置了hostnamemq1
5672端口映射到了宿主機的56720端口,15672端口映射到了宿主機的55672端口分佈式

相關文章
相關標籤/搜索