RabbitMQ-多个队列还是一个具有路由密钥的队列?

RabbitMQ-多个队列还是一个具有路由密钥的队列?,rabbitmq,Rabbitmq,我正在运行一个分布式应用程序(在多个服务器上运行),它从运行RabbitMQ集群的主后端服务器获取消息 然而,消息几乎都是相同的类型,但我为每个客户使用一个队列。 我注意到,我们的负载和内存使用率相当高——仅使用一个带有路由密钥的队列作为客户ID可以解决问题吗 目前,我为每个消费者使用一个通道,每个连接最多使用20个通道,因此访问rabbitmq服务器的一台服务器可以有多个连接。大约500-800个连接并不罕见 更新 以下是一些衡量标准: Connections: 748 Channels: 6

我正在运行一个分布式应用程序(在多个服务器上运行),它从运行RabbitMQ集群的主后端服务器获取消息

然而,消息几乎都是相同的类型,但我为每个客户使用一个队列。 我注意到,我们的负载和内存使用率相当高——仅使用一个带有路由密钥的队列作为客户ID可以解决问题吗

目前,我为每个消费者使用一个通道,每个连接最多使用20个通道,因此访问rabbitmq服务器的一台服务器可以有多个连接。大约500-800个连接并不罕见

更新

以下是一些衡量标准:

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 of node rabbit@masternode ...
[{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)每分钟生成大约50000条消息,消费者使用该队列而不自动确认

成功发送消息(或重试最多5次)后,将确认消息。也许这可以阻止一切?我将它设置为autoack,现在一切都运行得更顺畅了

我最初的问题是:我们的每个客户都有一个队列,该队列当前处于autoack状态。可能会发生这样的情况,其中一个客户突然没有客户,但这根本没有问题。那么,使用带有路由密钥的单个队列会提高性能吗


目前,我只是将没有路由密钥(或空路由密钥)的空exchange(默认exchange)直接发送到客户队列。消息是gzip-json,非常小,平均只有几kb。

就目前而言,连接和通道都是轻量级对象,尽管创建连接比创建通道(通道只是一个数据包命令)需要额外的过程和开销。我甚至不希望800个连接开始扩展RabbitMQ。内存使用和磁盘使用主要取决于队列中的消息数量,在某种程度上还取决于队列数量。如果没有关于应用程序吞吐量的详细信息,很难进一步推测,但我首先要确保您的生产者和消费者从数量的角度大致匹配


要了解有关内存使用情况的更多信息,请调用
rabbitmqctl status
(请参阅文档)

我在问题中添加了
rabbitmqctl status
的输出和一些其他指标。这些指标有问题吗?我没有发现任何错误。看起来你的使用率相当高。你研究过集群吗?另外,现在还很早,所以我可能误读了,但总使用量似乎是1gb,在我看来并不高。你所说的
是什么意思?你研究过集群吗?
-我正在使用一个3节点集群来处理HA队列。自从我问起,你的问题增加了很多。在任何情况下,看起来您的发布速度都快于消费速度。我们可以得到消息本身、路由逻辑、负载大小等的详细信息吗?RMQ会自动限制发布,以防止队列溢出。还有,有什么感兴趣的日志条目吗?我已经在我的问题中添加了一些内容。希望这能澄清一切。