美文网首页
5-2 客户端操作MQ集群

5-2 客户端操作MQ集群

作者: Finlay_Li | 来源:发表于2020-07-18 15:10 被阅读0次

连接Haproxy

注意,此处连接的不在是rabbitmq节点了,而是Haproxy代理节,所以只需要配置haproxy

连接工厂

spring.rabbitmq.addresses=192.168.5.155:5677,192.168.5.155:5678
spring.rabbitmq.username=guest
spring.rabbitmq.password=guest

虚拟机

spring.rabbitmq.virtual-host=/

端口说明

-p 5678:5678 Haproxy的端口
-p 8101:8101 Haproxy管理界面端口
-p 8001:8001 Haproxy代理Mq端口

ERROR

ERROR [-,,,] 1999 --- [.168.5.155:5677] o.s.a.r.c.CachingConnectionFactory : Channel shutdown: connection error

测试成功:可发送消息可消费。但是有这个日志

ERROR处理

Google 找了很多资料,也没有找到解决方案,无意间找到一篇文章:RabbitMQ and HAProxy: a timeout issue

文章说,如果使用 HAProxy 配置 RabbitMQ 高可用集群的话,则会遇到客户端连接超时问题。

为什么会出现此问题呢?因为 HAProxy 配置了客户端连接超时参数(timeout client ms),如果客户端连接超过配置的此参数,那么 HAProxy 将会删除这个客户端连接。

RabbitMQ 客户端使用永久连接到代理,从不超时,那为什么还会出现问题?因为如果 RabbitMQ 在一段时间内处于非活动状态,那么 HAProxy 将自动关闭连接(有点坑呀😂)。

那如何解决这个问题呢?我们看到 HAProxy 提供了一个clitcpka参数配置,它可以从客户端发送TCP keepalive数据包。

我们就使用它,但发现配置了之后,还是出现了上面的问题。

为什么呢?

[…]the exact behaviour of tcp keep-alive is determined by the underlying OS/Kernel configuration[…]

什么意思?意思就是TCP keepalive数据包的发送,取决于操作系统/内核配置。

我们可以使用命令查看(HAProxy 所在服务器中的tcp_keepalive_time配置):

[root@manager1 ~]# cat /proc/sys/net/ipv4/tcp_keepalive_time
7200
tcp_keepalive_time默认配置时间 2 个小时,表示发送TCP keepalive数据包的间隔时间是 2 个小时,或者说每隔 2 个小时发送TCP keepalive数据包。

这么说就清楚了吧,虽然我们在 HAProxy 中,配置了clitcpka参数,但因为系统发送TCP keepalive数据包的间隔时间过长,远远超过 HAProxy 中的 timeout client超时时间(默认好像是 2 秒),所以客户端连接每隔 2 秒,就被 HAProxy 无情的给删除掉,然后不断的被重建。

说了那么多,我们该怎么解决此问题呢?

两种方案:

修改系统的tcp_keepalive_time配置,间隔时间低于 HAProxy 配置的timeout client超时时间(因为有可能影响其他系统服务,不推荐)。
修改 HAProxy 中的timeout client超时时间,配置大于系统的tcp_keepalive_time间隔时间(推荐)
因为系统tcp_keepalive_time发送TCP keepalive数据包间隔时间是 2 个小时,所以,我们将 HAProxy 中的timeout client超时时间,设置为 3 个小时:

timeout client 3h
timeout server 3h

修改的配置:

listen rabbitmq_cluster
    bind    0.0.0.0:8001
    mode    tcp
    option  tcplog
    balance roundrobin
    timeout client  3h
    timeout server  3h
    server  manager1  manager1:5672  check  inter  5000  rise  2  fall  3
    server  manager2  manager2:5672  check  inter  5000  rise  2  fall  3
    server  manager3  manager3:5672  check  inter  5000  rise  2  fall  3

重新运行 HAProxy即可

相关文章

  • 5-2 客户端操作MQ集群

    连接Haproxy 注意,此处连接的不在是rabbitmq节点了,而是Haproxy代理节,所以只需要配置hapr...

  • 5-2 集群MQ搭建

    构建mq通讯网络 创建一个桥接网络docker network create rabbitmqnet 部署Rabb...

  • Prometheus监控MQ集群

    mq 为Rabbitmq 。 下载插件:rabbitmq_exporter(集群中所有的mq node)3台mq ...

  • Rabbit MQ & NodeJS & Protobuf

    Rabbit MQ & NodeJS & Protobuf 一、NodeJS Rabbit MQ 客户端封装 ...

  • 后端存储13(主从复制)

    主从复制操作时序 当客户端提交一个事务到 MySQL 的集群,直到客户端收到集群返回成功响应,在这个过程中,MyS...

  • Redis请求路由

    请求路由 目前我们已经搭建好Redis集群并且理解了通信和伸缩细节,但还没有使用客户端去操作集群。Redis集群对...

  • ActiveMQ

    一. 引言 ActiveMQ扩展出:API 接受发送MQ 的高可用MQ 的集群容错配置MQ 的持久化延时发送签收机...

  • RabbitMQ集群(镜像队列)

    按下面步骤创建3个RabbitMQ 配置集群 mq01 mq02 mq03 配置镜像队列 部分参数说明: Name...

  • 消息队列

    MQ的作用 消息通信MQ的基础功能即为消息通信。使用MQ的客户端可以将消息发送到MQ中,也可以从MQ中消费消息。 ...

  • RocketMQ开发者使用指南入门

    在上一篇文章中,我们介绍了如何搭建单机或者集群环境的Rocket MQ服务,本文主要在其基础上,介绍常见的客户端开...

网友评论

      本文标题:5-2 客户端操作MQ集群

      本文链接:https://www.haomeiwen.com/subject/uuguhktx.html