第 7 章 为地址配置内存用量


AMQ Broker 透明地支持包含数百万消息的大型队列,即使托管代理的机器使用有限内存运行。

在这些情况下,可能无法随时将所有队列存储在内存中。要防止过量内存消耗,您可以配置代理上每个地址允许的最大内存用量。另外,您可以将代理配置为在内存用量达到配置的限制时执行以下操作之一:

  • 页面消息
  • 静默丢弃信息
  • 丢弃消息并通知发送客户端
  • 阻止发送消息的客户端

如果您在达到地址的最大内存用量时将代理配置为页面信息,您可以将特定地址的限制配置为:

  • 限制用于页面传入的消息的磁盘空间
  • 当客户端准备好使用消息时,限制代理从磁盘传输回内存的消息的内存。

您还可以设置磁盘用量阈值,以覆盖所有配置的分页限制。如果达到磁盘用量阈值,代理会停止分页并阻止所有传入的消息。

重要

使用事务时,代理可能会分配额外的内存以确保事务一致性。在这种情况下,代理报告的内存用量可能无法反映内存中使用的字节数。因此,如果您将代理配置为根据指定的最大内存用量将代理页面、丢弃或阻塞消息,则不应使用事务。

7.1. 配置消息分页

对于指定了最大内存用量限制的地址,您还可以指定达到该用量限制时代理所采取的操作。您可以配置的一个选项是 分页

如果您配置分页选项,当达到最大地址大小时,代理将开始将那个地址的消息存储在磁盘上,并保存在称为 页面文件 的文件中。每个页面文件都有一个您可以配置的最大大小。您以这种方式配置的每个地址在文件系统中有一个专用文件夹来存储页面的消息。

在检查队列中的消息时,浏览器和消费者都可以浏览页面文件。但是,使用非常具体的过滤器的消费者可能无法使用存储在页面文件中的消息,直到队列中的现有消息被首先被消耗为止。例如,假设使用者过滤器包含字符串表达式,如 "color='red' "。如果满足此条件的消息遵循 100 万带有属性为 "color='blue'" 的属性,则消费者将无法消费此消息,直到首先消费了 "color='blue'"

当客户端就绪使用时,代理传输(即,depages)消息从磁盘变为内存中。当该文件中的所有消息都已确认时,代理会从磁盘中删除页面文件。

重要

AMQ Broker 根据 JMS 消息优先级在队列中对待处理消息进行排序。但是,页面的消息不会按优先级排序。如果要保留排序,请不要足够配置分页和调整代理的大小,以在内存中保存所有信息。

7.1.1. 指定分页目录

以下流程演示了如何指定分页目录的位置。

流程

  1. 打开 & lt;broker_instance_dir> /etc/broker.xml 配置文件。
  2. core 元素中,添加 pages -directory 元素。指定文件系统中分页目录的位置。

    <configuration ...>
      <core ...>
        ...
        <paging-directory>/path/to/paging-directory</paging-directory>
        ...
      </core>
    </configuration>
    Copy to Clipboard Toggle word wrap

    对于您随后为分页配置的每个地址,代理会在您指定的分页目录中添加一个专用目录。

7.1.2. 为分页配置地址

以下流程演示了如何为分页配置地址。

先决条件

流程

  1. 打开 & lt;broker_instance_dir&gt; /etc/broker.xml 配置文件。
  2. 对于您为匹配地址 或一组 地址配置的 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>
    Copy to Clipboard Toggle word wrap
    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-bytesmax-size-message 属性设置了限制,代理会在达到任何限制时执行为 address-full-policy 属性指定的操作。在上例中,当内存中的地址总消息超过 20,000 或使用 104857600 字节可用内存时,代理会启动对 my.paged.address 地址的分页消息。

    上例中 没有显示 的额外分页配置元素如下所述。

    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 属性指定的操作。

以下流程演示了如何配置全局分页大小。

先决条件

流程

  1. 停止代理。

    1. 对于 Linux:

      <broker_instance_dir>/bin/artemis stop
      Copy to Clipboard Toggle word wrap
    2. 在 Windows 上:

      <broker_instance_dir>\bin\artemis-service.exe stop
      Copy to Clipboard Toggle word wrap
  2. 打开 & lt;broker_instance_dir&gt; /etc/broker.xml 配置文件。
  3. core 元素中,添加 global-max-size 元素并指定一个值。例如:

    <configuration>
      <core>
        ...
        <global-max-size>1GB</global-max-size>
        <global-max-messages>900000</global-max-messages>
        ...
      </core>
    </configuration>
    Copy to Clipboard Toggle word wrap
    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-sizeglobal-max-messages 属性设置了限制,代理会在达到任何限制时执行为 address-full-policy 属性指定的操作。使用上例中的配置时,当内存中的消息数量超过 900,000 或使用 1 GB 可用内存时,代理会启动所有地址的分页消息。

    注意

    如果为单个地址设置的限制,通过使用 max-size-bytesmax-size-message 属性在为 global-max- size 或 global-max -messages 属性设置的限值之前访问,代理会执行为该地址的 address-full-policy 属性指定的操作。

  4. 启动代理。

    1. 对于 Linux:

      <broker_instance_dir>/bin/artemis run
      Copy to Clipboard Toggle word wrap
    2. 在 Windows 上:

      <broker_instance_dir>\bin\artemis-service.exe start
      Copy to Clipboard Toggle word wrap

您可以在代理停止分页单个地址或地址集之前,限制代理可以使用的磁盘空间量。

流程

  1. 停止代理。

    1. 对于 Linux:

      <broker_instance_dir>/bin/artemis stop
      Copy to Clipboard Toggle word wrap
    2. 在 Windows 上:

      <broker_instance_dir>\bin\artemis-service.exe stop
      Copy to Clipboard Toggle word wrap
  2. 打开 & lt;broker_instance_dir&gt; /etc/broker.xml 配置文件。
  3. 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>
    Copy to Clipboard Toggle word wrap
    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 代理静默丢弃任何进一步的消息。

    FAIL。代理丢弃任何进一步的消息,并通知发送客户端

    在上例中,代理页面会为 my.paged.address 地址分页信息,直到使用了 10 GB 的磁盘空间或直到所有 100万条消息都被被分页为止。

  4. 启动代理。

    1. 对于 Linux:

      <broker_instance_dir>/bin/artemis run
      Copy to Clipboard Toggle word wrap
    2. 在 Windows 上:

      <broker_instance_dir>\bin\artemis-service.exe start
      Copy to Clipboard Toggle word wrap

7.1.5. 控制将页面消息流到内存中

如果 AMQ Broker 配置为将信息页面到磁盘,代理会读取页面的消息,并在客户端就绪使用消息时将信息传送到内存中。要防止消息消耗过量内存,您可以为代理从磁盘传输到内存的消息限制每个地址使用的内存。

重要

如果客户端应用程序缺少太多消息待处理确认,代理不会在确认待处理消息前读取页面消息,这会导致代理上出现消息不足。

例如,如果将页面消息传输到内存(默认为 20 MB)的限值被访问,则代理会在读取任何更多消息前等待来自客户端的确认。如果同时,客户端在向代理发送确认前等待接收足够消息(由客户端使用的批处理大小决定),代理会耗尽消息。

为避免不足,可以将控制页面消息传输的代理限制增加到内存中,或减少传递消息的数量。您可以通过确保客户端很快提交消息确认,或使用超时和提交确认(不从代理接收更多消息)来减少发送消息的数量。

您可以在 AMQ 管理控制台中看到在队列的 Delivering CountDelivering Bytes 指标中传递消息的编号和大小。

流程

  1. 打开 & lt;broker_instance_dir&gt; /etc/broker.xml 配置文件。
  2. 对于您为匹配地址或一组地址配置的 address-settings 元素,请指定 paged 消息传输为内存中的限制。例如:

    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>
    Copy to Clipboard Toggle word wrap

    max-read- page-messages 代理每个地址可以从磁盘读取的最大页面消息数。默认值为 -1,这意味着没有应用任何限制。

    max-read-page-bytes 最大大小(以字节为单位),代理可以从磁盘读取到每个地址的内存。默认值为 20 MB。

    当应用这些限制时,代理会计算内存中的消息,这些消息已准备好发送到当前提供的消费者和消息。如果消费者确认消息缓慢,发送消息可能会导致达到内存或消息限制,并阻止代理将新消息读取到内存中。因此,代理可能会耗尽消息。

  3. 如果消费者使用较慢来确认消息,并且当前提供的消息可以访问配置的 max-read-page-messagesmax-read-page-bytes 限制,请为当前提供的消息指定单独的限制。例如:

    address-settings>
        <address-setting match="my.paged.address">
            ...
            <prefetch-page-bytes>20MB</prefetch-page-bytes>
            <prefetch-page-messages>104857600</prefetch-page-messages>
            ...
        </address-setting>
    </address-settings>
    Copy to Clipboard Toggle word wrap

    预抓取页字节 内存(以字节为单位),可用于将页面消息读取到每个队列的内存。默认值为 20 MB。

    Prefetch-page-messages Number of paged 消息,代理可以从磁盘读取到每个队列的内存。默认值为 -1,这意味着没有应用任何限制。

    如果您为 prefetch-page-bytesprefetch-page-messages 参数指定限制当前交付的消息数量,请为 max-read-page- bytes 或 max-read-page -message 参数设置更高限制,以提供向内存中读取新消息的容量。

    注意

    如果在 prefetch-page-bytes 参数的值前达到 max-read-page-bytes 参数的值,代理将停止将进一步页面的消息读入内存中。

7.1.6. 设置磁盘用量阈值

您可以设置磁盘用量阈值,如果达到,则会导致代理停止分页并阻止所有传入的信息。

流程

  1. 停止代理。

    1. 对于 Linux:

      <broker_instance_dir>/bin/artemis stop
      Copy to Clipboard Toggle word wrap
    2. 在 Windows 上:

      <broker_instance_dir>\bin\artemis-service.exe stop
      Copy to Clipboard Toggle word wrap
  2. 打开 & lt;broker_instance_dir&gt; /etc/broker.xml 配置文件。
  3. core 元素中,添加 max-disk-usage 配置元素并指定一个值。例如:

    <configuration>
      <core>
        ...
        <max-disk-usage>80</max-disk-usage>
        ...
      </core>
    </configuration>
    Copy to Clipboard Toggle word wrap
    max-disk-usage

    代理可以使用的最大可用磁盘空间百分比。当达到这个限制时,代理会阻断传入的信息。默认值为 90

    在上例中,代理限制为使用百分之八十的可用磁盘空间。

  4. 启动代理。

    1. 对于 Linux:

      <broker_instance_dir>/bin/artemis run
      Copy to Clipboard Toggle word wrap
    2. 在 Windows 上:

      <broker_instance_dir>\bin\artemis-service.exe start
      Copy to Clipboard Toggle word wrap
返回顶部
Red Hat logoGithubredditYoutubeTwitter

学习

尝试、购买和销售

社区

关于红帽文档

通过我们的产品和服务,以及可以信赖的内容,帮助红帽用户创新并实现他们的目标。 了解我们当前的更新.

让开源更具包容性

红帽致力于替换我们的代码、文档和 Web 属性中存在问题的语言。欲了解更多详情,请参阅红帽博客.

關於紅帽

我们提供强化的解决方案,使企业能够更轻松地跨平台和环境(从核心数据中心到网络边缘)工作。

Theme

© 2025 Red Hat