ActiveMQ消息接收模式

消息接收模式

消息都是从Broker传输到Client,默认情况下Broker会主动将消息PUSH至Client,当然也可以通过配置改为Client主动从Broker PULL消息,参考: http://activemq.apache.org/slow-consumer-handling.html

  • PUSH模式

默认情况下,Broker会主动将消息PUSH至Client,这样做的目的是为了让消息能够即时到达Client,以最快的速度被消费。每个队列默认最多PUSH 1000条消息,当达到这个限制后,需要在已推送的消息中收到确认后才会继续推送消息。

  • PULL模式

如果遇到慢Consumer,每个消息的处理比较耗时的话,PUSH模式就可能将消息积压在Message Consumer的Unconsumed Message Queue中,一旦造成积压,继续添加更多的Consumer也无济于事,因为Broker已将消息推送出去,在得到确认前不会继续推送,因此可能造成部分消息长时间得不到处理。如果达到了PUSH的最大消息量限制,新到达的消息同样得不到即时处理,最终造成恶性循环。好在ActiveMQ支持Client主动PULL模式,在这种模式下,Broker不再主动推送消息,仅当收到Client的PULL Request后才向Client发送一条消息。这样消息一直在Broker中,通过简单的增加Consumer数量就可以加快消息的整体处理速度。

转自:http://jhat.pw/blog/2015/11/30/activemq-client-principle.html

-----------------------------------------

    如果prefetchACK为true,那么prefetch必须大于0;当prefetchACK为false时,你可以指定prefetch为0以及任意大小的正数。不过,当prefetch=0是,表示consumer将使用PULL(拉取)的方式从broker端获取消息,broker端将不会主动push消息给client端,直到client端发送PullCommand时;当prefetch>0时,就开启了broker push模式,此后只要当client端消费且ACK了一定的消息之后,会立即push给client端多条消息。

     当consumer端使用receive()方法同步获取消息时,prefetch可以为0和任意正值;当prefetch=0时,那么receive()方法将会首先发送一个PULL指令并阻塞,直到broker端返回消息为止,这也意味着消息只能逐个获取(类似于Request<->Response),这也是Activemq中PULL消息模式;当prefetch > 0时,broker端将会批量push给client 一定数量的消息(<= prefetch),client端会把这些消息(unconsumedMessage)放入到本地的队列中,只要此队列有消息,那么receive方法将会立即返回,当一定量的消息ACK之后,broker端会继续批量push消息给client端。

     当consumer端使用MessageListener异步获取消息时,这就需要开发设定的prefetch值必须 >=1,即至少为1;在异步消费消息模式中,设定prefetch=0,是相悖的,也将获得一个Exception。

转自:https://shift-alt-ctrl.iteye.com/blog/2020182

猜你喜欢

转载自blog.csdn.net/u010002184/article/details/89423316