ActiveMQ学习(六)

Wesley13
• 阅读 423

消费者集群负载均衡

ActiveMQ学习(六)

broker服务器集群已经做好了,现在来看怎么做消费者集群。就是一个broker端有很多的消费者,在这一个端的消费者之间是集群。消费者端可以用多线程来实现。发送端(broker集群,双向连接)

ActiveMQ学习(六)

建立第一个broker端的消费端:

ActiveMQ学习(六)

        建立第二个broker端的消费端。这个消费端的for循环改为2,就是这个第一个broker端的消费者是1个,第二个broker端的消费者是2个。所以到现在为止搭建了broker的双向负载均衡集群,然后也建立了消费者集群,图示表示:

ActiveMQ学习(六)

        运行两个接收端类和发送端类,查看运行消费的结果可以看的出来,虽然两个broker的消费者个数是不一样的,但是broker集群把两个Broker端当作相同个数的消费者,给两个broker端的消费的消息是一样多的。所以默认情况下消费者集群是非负载均衡的。

解释一下什么是消费端的负载均衡?

        就是在broker集群中,每个broker端有很多的消费者,每个broker端的消费者可以消费的个数是多少呢?这就是负载均衡。关于消费端的负载均衡,是通过核心配置文件中networkConnectors中的conduitsubscriptions属性来控制的:

ActiveMQ学习(六)

        在上面的测试中默认的两个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主从结构。

      ActiveMQ学习(六)

        意思就是集群中的MQ使用相同的数据库,对共享数据同一时刻只能有一个MQ操作,加锁--同步机制。下面是配置使用JDBC构建MQ集群的方式:

ActiveMQ学习(六)

现在来配置一下基于JDBC的MQ集群。第一步:修改两个broker中MQ中核心配置文件activemq.xml的存储方式:

ActiveMQ学习(六)

把配置文件中原来关于静态连接的注释掉:

ActiveMQ学习(六)

ActiveMQ学习(六)

        当然两个配置文件中要有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相当于消费者。

点赞
收藏
评论区
推荐文章
blmius blmius
2年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
Jacquelyn38 Jacquelyn38
2年前
2020年前端实用代码段,为你的工作保驾护航
有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
Wesley13 Wesley13
2年前
mysql设置时区
mysql设置时区mysql\_query("SETtime\_zone'8:00'")ordie('时区设置失败,请联系管理员!');中国在东8区所以加8方法二:selectcount(user\_id)asdevice,CONVERT\_TZ(FROM\_UNIXTIME(reg\_time),'08:00','0
Wesley13 Wesley13
2年前
00:Java简单了解
浅谈Java之概述Java是SUN(StanfordUniversityNetwork),斯坦福大学网络公司)1995年推出的一门高级编程语言。Java是一种面向Internet的编程语言。随着Java技术在web方面的不断成熟,已经成为Web应用程序的首选开发语言。Java是简单易学,完全面向对象,安全可靠,与平台无关的编程语言。
Stella981 Stella981
2年前
Android蓝牙连接汽车OBD设备
//设备连接public class BluetoothConnect implements Runnable {    private static final UUID CONNECT_UUID  UUID.fromString("0000110100001000800000805F9B34FB");
Stella981 Stella981
2年前
Django中Admin中的一些参数配置
设置在列表中显示的字段,id为django模型默认的主键list_display('id','name','sex','profession','email','qq','phone','status','create_time')设置在列表可编辑字段list_editable
Wesley13 Wesley13
2年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
Stella981 Stella981
2年前
Kafka重平衡机制
点击蓝色字体“肉眼品世界”,关注公众号深度价值体系传递!(https://oscimg.oschina.net/oscnet/cdaf2bb2b6804d68997f17d08fa4ea00.jpg)当集群中有新成员加入,或者某些主题增加了分区之后,消费者是怎么进行重新分配分区再进行消费的?这里就涉及到重平衡(Rebala
Python进阶者 Python进阶者
2个月前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这