第 7 章 为地址配置最大内存用量
AMQ Broker 以透明的方式支持包含数百万消息的大型队列,即使托管代理的机器运行的内存有限。
在这些情况下,可能无法在任意时间将所有队列存储在内存中。要防止过量内存消耗,您可以配置代理上每个地址允许的最大内存用量。另外,您可以指定在给定地址达到这个限制时代理采取什么操作。
特别是,当地址的内存用量达到配置的限制时,您可以将代理配置为执行以下操作之一:
- 页面信息
- 静默丢弃消息
- 丢弃消息并通知发送的客户端
- 阻止客户端发送消息
下面的部分演示了如何为地址配置最大内存用量,以及在达到地址限制时代理可以执行的对应操作。
当您使用事务时,代理可能会分配额外的内存来确保事务一致性。在这种情况下,代理报告的内存用量可能无法反映内存中使用的字节总数。因此,如果您根据指定的最大内存用量将代理配置为页面、丢弃或阻止信息,则不应该使用事务。
7.1. 配置消息分页
对于指定最大内存用量限制的任何地址,您还可以指定达到用量限制时代理执行的操作。您可以配置的一个选项是 分页。
如果您配置分页选项,达到地址的最大大小时,代理会开始将该地址的消息存储在磁盘上,称为 页面文件。每个页面文件都有一个您可以配置的最大大小。以这种方式配置的每个地址在您的文件系统中都有一个用于存储分页消息的专用文件夹。
在检查队列中的消息时,队列浏览器和消费者都可以在页面文件中导航。但是,在首先使用队列中的现有消息之前,使用非常具体的过滤器的消费者可能无法使用存储在页面文件中的消息。例如,假定使用者过滤器包含字符串表达式,如 "color='red'"。
如果满足此条件的消息遵循一百万条带有属性 "color='blue'"
的消息,则使用者将无法使用该消息,直到首先使用 "color='blue'"
的消息。
当客户端准备好使用时,代理将消息从磁盘传输(即 解页)到内存中。当该文件中的所有消息都已确认后,代理会从磁盘中删除页面文件。
以下流程演示了如何配置消息分页。
7.1.1. 指定分页目录
以下步骤演示了如何指定分页目录的位置。
流程
-
打开
<broker_instance_dir>/etc/broker.xml
配置文件。 在
core
元素内,添加分页目录
元素。指定文件系统中分页目录的位置。<configuration ...> <core ...> ... <paging-directory>/path/to/paging-directory</paging-directory> ... </core> </configuration>
对于您随后为分页配置的每个地址,代理会在您指定的分页目录中添加一个专用目录。
7.1.2. 配置地址以进行分页
以下步骤演示了如何为分页配置地址。
先决条件
- 您应该熟悉如何配置地址和地址设置。如需更多信息,请参阅 第 4 章 配置地址和队列。
流程
-
打开
<broker_instance_dir>/etc/broker.xml
配置文件。 对于您为匹配地址或地址 集 配置的
address-setting
元素,添加配置元素以指定最大内存使用量并定义分页行为。例如:<address-settings> <address-setting match="my.paged.address"> ... <max-size-bytes>104857600</max-size-bytes> <page-size-bytes>10485760</page-size-bytes> <address-full-policy>PAGE</address-full-policy> ... </address-setting> </address-settings>
max-size-bytes
-
代理执行为
address-full-policy
指定策略之前,地址允许的最大内存大小,以字节为单位。默认值为-1
,这意味着没有限制。您指定的值还支持字节表示法,如 "K"、"MB" 和 "GB"。 page-size-bytes
-
分页系统中使用的每个页面文件的大小(以字节为单位)。默认值为
10485760
(即 10 MiB)。您指定的值还支持字节表示法,如 "K"、"MB" 和 "GB"。 address-full-policy
代理在达到地址最大值时执行的操作。默认值为
PAGE
。有效值为:页面
- 代理将进一步的信息传输到磁盘。
DROP
- 代理会静默丢弃任何进一步的信息。
FAIL
- 代理会向客户端消息制作者丢弃任何其他消息和问题。
BLOCK
- 当客户端消息制作者尝试发送更多消息时,它们会阻止它们。
以上示例中 未显示 的其他分页配置元素如下所述。
page-max-cache-size
-
代理保留在内存中的页面文件数量,以便在分页导航期间优化 IO。默认值为
5
。 page-sync-timeout
-
定期页面同步之间的时间(以纳秒为单位)。如果您使用异步 IO 日志(即
journal-type
在broker.xml
配置文件中被设置为ASYNCIO
),则默认值为3333333
。如果您使用标准 Java NIO 日志(即journal-type
设置为NIO
),则默认值是journal-buffer-timeout
参数的配置值。
在前面的示例中,当发送到地址 my.paged.address
的消息超过内存 104857600 字节时,代理将开始分页。
如果在 address
,则该值将应用到 每个 匹配地址。指定这个值 并不意味着 所有匹配地址 的总 大小都仅限于 -setting 元素中指定了 max-size-
bytesmax-size-bytes
的值。
7.1.3. 配置全局分页大小
有时,每个地址 配置内存限制是不现实的,例如,当代理管理许多使用模式的地址时。在这些情况下,您可以指定一个全局内存限值。全局限制是代理可用于所有地址的内存 总量。达到此内存限制时,代理会为与新传入消息关联的地址执行为 address-full-policy
指定的策略。
以下步骤演示了如何配置全局分页大小。
先决条件
- 您应该熟悉如何配置地址以进行分页。如需更多信息,请参阅 第 7.1.2 节 “配置地址以进行分页”。
流程
停止代理。
在 Linux 中:
<broker_instance_dir>/bin/artemis stop
在 Windows 中:
<broker_instance_dir>\bin\artemis-service.exe stop
-
打开
<broker_instance_dir>/etc/broker.xml
配置文件。 在
core
元素中,添加global-max-size
元素并指定一个值。例如:<configuration> <core> ... <global-max-size>1GB</global-max-size> ... </core> </configuration>
global-max-size
代理可用于所有地址的内存总量,以字节为单位。达到这个限制时,对于与传入消息关联的地址,代理会执行指定为
address-full-policy 值的策略
。global-max-size
的默认值是托管代理的 Java 虚拟机(JVM)可用的最大内存的一半。global-max-size
的值以字节为单位,但也支持字节表示法(例如:"K"、"Mb"、"GB")。在前面的示例中,代理被配置为在处理消息时最多使用一千兆字节的可用内存。
启动代理。
在 Linux 中:
<broker_instance_dir>/bin/artemis run
在 Windows 中:
<broker_instance_dir>\bin\artemis-service.exe start
7.1.4. 在分页过程中限制磁盘用量
您可以在代理阻止传入消息而不是分页信息前限制代理可以使用的物理磁盘空间量。
以下流程演示了如何在分页期间设置磁盘用量限制。
流程
停止代理。
在 Linux 中:
<broker_instance_dir>/bin/artemis stop
在 Windows 中:
<broker_instance_dir>\bin\artemis-service.exe stop
-
打开
<broker_instance_dir>/etc/broker.xml
配置文件。 在
core
元素中添加max-disk-usage
配置元素并指定一个值。例如:<configuration> <core> ... <max-disk-usage>50</max-disk-usage> ... </core> </configuration>
max-disk-usage
代理在分页消息时可使用的可用磁盘空间的最大百分比。达到这个限制时,代理会阻止传入的信息,而不是分页它们。默认值为
90
。在前面的示例中,代理仅在分页消息时使用 50% 的磁盘空间。
启动代理。
在 Linux 中:
<broker_instance_dir>/bin/artemis run
在 Windows 中:
<broker_instance_dir>\bin\artemis-service.exe start