第 8 章 处理大量消息
客户端可能会发送超过代理内部缓冲大小的大信息,从而导致意外错误。要防止这种情况,您可以将代理配置为在消息大于指定最小值时存储消息。以这种方式处理大量消息意味着代理不会在内存中保存消息。相反,您可以在磁盘或数据库表中指定代理存储大量消息文件的目录。
当代理将消息作为大消息存储时,队列会保留对大型消息目录或数据库表中的文件的引用。
核心协议、AMQP、OpenWire 和 STOMP 协议提供了大型消息处理。
对于 Core Protocol 和 OpenWire 协议,客户端在其连接配置中指定最小大消息大小。对于 AMQP 和 STOMP 协议,您可以在代理配置中为每个协议定义接受者中指定最小大消息大小。
建议您 不要将 不同的协议用于生成和消耗大型消息。要做到这一点,代理可能需要执行多个消息转换。例如,假设您要使用 AMQP 协议发送消息并使用 OpenWire 接收它。在这种情况下,代理必须首先读取大量消息的整个正文,并将其转换为使用内核协议。然后,代理必须执行另一个转换,此时到 OpenWire 协议。诸如此类的消息转换会导致代理上的大量处理开销。
您为上述任何协议指定的大型消息大小将受到系统资源(如可用磁盘空间量)以及消息的大小的影响。建议您使用多个值运行性能测试来确定适当的大小。
本节中的步骤演示了如何:
- 配置代理以存储大型信息
- 为大型消息处理配置 AMQP 和 STOMP 协议的接收器
本节还链接到用于配置 AMQ Core Protocol 和 AMQ OpenWire JMS 客户端的其他资源,以处理大型消息。
8.1. 为大型消息处理配置代理
以下流程演示了如何指定磁盘或者数据库表中的目录,该表会存储大量消息文件。
步骤
-
打开
<broker-instance-dir>/etc/broker.xml
配置文件。 指定代理存储大型消息文件的位置。
如果您在磁盘上存储大消息,请在
core
元素中添加large-messages-directory
参数并指定文件系统位置。例如:<configuration> <core> ... <large-messages-directory>/path/to/my-large-messages-directory</large-messages-directory> ... </core> </configuration>
注意如果您没有为
large-messages-directory
显式指定值,代理会使用默认值<broker-instance-dir>/data/largemessages
如果您在数据库表中存储大量消息,请将
large-message-table
参数添加到database-store
元素并指定值。例如:<store> <database-store> ... <large-message-table>MY_TABLE</large-message-table> ... </database-store> </store>
注意如果您没有为
large-message-table
明确指定值,则代理会使用默认值LARGE_MESSAGE_TABLE
。
其他资源
- 有关配置数据库存储的详情,请参考 第 6.3 节 “配置 JDBC 持久性”。