消息、队列和交换机的限制是什么?

110
  1. 允许的消息类型有哪些(字符串、字节、整数等)?
  2. 消息的最大大小是多少?
  3. 队列和交换机的最大数量是多少?
3个回答

122

理论上,任何东西都可以作为消息存储/发送。你实际上不想在队列中存储任何东西。如果队列大部分时间都是空的,系统会更有效地工作。你可以使用两个前提条件将任何想要发送到队列的东西发送出去: 1. 你发送的东西可以转换为字节串并从字节串转换回来。 2. 消费者知道它得到了什么以及如何将其转换回原始对象。
字符串很容易处理,它们有一个内置的方法可以将其转换为字节并从字节转换回来。如果你知道它是一个字符串,那么你就知道如何将其转换回来。最好的选择是使用标记字符串,如 XML、JSON 或 YML。这样,你可以将对象转换为字符串,再将其转换回原始对象;它们可以跨编程语言工作,因此只要消费者知道如何理解对象,就可以用不同的语言编写消费者和生产者。 我使用 Java 进行开发。我希望能发送包含子对象的复杂消息。我使用自己的消息对象。该消息对象具有两个额外的方法 toBytes 和 fromBytes,用于将其转换为和从字节流中转换回来。我使用路由键,确保消费者接收到的消息类型无疑。该消息是可序列化的。这种方法很好,但是有限制,因为我只能将其用于其他 Java 程序。
消息的大小受服务器内存的限制,如果是持久化消息,则还受自由硬盘空间的限制。你可能不想发送太大的消息;最好发送一个文件或数据库的引用。 你可能还想了解他们的性能措施: http://www.rabbitmq.com/blog/2012/04/17/rabbitmq-performance-measurements-part-1/ http://www.rabbitmq.com/blog/2012/04/25/rabbitmq-performance-measurements-part-2/ 队列非常轻量级,你最可能会受到连接数的限制。这通常取决于服务器。以下是一些类似问题的信息: http://lists.rabbitmq.com/pipermail/rabbitmq-discuss/2009-February/003042.html

19

最大消息大小是多少?

在3.8.0版本之前,它曾经是2 GiB

%% Trying to send a term across a cluster larger than 2^31 bytes will
%% cause the VM to exit with "Absurdly large distribution output data
%% buffer". So we limit the max message size to 2^31 - 10^6 bytes (1MB
%% to allow plenty of leeway for the #basic_message{} and #content{}
%% wrapping the message body).
-define(MAX_MSG_SIZE, 2147383648).

参考:https://github.com/rabbitmq/rabbitmq-common/blob/v3.7.21/include/rabbit.hrl#L279

自版本3.8.0以来已经是512 MiB

%% Max message size is hard limited to 512 MiB.
%% If user configures a greater rabbit.max_message_size,
%% this value is used instead.
-define(MAX_MSG_SIZE, 536870912).

参考:https://github.com/rabbitmq/rabbitmq-common/blob/v3.8.0/include/rabbit.hrl#L238


5
  1. 请查看robthewolf的答案

  2. 最大消息大小为2GB,但是对于这样大小的消息进行性能调优并不有效。最大消息大小

  3. RabbitMQ服务器软件没有对队列数量设置硬限制,但是服务器运行的硬件可能会影响此限制。

3a. 默认情况下,服务器没有对队列长度设置限制。但是,可以通过服务器端策略(配置)或客户端策略来限制队列长度。最大队列长度

有关更多信息和链接,请参见相关帖子


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接