2015-12-10 40 views
1

我正在運行一個分佈式應用程序(在多個服務器上運行)從我們運行RabbitMQ集羣的主後端服務器獲取消息。RabbitMQ - 許多隊列還是帶路由密鑰的隊列?

但是,這些消息幾乎都是同一種類型,但我爲每個客戶使用一個隊列。 我注意到我們的負載&內存使用率非常高 - 只能使用一個帶路由密鑰的隊列作爲客戶ID來解決問題?

目前,我爲每個消費者使用一個通道,每個連接使用最多20個通道 - 因此訪問rabbitmq服務器的一臺服務器可以有多個連接。大約500-800個連接並不罕見。

UPDATE

這裏有一些指標:

Connections: 748 
Channels: 6577 
Exchanges: 8 
Queues: 1590 
Consumers: 1098 
Messages Total: 153.394 
Messages unacked: 152.848 
Acknowledge: 2674/s 
Publish: 704/s 
Deliver: 586/s 

而且rabbitmqctl status輸出:

Status of node [email protected] ... 
[{pid,10814}, 
{running_applications, 
    [{rabbitmq_management,"RabbitMQ Management Console","3.5.6"}, 
     {rabbitmq_web_dispatch,"RabbitMQ Web Dispatcher","3.5.6"}, 
     {webmachine,"webmachine","1.10.3-rmq3.5.6-gite9359c7"}, 
     {mochiweb,"MochiMedia Web Server","2.7.0-rmq3.5.6-git680dba8"}, 
     {rabbitmq_management_agent,"RabbitMQ Management Agent","3.5.6"}, 
     {rabbit,"RabbitMQ","3.5.6"}, 
     {os_mon,"CPO CXC 138 46","2.2.14"}, 
     {inets,"INETS CXC 138 49","5.9.7"}, 
     {mnesia,"MNESIA CXC 138 12","4.11"}, 
     {amqp_client,"RabbitMQ AMQP Client","3.5.6"}, 
     {xmerl,"XML parser","1.3.5"}, 
     {sasl,"SASL CXC 138 11","2.3.4"}, 
     {stdlib,"ERTS CXC 138 10","1.19.4"}, 
     {kernel,"ERTS CXC 138 10","2.16.4"}]}, 
{os,{unix,linux}}, 
{erlang_version, 
    "Erlang R16B03 (erts-5.10.4) [source] [64-bit] [smp:32:32] [async-threads:64] [kernel-poll:true]\n"}, 
{memory, 
    [{total,1093604792}, 
     {connection_readers,8069400}, 
     {connection_writers,6168304}, 
     {connection_channels,115667448}, 
     {connection_other,20448952}, 
     {queue_procs,526134000}, 
     {queue_slave_procs,3045928}, 
     {plugins,1638160}, 
     {other_proc,20891248}, 
     {mnesia,5975616}, 
     {mgmt_db,63193376}, 
     {msg_index,2245016}, 
     {other_ets,3895632}, 
     {binary,214973160}, 
     {code,20000582}, 
     {atom,703377}, 
     {other_system,80554593}]}, 
{alarms,[]}, 
{listeners,[]}, 
{vm_memory_high_watermark,0.4}, 
{vm_memory_limit,54036645478}, 
{disk_free_limit,50000000}, 
{disk_free,100918980608}, 
{file_descriptors, 
    [{total_limit,49900}, 
     {total_used,1231}, 
     {sockets_limit,44908}, 
     {sockets_used,243}]}, 
{processes,[{limit,1048576},{used,15377}]}, 
{run_queue,1}, 
{uptime,2241834}] 

發佈,有時交付拖延(走得很低)

更新2

日誌中沒有顯示任何內容,並且當驅動程序阻塞時,java驅動程序不會調用回調。

我有幾個用例,例如用於批量加載到我們的搜索服務器(solr)中的文檔。許多生產商(> 50)每分鐘生成大約50.000條消息,並且消費者使用該隊列而無需自動支持。

郵件成功發送(或重試最多5次)後,郵件將被查詢。也許這可能會阻止一切?我把它設置爲autoack,現在一切運行得更順暢。

我最初的問題是:我們的每個客戶都有一個單獨的隊列,當前使用的是自動包裝。可能發生的情況是,其中一個客戶突然沒有客戶,但這完全沒有問題。那麼,使用具有路由密鑰的單個隊列可以提高性能?

目前我只是發送到一個沒有路由密鑰(或空路由密鑰)直接到客戶隊列的空白交換(默認交換)。消息是gzip json,非常小,平均只有幾kb。

回答

1

就目前而言,連接和通道都是輕量級對象,但創建連接時需要額外的流程和開銷,而不是通道,這只是單包命令。我不希望800連接甚至開始拉伸RabbitMQ。內存使用和磁盤使用主要由位於隊列中的消息數量以及某種程度上由隊列數量決定。沒有關於應用程序吞吐量的細節,很難進一步推測,但我會從確保生產者和消費者從卷的角度大致匹配開始。

要了解有關使用內存的更多信息,請調用rabbitmqctl status(請參閱文檔here)。

+0

我加了'rabbitmqctl status'的輸出以及其他一些指標給我的問題。這些指標有什麼問題嗎?我找不到任何錯誤。 – Stefan

+0

看起來你很大程度上被廣泛使用。你看過集羣嗎?此外,這是凌晨,所以我可能會誤讀,但它似乎是1GB的總使用率,這不是高IMO。 – theMayer

+0

你是什麼意思?'你看看集羣?' - 我正在使用一個3節點的HA集羣。 – Stefan