RabbitMQ入門教程——安裝及配置


RabbitMQ是一個消息代理,一個消息系統的媒介,提供了一個通用的消息發送及接收平台,並且能夠保障消息傳輸過程中的安全。使用erlang語言開發,開源,在易用性、擴展性、高可用性等方面表現不俗

技術亮點

  • 可靠性——RabbitMQ提供了多種技術可以讓你在性能和可靠性之間進行權衡。這些技術包括持久性機制、投遞確認、發布者證實和高可用性機制。
  • 靈活的路由——消息在到達隊列前是通過交換機進行路由的。RabbitMQ為典型的路由邏輯提供了多種內置交換機類型。如果你有更復雜的路由需求,可以將這些交換機組合起來使用,你甚至可以實現自己的交換機類型,並且當做RabbitMQ的插件來使用。
  • 集群——在相同局域網中的多個RabbitMQ服務器可以聚合在一起,作為一個獨立的邏輯代理來使用。
  • 聯合——對於服務器來說,它比集群需要更多的松散和非可靠鏈接。為此RabbitMQ提供了聯合模型。
  • 高可用的隊列——在同一個集群里,隊列可以被鏡像到多個機器中,以確保當其中某些硬件出現故障后,你的消息仍然安全。
  • 多協議——RabbitMQ 支持多種消息協議的消息傳遞。
  • 廣泛的客戶端——只要是你能想到的編程語言幾乎都有與其相適配的RabbitMQ客戶端。
  • 可視化管理工具——RabbitMQ附帶了一個易於使用的可視化管理工具,它可以幫助你監控消息代理的每一個環節。
  • 追蹤——如果你的消息系統有異常行為,RabbitMQ還提供了追蹤的支持,讓你能夠發現問題所在。
  • 插件系統——RabbitMQ附帶了各種各樣的插件來對自己進行擴展。你甚至也可以寫自己的插件來使用。

專業術語

Broker:簡單來說就是消息隊列服務器實體。

Exchange:消息交換機,它指定消息按什么規則,路由到哪個隊列。

Queue:消息隊列載體,每個消息都會被投入到一個或多個隊列。

Binding:綁定,它的作用就是把exchange和queue按照路由規則綁定起來。

Routing Key:路由關鍵字,exchange根據這個關鍵字進行消息投遞。

vhost:虛擬主機,一個broker里可以開設多個vhost,用作不同用戶的權限分離。

producer:消息生產者,就是投遞消息的程序。

consumer:消息消費者,就是接受消息的程序。

connection:連接,就是一個位於客戶端和Broker之間的TCP連接

channel:消息通道,在客戶端的每個連接里,可建立多個channel,每個channel代表一個會話任務。

Message:由Header和Body組成,Header是由生產者添加的各種屬性的集合,包括Message是否被持久化、由哪個Message Queue接受、優先級是多少等。而Body是真正需要傳輸的消息內容。

消息隊列的使用過程大概如下:

(1)客戶端連接到消息隊列服務器,打開一個channel。

(2)客戶端聲明一個exchange,並設置相關屬性。

(3)客戶端聲明一個queue,並設置相關屬性。

(4)客戶端使用routing key,在exchange和queue之間建立好綁定關系。

(5)客戶端投遞消息到exchange。

exchange接收到消息后,就根據消息的key和已經設置的binding,進行消息路由,將消息投遞到一個或多個隊列里。

exchange也有幾個類型,完全根據key進行投遞的叫做Direct交換機,例如,綁定時設置了routing key為"abc",那么客戶端提交的消息,只有設置了key為"abc"的才會投遞到隊列。對key進行模式匹配后進行投遞的叫做Topic交換機,符號"#"匹配一個或多個詞,符號"*"匹配正好一個詞。例如"abc.#"匹配"abc.def.ghi","abc.*"只匹配"abc.def"。還有一種不需要key的,叫做Fanout交換機,它采取廣播模式,一個消息進來時,投遞到與該交換機綁定的所有隊列。

RabbitMQ支持消息的持久化,也就是數據寫在磁盤上,為了數據安全考慮,我想大多數用戶都會選擇持久化。消息隊列持久化包括3個部分:

(1)exchange持久化,在聲明時指定durable => 1

(2)queue持久化,在聲明時指定durable => 1

(3)消息持久化,在投遞時指定delivery_mode => 2(1是非持久化)

如果exchange和queue都是持久化的,那么它們之間的binding也是持久化的。如果exchange和queue兩者之間有一個持久化,一個非持久化,就不允許建立綁定。

RabbitMQ下載地址

進入RabbitMQ官網 : http://www.rabbitmq.com/  點擊右側最新版本列表下載最新版本並安裝。

輸入以下命令可以修改RabbitMQ的存儲目錄

D:\Program Files\RabbitMQ Server\rabbitmq_server-3.6.6\sbin

rabbitmq-service.bat remove

set RABBITMQ_BASE=d:/RabbitMQ

rabbitmq-service.bat install

安裝RabbitMQWeb管理插件

rabbitmq-plugins enable rabbitmq_management

瀏覽器中打開http://127.0.0.1:15672測試是否安裝成功,用戶名密碼默認都是guest

進入后可以看到RabbitMQ一些配置信息

RabbitMQ配置文件介紹

Key

Documentation

tcp_listeners

用於監聽 AMQP連接的端口列表(無SSL). 可以包含整數 (即"監聽所有接口")或者元組如 {"127.0.0.1", 5672} 用於監聽一個或多個接口.

Default: [5672]

num_tcp_acceptors

接受TCP偵聽器連接的Erlang進程數。

Default: 10

handshake_timeout

AMQP 0-8/0-9/0-9-1 handshake (在 socket 連接和SSL 握手之后)的最大時間, 毫秒為單位.

Default: 10000

ssl_listeners

如上所述,用於SSL連接。

Default: []

num_ssl_acceptors

接受SSL偵聽器連接的Erlang進程數。

Default: 1

ssl_options

SSL配置.參考SSL documentation.

Default: []

ssl_handshake_timeout

SSL handshake超時時間,毫秒為單位.

Default: 5000

vm_memory_high_watermark

流程控制觸發的內存閥值.相看memory-based flow control 文檔.

Default: 0.4

vm_memory_high_watermark_paging_ratio

高水位限制的分數,當達到閥值時,隊列中消息消息會轉移到磁盤上以釋放內存. 參考memory-based flow control 文檔.

Default: 0.5

disk_free_limit

RabbitMQ存儲數據分區的可用磁盤空間限制.當可用空間值低於閥值時,流程控制將被觸發. 此值可根據RAM的總大小來相對設置 (如.{mem_relative, 1.0}). 此值也可以設為整數(單位為bytes)或者使用數字單位(如."50MB"). 默認情況下,可用磁盤空間必須超過50MB. 參考 Disk Alarms 文檔.

Default: 50000000

log_levels

控制日志的粒度.其值是日志事件類別(category)和日志級別(level)成對的列表.

level 可以是 'none' (不記錄日志事件), 'error' (只記錄錯誤), 'warning' (只記錄錯誤和警告), 'info' (記錄錯誤,警告和信息), or 'debug' (記錄錯誤,警告,信息以及調試信息).

目前定義了4種日志類別. 它們是:

  • channel -針對所有與AMQP channels相關的事件
  • connection - 針對所有與網絡連接相關的事件
  • federation - 針對所有與federation相關的事件
  • mirroring -針對所有與 mirrored queues相關的事件

Default: [{connection, info}]

frame_max

與客戶端協商的允許最大frame大小. 設置為0表示無限制,但在某些QPid客戶端會引發bug. 設置較大的值可以提高吞吐量;設置一個較小的值可能會提高延遲.

Default: 131072

channel_max

與客戶端協商的允許最大chanel大小. 設置為0表示無限制.該數值越大,則broker使用的內存就越高.

Default: 0

channel_operation_timeout

Channel 操作超時時間(毫秒為單位) (內部使用,因為消息協議的區別和限制,不暴露給客戶端).

Default: 5000

heartbeat

表示心跳延遲(單位為秒) ,服務器將在connection.tune frame中發送.如果設置為 0, 心跳將被禁用. 客戶端可以不用遵循服務器的建議, 查看 AMQP reference 來了解詳情. 禁用心跳可以在有大量連接的場景中提高性能,但可能會造成關閉了非活動連接的網絡設備上的連接落下.

Default: 60 (3.5.5之前的版本是580)

default_vhost

當RabbitMQ從頭開始創建數據庫時創建的虛擬主機. amq.rabbitmq.log交換器會存在於這個虛擬主機中.

Default: <<"/">>

default_user

RabbitMQ從頭開始創建數據庫時,創建的用戶名.

Default: <<"guest">>

default_pass

默認用戶的密碼.

Default: <<"guest">>

default_user_tags

默認用戶的Tags.

Default: [administrator]

default_permissions

創建用戶時分配給它的默認Permissions .

Default: [<<".*">>, <<".*">>, <<".*">>]

loopback_users

只能通過環回接口(即localhost)連接broker的用戶列表

如果你希望默認的guest用戶能遠程連接,你必須將其修改為[].

Default: [<<"guest">>]

cluster_nodes

當節點第一次啟動的時候,設置此選項會導致集群動作自動發生. 元組的第一個元素是其它節點想與其建立集群的節點. 第二個元素是節點的類型,要么是disc,要么是ram

Default: {[], disc}

server_properties

連接時向客戶端聲明的鍵值對列表

Default: []

collect_statistics

統計收集模式。主要與管理插件相關。選項:

  • none (不發出統計事件)
  • coarse (發出每個隊列 /每個通道 /每個連接的統計事件)
  • fine (也發出每個消息統計事件)

你自已可不用修改此選項.

Default: none

collect_statistics_interval

統計收集時間間隔(毫秒為單位). 主要針對於 management plugin.

Default: 5000

auth_mechanisms

提供給客戶端的SASL authentication mechanisms.

Default: ['PLAIN', 'AMQPLAIN']

auth_backends

用於 authentication / authorisation backends 的列表. 此列表可包含模塊的名稱(在模塊相同的情況下,將同時用於認證來授權)或像{ModN, ModZ}這樣的元組,在這里ModN將用於認證,ModZ將用於授權.

在2元組的情況中, ModZ可由列表代替,列表中的所有元素必須通過每個授權的確認,如{ModN, [ModZ1, ModZ2]}. 這就允許授權插件進行組合提供額外的安全約束.

rabbit_auth_backend_internal外,其它數據庫可以通常 plugins來使用.

Default: [rabbit_auth_backend_internal]

reverse_dns_lookups

設置為true,可讓客戶端在連接時讓RabbitMQ 執行一個反向DNS查找, 然后通過 rabbitmqctl 和 管理插件來展現信息.

Default: false

delegate_count

內部集群通信中,委派進程的數目. 在一個有非常多核的機器(集群的一部分)上,你可以增加此值.

Default: 16

trace_vhosts

 tracer內部使用. 你不應該修改.

Default: []

tcp_listen_options

默認socket選項. 你可能不想修改這個選項.

Default:

[{backlog, 128}, {nodelay, true}, {exit_on_close, false}]

hipe_compile

將此選項設置為true,將會使用HiPE預編譯部分RabbitMQ,Erlang的即時編譯器.
這可以增加服務器吞吐量,但會增加服務器的啟動時間.
你可以看到花費幾分鍾延遲啟動的成本,就可以帶來20-50% 更好性能.這些數字與高度依賴於工作負載和硬件.

HiPE 支持可能沒有編譯進你的Erlang安裝中.如果沒有的話,啟用這個選項,並啟動RabbitMQ時,會看到警告消息. 例如, Debian / Ubuntu 用戶需要安裝erlang-base-hipe 包.

HiPE並非在所有平台上都可用, 尤其是Windows.

在 Erlang/OTP 17.5版本之前,HiPE有明顯的問題 . 對於HiPE,使用最新的OTP版本是高度推薦的.

Default: false

cluster_partition_handling

如何處理網絡分區.可用模式有:

  • ignore
  • pause_minority
  • {pause_if_all_down, [nodes], ignore | autoheal}where [nodes] is a list of node names
    (ex: ['rabbit@node1', 'rabbit@node2'])
  • autoheal

參考documentation on partitions 來了解更多信息

Default: ignore

cluster_keepalive_interval

節點向其它節點發送存活消息和頻率(毫秒). 注意,這與 net_ticktime是不同的; 丟失存活消息不會引起節點掉線

Default: 10000

queue_index_embed_msgs_below

消息大小在此之下的會直接內嵌在隊列索引中. 在修改此值時,建議你先閱讀  persister tuning 文檔.

Default: 4096

msg_store_index_module

隊列索引的實現模塊. 在修改此值時,建議你先閱讀  persister tuning 文檔.

Default: rabbit_msg_store_ets_index

backing_queue_module

隊列內容的實現模塊. 你可能不想修改此值.

Default: rabbit_variable_queue

msg_store_file_size_limit

Tunable value for the persister. 你幾乎肯定不應該改變此值。

Default: 16777216

mnesia_table_loading_timeout

在集群中等待使用Mnesia表可用的超時時間。

Default: 30000

queue_index_max_ journal_entries

Tunable value for the persister. 你幾乎肯定不應該改變此值。

Default: 65536

queue_master_locator

Queue master 位置策略. 可用策略有:

  • <<"min-masters">>
  • <<"client-local">>
  • <<"random">>

查看documentation on queue master location 來了解更多信息.

Default: <<"client-local">>

Demo:

[{rabbit,[{tcp_listen_options,[{backlog,128},{nodelay,true},{linger,{true,0}}]}]}]

更多配置相關信息請參考:

http://www.blogjava.net/qbna350816/archive/2016/08/02/431415.html

http://www.rabbitmq.com/configure.html


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM