深入理解消息中間件技術之RabbitMQ服務

[{total_limit,924},{total_used,2},{sockets_limit,829},{sockets_used,0}]},

{processes,[{limit,1048576},{used,204}]},

{run_queue,0},

{uptime,111},

{kernel,{net_ticktime,60}}]

六、Rabbitmq CLI介紹

自帶多個命令行工具

1)rabbitmqctl #管理與操作命令

  • 停止節點
  • 訪問節點狀態,有效配置,運行狀況檢查
  • 虛擬主機管理
  • 用戶和權限管理
  • 政策管理
  • 列出隊列,連接,渠道,交流,消費者
  • 集群成員管理

[root@master ~]# rabbitmqctl list_bindings #查看綁定信息

Listing bindings for vhost /...

[root@master ~]# rabbitmqctl list_exchanges #查看交換器

Listing exchanges for vhost / ...

amq.rabbitmq.trace topic

amq.match headers

direct

amq.headers headers

amq.direct direct

amq.rabbitmq.event topic

amq.topic topic

amq.fanout fanout

[root@master ~]# rabbitmqctl list_queues #查看隊列

Timeout: 60.0 seconds ...

Listing queues for vhost / ...

更多操作內容請參考:http://www.rabbitmq.com/rabbitmqctl.8.html

2)rabbitmq-plugins #是一個管理插件的工具

[root@master ~]# rabbitmq-plugins --help

Usage:

rabbitmq-plugins [-n ] [-l] [-q] []

General options:

-n node

-q quiet

-l longnames

Default node is "rabbit@server", where `server` is the local hostname. On a host

named "server.example.com", the node name of the RabbitMQ Erlang node will

usually be rabbit@server (unless RABBITMQ_NODENAME has been set to some

non-default value at broker startup time). The output of hostname -s is usually

the correct suffix to use after the "@" sign. See rabbitmq-server(1) for

details of configuring the RabbitMQ broker.

Quiet output mode is selected with the "-q" flag. Informational messages are

suppressed when quiet mode is in effect.

If RabbitMQ broker uses long node names for erlang distribution, "longnames"

option should be specified.

Some commands accept an optional virtual host parameter for which

to display results. The default value is "/".

Commands:

disable |--all [--offline] [--online]

enable |--all [--offline] [--online]

help

list [pattern] [--verbose] [--minimal] [--enabled] [--implicitly-enabled]

set [] [--offline] [--online]

- operation timeout in seconds. Default is "infinity".

參考文章:http://www.rabbitmq.com/rabbitmq-plugins.8.html

3)rabbitmqadmin #它可以執行一些與WEB界面相同的操作,rabbitmqadmin只是一個專門的HTTP客戶端。

安裝管理插件後,http://{主機名}:15672 /cli/rabbitmqadmin 進行下載

[root@master ~]# wget https://raw.githubusercontent.com/rabbitmq/rabbitmq-management/v3.7.6/bin/rabbitmqadmin

[root@master ~]# cp rabbitmqadmin /usr/local/bin/

[root@master ~]# chmod +x /usr/local/bin/rabbitmqadmin

七、RabbitMQ集群

RabbitMQ 是用 erlang 開發的,集群非常方便,因為 erlang 天生就是一門分佈式語言,但其本身並不支持負載均衡。

RabbitMQ 的集群節點包括:

1)內存節點

內存節點就是將所有數據放在內存,只保存狀態到內存(例外的情況:持久的queue內容將被保存到 disk)

2)磁盤節點。

磁盤節點將數據放在磁盤,保存狀態到內存和磁盤,內存節點雖然不寫入磁盤,但是它執行比磁盤節點要好,集群中,只需要一個磁盤節點來保存狀態 就足夠了,如果集群中只有內存節點,那麼不能停止它們,否則所有的狀態,消息等都會丟失。

深入理解消息中間件技術之RabbitMQ服務

不過,如前文所述,如果在投遞消息時,打開了消息的持久化,那即使是內存節點,數據還是安全的放在磁盤。一個 RabbitMQ 集群中可以共享 user、vhost、queue、exchange 等,所有的數據和狀態都是必須在所有節點上覆制的,一個例外是那些當前只屬於創建它的節點的消息隊列,儘管它們可見且可被所有節點讀取。 RabbitMQ 節點可以動態地加入到集群中,一個節點它可以加入到集群中,也可以從集群環集群進行一個基本的負載均衡。

Rabbit 模式大概分為以下三種:

1)單一模式

2)普通模式

3)鏡像模式

單一模式:最簡單的情況,非集群模式。

普通模式:默認的集群模式。

對於 Queue 來說,消息實體只存在於其中一個節點,A、B 兩個節點僅有相同的元數據,即隊列結構。當消息進入 A 節點的 Queue 中後,consumer 從 B 節點拉取時,RabbitMQ 會臨時在 A、B 間進行消息傳輸,把 A 中的消息實體取出並經過 B 發送給 consumer. 所以 consumer 應儘量連接每一個節點,從中取消息。即對於同一個邏輯隊列,要在多個節點建立物理 Queue。否則無論 consumer 連 A 或 B,出口總在 A,會產生瓶頸。該模式存在一個問題就是當 A 節點故障後,B 節點無法取到 A 節點中還未消費的消息實體。如果做了消息持久化,那麼得等 A 節點恢復,然後才可被消費。

鏡像模式:

把需要的隊列做成鏡像隊列,存在於多個節點,屬於 RabbitMQ 的 HA 方案。

該模式解決了上述問題,其實質和普通模式不同之處在於,消息實體會主動在鏡像節點間同步,而不是在 consumer 取數據時臨時拉取。該模式帶來的副作用也很明顯,除了降低系統性能外,如果鏡像隊列數量過多,加之大量的消息進入,集群內部的網絡帶寬將會被這種同步通訊大大消耗掉,所,在對可靠性要求較高的場合中適用。


分享到:


相關文章: