最进公司负责新的业务,使用了amq。写完后再部署consmuer的时候,产生了疑问。到底这个consumer 的高可用策略是怎么样的?启动多个到底行不行?问了公司的几个老人,也没说出个所以然来。fuck!自己google,官方文档。
终于看到了些眉目,下面总结下:
基于amq的高可用方案分为 3个层次。
1、生产者的高可用
生产者的高可用和负载均衡,一般是靠外围程序控制。比如,基于Tomcat的web程序作为生产者,那么这个web程序的高可用,需要靠tomcat等外围程序。目前一般我们的web程序都是多个点的,负载已经做好,所以我们所以一般所说的高可用,主要指Broker和Consumer。
2、Broker 高可用方案
这个目前文档挺多的,这里就不再过多说了,这篇两篇档写的还是很不错的。
http://www.cnblogs.com/xumanbu/p/4740381.html
http://bh-keven.iteye.com/blog/1617788
3、 消费者高可用方案(consumer clusters)
这里想多说下,目前网上讨论这个方案的还不是很多,因为amq 帮我们已经做好。可以我这个人就是爱较真,非得知道个所以然来,只能自己google和翻看官方文档。
首先我先列举下目前网络上的介绍。
(1)同一个queue,如果一个consumer失效,那么未被确认的消息都会被发送到这个queue的其它consumer上。
如果某个consumer处理消息比较快,那么它将处理更多的消息。
问题:具体的策略有哪些?如何配置?
(2)stackoverflow 上的 http://stackoverflow.com/questions/5005747/queue-consumer-clusters-with-activemq。
看了这个回复还是有点收获的。
说到这就不得不说prefetch buffers(预取缓冲区) 了。(http://activemq.apache.org/what-is-the-prefetch-limit-for.html)
具体看到官网才了解到amq是基于SEDA(Staged Event Driven Architecture) 的异步架构。了解到amq是推的模式(区别于kafka 啦的模式)。这是信息消费的自然结果通常是比消息传递慢得多,所以amq 增加prefetch limit 限制发送到消费端的个数限制,防止其被冲垮。当消费者处理一半后,amq又会推送消息到prefetch buffers 中。 (摘自 http://activemq.apache.org/what-is-the-prefetch-limit-for.html)
回过来说consumer的负载处理,http://activemq.apache.org/dispatch-policies.html 这里已经说得很清楚了,默认是使用轮询推送到消费者、或是顺序推送(消费者的预取缓冲器将耗尽在调度过程中选择下一个消费者)。
<dispatchPolicy>
<roundRobinDispatchPolicy />
<!--<strictOrderDispatchPolicy /> -->
终于看到了些眉目,下面总结下:
基于amq的高可用方案分为 3个层次。
1、生产者的高可用
生产者的高可用和负载均衡,一般是靠外围程序控制。比如,基于Tomcat的web程序作为生产者,那么这个web程序的高可用,需要靠tomcat等外围程序。目前一般我们的web程序都是多个点的,负载已经做好,所以我们所以一般所说的高可用,主要指Broker和Consumer。
2、Broker 高可用方案
这个目前文档挺多的,这里就不再过多说了,这篇两篇档写的还是很不错的。
http://www.cnblogs.com/xumanbu/p/4740381.html
http://bh-keven.iteye.com/blog/1617788
3、 消费者高可用方案(consumer clusters)
这里想多说下,目前网上讨论这个方案的还不是很多,因为amq 帮我们已经做好。可以我这个人就是爱较真,非得知道个所以然来,只能自己google和翻看官方文档。
首先我先列举下目前网络上的介绍。
(1)同一个queue,如果一个consumer失效,那么未被确认的消息都会被发送到这个queue的其它consumer上。
如果某个consumer处理消息比较快,那么它将处理更多的消息。
问题:具体的策略有哪些?如何配置?
(2)stackoverflow 上的 http://stackoverflow.com/questions/5005747/queue-consumer-clusters-with-activemq。
看了这个回复还是有点收获的。
说到这就不得不说prefetch buffers(预取缓冲区) 了。(http://activemq.apache.org/what-is-the-prefetch-limit-for.html)
具体看到官网才了解到amq是基于SEDA(Staged Event Driven Architecture) 的异步架构。了解到amq是推的模式(区别于kafka 啦的模式)。这是信息消费的自然结果通常是比消息传递慢得多,所以amq 增加prefetch limit 限制发送到消费端的个数限制,防止其被冲垮。当消费者处理一半后,amq又会推送消息到prefetch buffers 中。 (摘自 http://activemq.apache.org/what-is-the-prefetch-limit-for.html)
回过来说consumer的负载处理,http://activemq.apache.org/dispatch-policies.html 这里已经说得很清楚了,默认是使用轮询推送到消费者、或是顺序推送(消费者的预取缓冲器将耗尽在调度过程中选择下一个消费者)。
<dispatchPolicy>
<roundRobinDispatchPolicy />
<!--<strictOrderDispatchPolicy /> -->
</dispatchPolicy>