我正在運行一個分佈式應用程序(在多個服務器上運行)從我們運行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。
我加了'rabbitmqctl status'的輸出以及其他一些指標給我的問題。這些指標有什麼問題嗎?我找不到任何錯誤。 – Stefan
看起來你很大程度上被廣泛使用。你看過集羣嗎?此外,這是凌晨,所以我可能會誤讀,但它似乎是1GB的總使用率,這不是高IMO。 – theMayer
你是什麼意思?'你看看集羣?' - 我正在使用一個3節點的HA集羣。 – Stefan