第 7 章 为地址配置内存用量
AMQ Broker 透明支持包含数百万消息的大型队列,即使托管代理的机器使用有限的内存运行。
在这些情况下,可以随时将所有队列存储在内存中。为防止过量内存用量,您可以配置代理上每个地址允许的最大内存用量。另外,您可以将代理配置为在地址的内存用量达到配置的限制时执行以下操作之一:
- 页面信息
- 静默丢弃信息
- 丢弃消息并通知发送的客户端
- 阻止客户端发送消息
如果您在达到地址的最大内存用量时将代理配置为页面信息,您可以将特定地址的限值配置为:
- 限制用于页面传入消息的磁盘空间
- 限制代理在客户端就绪使用消息时代理从磁盘传输回内存的内存。
您还可以设置磁盘用量阈值,该阈值会覆盖所有配置的分页限制。如果达到磁盘用量阈值,代理会停止分页并阻止所有传入的信息。
使用事务时,代理可能会分配额外的内存来确保事务一致性。在这种情况下,代理报告的内存用量可能没有反映内存中使用的字节数。因此,如果您根据指定的最大内存用量将代理配置为页面、丢弃或阻止消息,则您不应该使用事务。
7.1. 配置消息分页
对于指定最大内存用量限制的任何地址,您还可以指定代理达到该用量限制时执行的操作。您可以配置的一个选项是 分页。
如果您配置分页选项,当达到地址的最大大小时,代理开始将该地址的消息存储在磁盘上,称为 页面文件。每个页面文件都有您可以配置的最大大小。您以这种方式配置的每个地址在文件系统中都有一个专用文件夹来存储页的信息。
在检查队列中的消息时,队列浏览器和消费者都可以通过页面文件进行导航。但是,使用非常特定过滤器的消费者可能无法消耗存储在页面文件中的消息,直到队列中的现有消息被首先被消耗。例如,假设消费者过滤器包含一个字符串表达式,如 "color='red'
"。如果满足此条件的消息遵循 100 万带有属性为 "color='blue'"
的属性,则消费者将无法消费此消息,直到首先消费了 "color='blue'"
。
当客户端就绪使用时,代理传输(即,depages)消息从磁盘变为内存中。当确认该文件中的所有消息时,代理会从磁盘中删除一个页面文件。
以下过程演示了如何配置消息分页。
7.1.1. 指定分页目录
以下流程演示了如何指定分页目录的位置。
流程
-
打开 &
lt;broker_instance_dir> /etc/broker.xml
配置文件。 在
core
元素中,添加paging-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> <max-size-messages>20000</max-size-messages> <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"。 max-size-messages
-
代理在为
address-full-policy
属性指定的操作前允许地址的最大消息数。默认值为 -1,这意味着没有消息限制。 page-size-bytes
-
分页系统上使用的每个页面文件的大小(以字节为单位)。默认值为
10485760
(即 10 MiB)。您指定的值还支持字节表示法,如 "K"、"MB" 和 "GB"。 address-full-policy
代理达到地址的最大大小时执行的操作。默认值为
PAGE
。有效值为:页面
- 代理将任何其他信息记录到磁盘。
DROP
- 代理静默丢弃任何进一步的信息。
FAIL
- 代理丢弃任何进一步的信息,并给客户端消息制作者发出异常。
BLOCK
- 客户端消息制作者在尝试发送进一步消息时阻止。
如果您为
max-size-bytes
和max-size-message
属性设置了限制,代理会在达到任何一个限制时执行为address-full-policy
属性指定的操作。在上例中,当内存中地址的总消息超过 20,000 或使用 104857600 字节时,代理会启动my.paged.address
地址的分页消息。下面介绍了上例中 没有显示 的其他分页配置元素。
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-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> <global-max-messages>900000</global-max-messages> ... </core> </configuration>
global-max-size
代理可用于所有地址的内存量(以字节为单位)。当达到这个限制时,代理会为与每个传入消息关联的地址执行为
address-full-policy
属性指定的操作。global-max-size
的默认值为托管代理的 Java 虚拟机(JVM)的最大内存的一半。global-max-size
的值以字节为单位,但也支持字节表示法(例如:"K"、"Mb"、"GB")。在前面的示例中,代理配置为在处理消息时使用最多 1GB 可用内存。
global-max-messages
允许所有地址的消息总数。当达到这个限制时,代理会为与每个传入消息关联的地址执行为
address-full-policy
属性指定的操作。默认值为 -1,这意味着没有消息限制。如果您为
global-max-size
和global-max-messages
属性设置了限制,代理会在达到任何一个限制时执行为address-full-policy
属性指定的操作。使用上例中的配置,代理会在内存中消息数量超过 900,000 或使用 1 GB 可用内存时启动分页消息。注意如果为单个地址设置的限制(使用
max-size-bytes
或max-size-message
属性),则在为global-max-size
或global-max-messages
属性设置的限制之前,代理将执行为该地址的address-full-policy
属性指定的操作。
启动代理。
对于 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
元素中,添加属性来根据磁盘使用情况或消息数量指定分页限制,并在达到任何限制时指定要执行的操作。例如:<address-settings> <address-setting match="match="my.paged.address""> ... <page-limit-bytes>10G</page-limit-bytes> <page-limit-messages>1000000</page-limit-messages> <page-full-policy>FAIL</page-full-policy> ... </address-setting> </address-settings>
page-limit-bytes
-
在代理执行
page-full-policy
属性指定的操作前,允许为地址分页传入的消息的最大大小(以字节为单位)。您指定的值支持字节表示法,如 "K"、"MB" 和 "GB"。默认值为 -1,这意味着没有限制。 page-limit-messages
-
在代理执行为
page-full-policy
属性指定的操作前,地址的最大传入消息数。默认值为 -1,这意味着没有消息限制。 page-full-policy
代理在
page-limit-bytes
或page-limit-messages
属性中设置的限制为地址达到时执行的操作。有效值为:DROP The broker 静默丢弃任何进一步的信息。
FAIL the broker 会丢弃任何进一步的信息并通知发送的客户端
在上例中,代理页面会为
my.paged.address
地址分页信息,直到使用了 10 GB 的磁盘空间或直到所有 100万条消息都被被分页为止。
启动代理。
对于 Linux:
<broker_instance_dir>/bin/artemis run
对于 Windows:
<broker_instance_dir>\bin\artemis-service.exe start
7.1.5. 控制页消息到内存中的流
如果将 AMQ Broker 配置为将信息页到磁盘,代理会读取页面的信息,并在客户端准备好使用消息时将消息传送到内存中。要防止消息消耗过量内存,您可以限制代理从磁盘传输到内存的每个地址所使用的内存。
如果客户端应用程序缺少太多消息待处理确认,代理不会在确认待处理消息前读取页面消息,这会导致代理上出现消息不足。
例如,如果将页面消息传输到内存(默认为 20MB)的限值被访问,则代理会在读取任何更多消息前等待来自客户端的确认。如果同时,客户端在向代理发送确认前等待接收足够消息(由客户端使用的批处理大小决定),代理会耗尽消息。
为避免不足,可以将控制页面消息传输的代理限制增加到内存中,或减少传递消息的数量。您可以通过确保客户端很快提交消息确认,或使用超时和提交确认(不从代理接收更多消息)来减少发送消息的数量。
您可以在 AMQ 管理控制台中看到在队列的 Delivering Count
和 Delivering Bytes
指标中传递消息的编号和大小。
流程
-
打开 &
lt;broker_instance_dir> /etc/broker.xml
配置文件。 -
对于您为匹配地址或一组地址配置的
address-settings
元素,请指定将页消息传送到内存中的限制。例如:
address-settings> <address-setting match="my.paged.address"> ... <max-read-page-messages>104857600</max-read-page-messages> <max-read-page-bytes>20MB</max-read-page-bytes> ... </address-setting> </address-settings>
max-read-page-messages
最大的信息数,代理可以根据地址从磁盘读取到内存中。默认值为 -1,这意味着没有限制。
max-read-page-bytes
最大大小(以字节为单位)代理可以从磁盘读取到每个地址的内存。默认值为 20MB。
如果您同时为 max-read-page-messages
和 max-read-page-bytes
属性指定限制,代理会在达到任何限制时停止读取消息。
7.1.6. 设置磁盘用量阈值
您可以设置磁盘用量阈值,如果达到时,会导致代理停止分页并阻止所有传入的信息。
流程
停止代理。
对于 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>80</max-disk-usage> ... </core> </configuration>
max-disk-usage
代理可以使用的可用磁盘空间的最大百分比。当达到这个限制时,代理会阻止传入的信息。默认值为
90
。在上例中,代理限制为使用百分之八十的可用磁盘空间。
启动代理。
对于 Linux:
<broker_instance_dir>/bin/artemis run
对于 Windows:
<broker_instance_dir>\bin\artemis-service.exe start