Artemis流量控制(11)

    流控制用于限制客户端和服务器之间或服务器和另一个服务器之间的数据流,以防止客户端或服务器被数据淹没。

1.消费者流量控制

    当客户端在消费消息时可以控制服务器和客户端之间的数据流。出于性能原因,客户端通常在通过receive()方法传递消息给使用者之前缓冲消息,或者通过消息监听器异步地缓冲消息。 如果消费者无法像传递消息那样快速处理消息并将其存储在内部缓冲区中,那么最终可能会出现消息不断累积的情况,如果无法及时处理消息,可能导致客户端内存不足。

1.1 基于窗口的流量控制

    默认情况下,Artemis消费者在客户端消费消息之前会将来自服务端的消息缓存起来。这提高了性能:否则每次客户端消费完一条消息,Artemis都必须到服务器请求下一条消息。反过来消息将被推送到客户端(如果有的话)。

    同时每条消息都会涉及到一次网络往返,大大降低了性能。为了防止这种情况,Artemis预先将消息推送到每个消费者缓冲区中。每个消费者能缓存消息的总大小(以字节为单位)由consumerWindowSize参数决定。默认情况下,consumerWindowSize设置为1 MiB(1024 * 1024字节)。其值可以被设置为:

  • -1表示无界缓冲区
  • 0表示不缓存任何消息
  • >0设定具有指定最大大小(以字节为单位)的缓冲区

    根据消息投递测试用例,设置使用缓存窗口大小可以显著提高性能。可以使用如下两个极端的例子:

快消费者

    快消费者指的是可以尽快的消费消息(甚至更快),要使用快消费者可以将consumerWindowSize设置为-1。 这将允许客户端无限制的消息缓冲。请谨慎使用此设置:如果消费者无法像接收消息那样快速处理消息,则可能会导致客户端内存溢出。

慢消费者

    慢消费者指的是需要花费大量时间来处理每个消息,并且希望不在客户端上缓存消息,以便可以将消息传递给另一个消费者。

    设想一个队列有2个消费者的情况;其中1个是慢消费者。消息以轮询的方式传递给消费者,快速消费者非常快速地处理其所有消息,直到其缓冲区为空。此时在慢速消费者的缓冲区中任然有等待处理的消息,从而防止它们被快速消费者处理。因此,快速消费者处于等待处理其他消息的空闲状态。

    如果要设置慢消费者,将URI上的consumerWindowSize设置为0(完全没有缓冲区)。这将防止缓慢的消费者在客户端上缓冲任何消息。消息将保留在服务器端,准备好供其他消费者使用。将此值设置为0可以在队列中的多个使用者之间提供确定性的分布。

     大多数消费者不能被明确地识别为快速或慢速消费者,而是介于两者之间。在这种情况下,设置consumerWindowSize的值以优化性能,这取决于消息投递的用例,并且需要一定标准来寻找最佳值,但在大多数情况下,1MiB的值很好。

1.2 基于限速的流量控制

    通过对消费者的消费消息速率进行控制,可以确保消费者永远不会使用比指定速率更快的速度进行消费,这是使用URI中的consumerMaxRate参数配置的。速率必须是正整数才能启用此功能,并且是以每秒消息数为单位指定的最大所需消息消费速率。 将此值设置为-1将禁用速率限制流量控制。 默认值为-1。

    注意:速率限制流量控制可以与基于窗口的流量控制结合使用。 速率限制流控制仅影响客户端在一秒钟内可以消耗多少消息,而不影响其缓冲区中有多少消息。 因此,如果您的速率限制较快且基于窗口的限制较低,则客户端内部缓冲区很快就会填满消息。

2.生产者流量控制

    Artemis还可以现在从客户端发送到服务器的数据量,以防止服务器被数据淹没。

2.1 基于窗口的流量控制

    与基于窗口流量控制的消费者类似,默认情况下,Artemis的生产者只有在拥有足够的信用额度才能将消息发送到服务器的地址中。发送消息所需的信用额度由消息的大小决定。生产者的信用额度较低时,他们要从服务器请求更多的额度,当服务器给生产者更多的额度时,他们可以发送更多的消息。生产者一次请求的信用额度量称为窗口大小,它由URI中的producerWindowSize参数控制。

    因此,窗口大小决定了在需要更多请求之前的任何时间点上所拥有的字节数量 - 这可以防止远程连接过载。

2.1.1 阻塞CORE客户端生产者

    当使用CORE协议时(Artemis CORE客户端和Artemis JMS客户端使用),服务器将始终给与请求数量相同的信用额度。然而,也可以为任何地址设置最大大小,当超过了地址上设定的内存限制,服务器将永远不会给与任何一个生产者更多的信用额度。尽管单个生产者将获得比可用的更多的信用额度(在发布时)。当同一个地址上有多个生产者时,理论上所有生产者中所分配的信用额度可能会超过可用的数量。

    例如,有一个名为“myqueue”的队列,将其最大内存设置为10MiB,并且服务器将控制发送给任何生产者的信用额度的数量,这些生产者发送到“myqueue”任何消息其在队列中的总量永远都不会超过10MiB。

    当地主变满时,生产者将在客户端堵塞,直到地址释放出更多的空间,即消息从队列中被消费了,从而释放了空间以便发送更多消息。我们称堵塞为生产者的流控制,并且其为防止服务器因发送的消息超出处理速度而导致内存耗尽。

    还有一种替代方式就是分页,它不会阻塞生产者而是将消息进行分页存储。

    当地址空间满时要阻塞生产者,需要配置地址所拥有的最大内存空间。可以通过在地址配置中设置max-size-bytes 和 address-full-policy来使其生效。地址阻塞适用于注册到该地址的所有队列,即绑定到该地址的所有队列所用的总内存不会超过max-size-bytes。对应JMS的topic此意味着主题总所有订阅的总内存不会超过max-size-bytes。

    配置例子如下

<address-settings>
   <address-setting match="exampleQueue">
      <max-size-bytes>100000</max-size-bytes>
      <address-full-policy>BLOCK</address-full-policy>
   </address-setting>
</address-settings>

 

    注意,在默认配置中,所有的地址在内存使用达到10MiB时都会阻塞生产者。此意味着不能发送超过10MiB的消息到某个地址,在其消息被消费之前生产者会处于阻塞状态。如果不希望有此行为可以增加max-size-bytes的值或者更改address-full-policy的策略。

    broker分配信用额度给生产者客户端。流控制信用额度检查仅在客户端完成(即检查生产者有足够的信用额度)。broker可能分配过多的信用额度,例如上面描述的多生产者案例。行为不恰当的客户端也可能忽略broker发出的流量控制信号,并在没有足够的信用额度情况下发送消息。

2.1.2 阻塞AMPQ生产者

    Artemis支持的协议中有两种支持流量控制。CORE和AMQP。两种协议实现的流控制略有不同,因此对于分别使用每种协议的客户端,解决完整BLOCK策略的行为略有不同。

    如本章前面所述,CORE协议使用生产者窗口大小流量控制系统。分配给生产者信用额度(代表字节),如果生产者想要发送消息,它应该等到它有足够的字节信用额度来可提供它发送。 AMQP流控制信用额度不代表字节,而是表示允许生产者发送的消息数(不管消息大小如何)。

    AMQP的BLOCK与上面的生产者窗口大小使用相同的方式工作。 Artemis将一次性向客户发放100个信用额度,并在信用额度达到30时将进行刷新。broker将在地址满员后停止发放信用额度。但是,由于AMQP信用表示整个消息而不是字节,因此在某些情况下,如果代理继续接受消息直到客户信用额度用尽,则AMQP客户端可能会显著超过地址上限。因此,地址设置上有一个额外的参数,用于指定地址大小的上限(以字节为单位)。达到此上限后,Artemis将开始拒绝AMQP消息。此限制是max-size-bytes-reject-threshold,默认情况下设置为-1(或无限制)。这是附加参数一种软硬相间的限制,在正常情况下,代理将使用流量控制来使用max-size-bytes参数,但是一旦达到地址的max-size-bytes-reject-threshold设置为了保护broker将拒绝消息。

2.2 基于限速的流量控制

    Artemis还允许生产者可以以每秒消息量为单位限制消息发送的速率。通过指定这样的速率,Artemis将确保生产者永远不会以高于指定的速率发送消息。这由URL中producerMaxRate参数控制。

    producerMaxRate必须是一个正整数才能启用此功能,并且是以每秒消息数为单位,指定的最大消息发送速率。将此值设置为-1将禁用速率限制流量控制。默认值为-1。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值