rabbitmq 客户端_RabbitMQ集群除了HAProxy,还可以客户端代理访问

全网最简单的安装手册

// 安装erlangwget https://packagecloud.io/install/repositories/rabbitmq/erlang/script.rpm.shbash script.rpm.shsudo yum install erlang// 安装rabbitmq 3.7 版本wget https://antsentry-cloud-firmware.s3.cn-northwest-1.amazonaws.com.cn/raspberrypy/rabbitmq-server-3.7.26-1.el7.noarch.rpmsudo yum install rabbitmq-server-3.7.26-1.el7.noarch.rpmsudo service rabbitmq-server start

配置用户

rabbitmqctl  add_user username passwd  // 添加用户rabbitmqctl  set_user_tags username administrator  // 给用户分配权限rabbitmqctl  list_users  // 查看系统中有哪些用户

启用web控制台

sudo rabbitmq-plugins list // 查看启用了哪些插件sudo rabbitmq-plugins enable rabbitmq_management  // 启用Web管理界面,默认端口是15672

经过上述几个步骤,打开浏览器,输入服务器的ip和端口,就能看到久违的登录界面了。

d6424e869900994b6dac821681e70f5f.png

配置集群

至少需要两个节点才能组成集群,简单起见,就选两台啦。在另一台服务上,重复上面的安装过程,配置用户和管理界面步骤可以略过。

复制前一台服务器上的cookie到新安装的这台服务器,cookie所在目录为:/var/lib/rabbitmq/.erlang.cookie。

Tips:如果copy,需要注意.erlang.cookie文件的权限必须是400。同时,不要用vim编辑器编辑,会留下换行符导致cookie不一致。cookie文件的大小为20字节。上述两个小问题,确实困扰了笔者挺长时间,导致安装不成功。

sudo rabbitmqctl cluster_status  // 查看集群状态sudo rabbitmqctl stop_app  // 停止appsudo rabbitmqctl join_cluster rabbit@ip-10-0-5-62  // 把当前节点添加到集群中sudo rabbitmqctl start_app  // 启动app

通过简单的几步,这两台服务器已经组成集群了。登录web控制台,效果如下:

35c646768963bcd31f34a79a254a4ade.png

节点之间同步配置信息,关于集群的特点,这是最正确的描述。其他的一些特性,都是可配置的,例如内存节点、磁盘节点;镜像模式等;持久化等等。在可用性和性能之间,用不同的配置,做相应的取舍。这方面的话题,后续展开介绍,敬请关注。

代理中间件

在上一章节中介绍了集群的安装,纵观网上绝大多数的教程,到这里并没有结束,还有很重要的一步,那就是HAProxy+KeepAlived。笔者并没有研究过HAProxy,更别提KeepAlive了,看到这样的东东一脸懵逼。好在业务运行在云上,云服务上有TCP层的负载均衡(LB)组件,用LB代替HAProxy+KeepAlive是一样的。结构如下:

7ff49afff7d505992ab364450ffef790.png

从体系结构的角度考虑,集群中的节点是对等的,即客户端连接任意一个节点都能正常工作,因为只有这样,我们才能用粗暴的负载均衡器做代理。

从实现的细节看,也却是如此。对生产者来说,发送给那个节点并不重要,路由到相应的queue master节点存储即可。消费者若是连接到了master节点,直接取数据即可;如果连接到非master节点,创建一个master节点到目标节点的通道传输数据。

在软件架构实践中,这是非常普遍的一种模式,例如调用微服务的多个实例、例如访问某个域名对应的多个IP地址,例如eureka注册中心等,有些用了中心化的代理中间件,有些则是在客户端实现的。同样的道理,访问rabbitmq集群,除了常见的代理中间件,也可采用客户端代理实现。

c25654d62d1ff7ab395b9688064596bf.png

客户端代理

支持多个地址

通常,初始化ConnectionFactory只能接受一个地址。这么看来,用官方SDK完成客户端代理,要重写基础的访问组件了,这条路肯定是没有错的,就像sharding-jdbc。仔细研究官方提供的API文档,ConnnectionFactory有个newConnection函数,是可以传入一个地址列表的,实现逻辑如下

factory.newConnection(addresses);
88af3410da3398c213aed9ccf43d9e11.png

根据地址列表依次创建连接,直到创建成功为止。Tips:这段代码并不优雅,如果直接用到这段代码,会客户端都连接到第一个正常的节点。

恢复连接

ConnectFactory个重要的功能,那就是自动恢复连接,代码很简单,在4.0版本以后是默认开启的。按照官方的解释,在连接失败后,可以做到打开连接、恢复连接上的listeners、重新创建channel、恢复channel上的listeners以及配置信息。

factory.setAutomaticRecoveryEnabled(true);

结合这两个特性,经测试,集群中的节点宕机后,确实可以重新连接到另一个节点。但是,中间有一段时间连接是中断的,生产者发送消息,会连续失败!

补丁

为了解决这个问题,在生产者增加重试机制,问题得到解决。发送消息失败后,要等待创建连接和channel,重新发送消息。

public void send(String exchange, MQMessage message) {    try {        sentMsg(exchange, message);    } catch (Exception ex) {        connnect();        sentMsg(exchange, message);    }}

到此为止,验证了通过客户端代理模式访问rabbitmq集群。但是,笔者在生产中真不敢这么用。你知道有哪些好用的客户端中间件吗?欢迎留言讨论。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值