ActiveMQ流控

生产者流控
从5.x版本起,可以给每个producer单独设置流控。流控简单的说就是控制生产者的在内存使用限制下的行为。当然,流控的目的在于防止在将ActiveMQ作为内存MQ使用时,生产速度大于消费速度时将MQ撑爆的问题。

分两个情况:
1、 同步发送消息(useAsynSend为false):此时将在SystemUsage的限制下,使用destinationPolicy中的policyEntry中的限制,例如:
<destinationPolicy>
  <policyMap>
    <policyEntries>
      <policyEntry queue="queueA"producerFlowControl="true"memoryLimit="1mb">   
  <pendingQueuePolicy>
    <vmQueueCursor/>
  </pendingQueuePolicy>
</policyEntry>
    </policyEntries>
  </policyMap>
</destinationPolicy>

限制非持久化时queueA 的内存使用量为1mb,达到这个内存使用量时直接阻塞掉producer,直到有空余的内存时,才允许producer发送消息。
也可通过在systemUsage配置上设置sendFailIfNoSpace="true"或 sendFailIfNoSpaceAfterTimeout="3000"来控制客户端异常和等待时间。

2、异步发送时,由于不阻塞生产者,
可以通过connctionFactory.setProducerWindowSize(1024000);
来控制broker确认收到消息前生产者能发送的最大数据量(字节)。

消费者流控
消费者端,一般来说消费的越快越好,broker的积压越小越好。
但是考虑到事务性和客户端确认的情况,如果一个消费者一次获取到了很多消息却都不确认,这会造成事务上下文变大,broker端这种“半消费状态”的数据变多,所以ActiveMQ有一个prefetchSize参数来控制未确认情况下,最多可以预获取多少条记录。

可以通过3中方式设置prefetchSize
1、tcp://localhost:61616?jms.prefetchPolicy.all=50
2、tcp://localhost:61616?jms.prefetchPolicy.queuePrefetch=1
3、queue = new ActiveMQQueue("TEST.QUEUE?consumer.prefetchSize=10");
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值