第 7 章 为地址配置最大内存用量
AMQ Broker 以透明方式支持包含数百万消息的大量队列,即使托管代理的机器在内存有限的情况下运行。
在这些情况下,可能不会一次将所有队列存储在内存中。要防止过量内存消耗,您可以配置代理上每个地址允许的最大内存用量。另外,您可以指定当给定地址达到这个限制时代理执行的操作。
特别是,当地址的内存用量达到配置的限制时,您可以将代理配置为执行以下操作之一:
- 页面信息
- 静默丢弃信息
- 丢弃消息并通知发送客户端
- 阻止客户端发送消息
下面的部分演示了如何为地址配置最大内存用量,以及代理在达到地址限制时可以执行的操作。
当您使用事务时,代理可能会分配额外的内存以确保事务一致性。在这种情况下,代理报告的内存用量可能无法反映内存中使用的字节数。因此,如果您将代理配置为页面、丢弃或阻止基于指定最大内存用量的消息,则不应该使用事务。
7.1. 配置消息分页
对于指定了最大内存用量限制的任何地址,您还可以指定达到该用量限制时代理要执行的操作。您可以配置的其中一个选项是 分页。
如果您配置分页选项,当达到最大地址大小时,代理会开始将磁盘上的该地址的信息存储在称为 页面文件的文件中。每个页面文件具有您配置的最大大小。您以这种方式配置的每个地址在文件系统中都有一个专用文件夹来存储页面信息。
在检查队列中的消息时,队列浏览器和消费者都可以通过页面文件导航。但是,使用非常特定过滤器的使用者可能无法使用存储在页面文件中的消息,直到队列中的现有消息被消耗。例如,假设消费者过滤器包含字符串表达式,如 "color='red'"。
如果满足此条件的消息遵循一百万带有属性 "color='blue'"
的消息,则消费者无法使用消息,直到消息中 "color='blue'"
已被使用。
当客户端就绪使用时,代理传输(即,depages)消息从磁盘变为内存中。当确认了该文件中的所有消息时,代理会从磁盘中删除页面文件。
下面的步骤演示了如何配置消息分页。
7.1.1. 指定分页目录
以下流程演示了如何指定分页目录的位置。
流程
-
打开 &
lt;broker_instance_dir> /etc/broker.xml
配置文件。 在
core
元素中添加 pages-directory
元素。在文件系统中为分页目录指定一个位置。<configuration ...> <core ...> ... <paging-directory>/path/to/paging-directory</paging-directory> ... </core> </configuration>
对于您随后为分页配置的每个地址,代理会在您指定的分页目录中添加一个专用目录。
7.1.2. 为分页配置地址
以下流程演示了如何为分页配置地址。
先决条件
- 您应该熟悉如何配置地址和地址设置。更多信息请参阅 第 4 章 配置地址和队列。
流程
-
打开 &
lt;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 日志(即,在
broker.xml
配置文件中将journal-type
设为ASYNCIO
),则默认值为3333333
。如果您使用标准的 Java NIO 日志(即journal-type
设为NIO
),则默认值为journal-buffer-timeout
参数。
在前面的示例中,当发送到地址 my.paged.address
的消息超过内存中超过 104857600 字节时,代理开始分页。
如果您在 address-setting
元素中指定 max-size-bytes
,则该值将应用到 每个 匹配的地址。指定这个值 并不意味着 所有匹配地址 的总大小 限制为 max-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
-
打开 &
lt;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")在前面的示例中,代理配置为在处理消息时使用最多 1GB 可用内存。
启动代理。
在 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
-
打开 &
lt;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
。在上例中,当分页消息时,代理限制为使用 fifty 磁盘空间。
启动代理。
在 Linux 中:
<broker_instance_dir>/bin/artemis run
在 Windows 中:
<broker_instance_dir>\bin\artemis-service.exe start