首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

RabbitMQ集群除了HAProxy,也可以客户端代理访问

全网最简单的安装手册

// 安装erlang

wget https://packagecloud.io/install/repositories/rabbitmq/erlang/script.rpm.sh

bash script.rpm.sh

sudo 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.rpm

sudo yum install rabbitmq-server-3.7.26-1.el7.noarch.rpm

sudo 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和端口,就能看到久违的登录界面了。

配置集群

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

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

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

sudo rabbitmqctl cluster_status // 查看集群状态

sudo rabbitmqctl stop_app // 停止app

sudo rabbitmqctl join_cluster rabbit@ip-10-0-5-62 // 把当前节点添加到集群中

sudo rabbitmqctl start_app // 启动app

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

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

代理中间件

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

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

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

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

客户端代理

支持多个地址

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

factory.newConnection(addresses);

根据地址列表依次创建连接,直到创建成功为止。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集群。但是,笔者在生产中真不敢这么用。你知道有哪些好用的客户端中间件吗?欢迎留言讨论。

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20200513A00LWJ00?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券