Artemis分页(16)

    Artemis支持包含数百万条消息的庞大队列,但是服务器运行的内存有限。这种情况下,不可能将所有队列消息都存储在内存中,因此Artemis会在需要时将内存的消息分页到磁盘中,从而允许大量的队列占用较少的内存。当地址中所有消息占用内存大小超过配置的最大大小时,Artemis开始将消息分页到磁盘中。

1.页面文件

    在文件系统中消息按地址进行存储。每个地址都有一个单独的文件夹,其中消息分散的存储在多个文件(页面文件)中。每个文件拥有配置最大页面大小(page-size-bytes)的消息。系统将根据需要进行浏览,并且一旦所有消息都被确认,会立即删除页面文件。拥有选择器的消费者浏览页面文件,并且将忽略不匹配的消息。

    注意:如果有一个队列,并且消费者使用限制性很强的选择器进行过滤队列,可能会遇到这样的情况:从队列消费消息之前,将无法从中读取更多数据。

   例如:有一个消费者将选择器设置为“color =”red“',但是在一百万条数据中只有一条是红色并且在所有蓝色消息之后,在消费完蓝色消息之前无法消费红色消息。这与浏览不同,因为浏览是从整个队列中查找消息,同时我们从提供队列“删除”消息。

    可以通过paging-directory来配置分页文件存储目录,默认值为data/paging。

2.分页模式

    一旦传递的消息超过配置大小,该地址就会进入分页模式。

    注意:分页是按地址单独完成的, 如果为地址中配置max-size-bytes,则表示每个匹配的地址将具有指定的最大大小。 它并不是指所有匹配地址的总体大小限制为max-size-bytes。

2.1 配置

    在broker.xml中的分页配置如下:

<address-settings>
   <address-setting match="jms.someaddress">
      <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>

 

    参数说明如下:

Property Name

Description

Default

max-size-bytes

每个地址运行使用的最大内存大小

-1 (disabled)

page-size-bytes

在分页系统中每个分页地址的大小。

10MB

address-full-policy

此值必须设置为PAGE才能启用分页。如果值为PAGE,会将超额的消息分页到磁盘。如果值为DROP,则会默默的丢弃超额的消息。如果值为FAIL,消息将被丢弃客户端的生产者将受到异常。如果值为BLOCK,则会阻止客户端生产者发送更多的消息。

PAGE

page-max-cache-size

系统将保持page-max-cache-size设定的多少个页面文件存储在内存中,以便在分页导航期间优化IO

5

 

    除了在地址上设置max-size-bytes,还可以在主配置中设置global-max-size,如果设置了分页并且max-size-bytes=-1时,任然可以用global-max-size。当拥有的总消息量超过global-max-size配置时,任何新生成的消息都会使用分页。global-max-size默认值为java虚拟机最大内存的一半。

    系统将会定期扫描磁盘以确定磁盘是否超过所配置的限制大小。这个是通过max-disk-usage(百分比)进行配置的。达到该限制后,将阻止任何消息(除非协议不支持流控,否则将抛出异常并关闭这些客户端的连接)

2.2 其它消息用满内存时的策略

丢弃消息

    当消息大小达到配置的最大大小时,地址可以配置当地址内存用完时丢弃消息。通过配置address-full-policy为DROP实现。

丢弃消息并且向生产者抛出异常

    可以通过配置address-full-policy为FAIL,设置为当消息大小达到配置的最大大小时,地址可以丢弃消息bing并且客户端抛出一个异常。

阻塞生产者

    可以通过配置address-full-policy为BLOCK,设置当消息大小达到配置的最大大小时,阻塞生产者向地址发送更多的消息,避免服务器内存耗尽。当服务器上的内存释放后,生产者将自动解除阻塞能继续发送消息。

3.多个广播队列绑定一个地址

    当消息被路由到绑定多个广播队列的地址上时,例如,在JMS订阅topic中,内存中只存有一个消息副本,每个队列都引用此副本。当所有队列投递完此消息后,此消息才会从内存中释放。

     如果有一个延迟队列可能会对整个地址的性能造成影响,因为容易照成内存满导致开启分页。

    例如:

  • 一个地址绑定10个广播队列;
  • 其中一个队列没有投递消息
  • 消息不到到达地址,地址内存满开始进行分页。即使消息已发送并且其中9个队列是空的。

    在此示例中,所有其他9个队列将消费来自分页系统的消息。 这是一种不合适的状态,这可能会导致性能问题。

注:此系列文章为Apache Artemis V2.6.2官方使用文档的简要翻译文档(非完全按照官方文档排版进行翻译,有删减),个人能力有限如有错误请谅解。源文档地址:http://activemq.apache.org/artemis/docs/latest/index.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值