消费者集群负载均衡
broker服务器集群已经做好了,现在来看怎么做消费者集群。就是一个broker端有很多的消费者,在这一个端的消费者之间是集群。消费者端可以用多线程来实现。发送端(broker集群,双向连接):
建立第一个broker端的消费端:
建立第二个broker端的消费端。这个消费端的for循环改为2,就是这个第一个broker端的消费者是1个,第二个broker端的消费者是2个。所以到现在为止搭建了broker的双向负载均衡集群,然后也建立了消费者集群,图示表示:
运行两个接收端类和发送端类,查看运行消费的结果可以看的出来,虽然两个broker的消费者个数是不一样的,但是broker集群把两个Broker端当作相同个数的消费者,给两个broker端的消费的消息是一样多的。所以默认情况下消费者集群是非负载均衡的。
解释一下什么是消费端的负载均衡?
就是在broker集群中,每个broker端有很多的消费者,每个broker端的消费者可以消费的个数是多少呢?这就是负载均衡。关于消费端的负载均衡,是通过核心配置文件中networkConnectors中的conduitsubscriptions属性来控制的:
在上面的测试中默认的两个broker端的消费的消息个数是一样的,说明默认情况下broker集群中conduitsubscriptions属性的值是true。现在把值改为false,这样根据每个broker端的消费者的个数来分配消息的个数,意思是:比如broker-A消费者个数是1个,broker-B的消费者的个数是2个,那么启动整个代码之后就可以看到broker-A消费端消费的消息个数是1份,broker-B消费端消费的消息个数是2份。这样就实现了消费者的负载均衡。
搭建基于JDBC的动态(主从)集群
之前学习的是搭建基于KahaDB存储的broker伪分布式集群,就是一个机器上启动多个broker。现在创建基于JDBC的主从集群。主从集群支持JDBC形式的,支持Zookper的,这里介绍使用JDBC实现ActiveMQ主从结构。
意思就是集群中的MQ使用相同的数据库,对共享数据同一时刻只能有一个MQ操作,加锁--同步机制。下面是配置使用JDBC构建MQ集群的方式:
现在来配置一下基于JDBC的MQ集群。第一步:修改两个broker中MQ中核心配置文件activemq.xml的存储方式:
把配置文件中原来关于静态连接的注释掉:
当然两个配置文件中要有mysql的配置。然后重新启动两个broker。现在搭建的集群就是:b1和b2是共享一个DB的。然后每一个broker上又有很多的cusmer。主从结构的集群就是主节点挂了话,从节点就会继续。
现在测试。用我们的线程的方式。发送端就是使用failover协议的,然后randomiae参数值是false的发送端。接收端是使用线程的两个broker接收端的类。发送端发到localhost的broker上,然后先运行另一个broker的接收端,接收到3个就中断他,然后启动localhost的broker的接收端,就把剩下的接受了,所以动态集群下,对于客户端来说消费哪一个broker都是一样的。现在我们去把localhost的那个broker关闭掉。那个对应的localhost端的消费者肯定是不能用了,但是因为我们用的动态集群,另一个broker就会作为主节点了,他那边的消费者应该是可以使用的,所以我们去运行一下另一个broker端的消费者,发现是可以正常消费剩余的消息的。现在我们验证了,搭建了动态集群。即使有一个broker挂了,另一个broker还能正常使用来保证集群的正常使用。
这种动态的主从结构的消息系统,把消息存储进数据库了,数据库里面的消息对于所有的消费者是共享的。对于数据库来说两个broker相当于消费者。