zoukankan      html  css  js  c++  java
  • rabbitmq心跳机制与配置

    最近,我们有些在阿里云上的应用总是有客户端出现异常和信息推送不及时的情况,检查mq日志,发现高峰期不停的有心跳超时,如下:

    =ERROR REPORT==== 21-Dec-2016::12:38:00 ===
    closing AMQP connection <0.909.1> (125.120.15.131:5060 -> 120.27.140.42:5672):
    Missed heartbeats from client, timeout: 10s

    =ERROR REPORT==== 21-Dec-2016::12:38:20 ===
    closing AMQP connection <0.898.1> (125.120.15.131:5057 -> 120.27.140.42:5672):
    Missed heartbeats from client, timeout: 10s

    连接的心跳值可通过控制台看到,如下:

    特研究了相关机制,默认情况下,在3.5.5版本之前,rabbitmq设置的默认与客户端心跳时间为580秒,之后为60秒(如果时间间隔配置为0,则表示不启用heartbeat检测),两者时间会每隔timeout / 2 进行一次心跳互通。

    启用心跳检测后,rabbitmq会为每个tcp连接创建两个进程用于心跳检测(这可以通过rabbitmq.log看到每个客户端确实有两个连接,关闭的时候也是成对的方式),一个进程定时检测tcp连接上是否有数据发送(这里的发送是指rabbitmq发送数据给客户端),如果一段时间内没有数据发送给客户端,则发送一个心跳包给客户端,然后循环进行下一次检测;另一个进程定时检测tcp连接上是否有数据的接收,如果一段时间内没有收到任何数据,则判定为心跳超时,最终会关闭tcp连接。另外,rabbitmq的流量控制机制可能会暂停heartbeat检测。

    服务端可在可在配置文件rabbitmq.config中增加配置项{heartbeat,Timeout}进行配置,其中Timeout指定时间间隔,单位为秒。客户端java则为:

    ConnectionFactory cf = new ConnectionFactory();
    
    // set the heartbeat timeout to 60 seconds
    cf.setRequestedHeartbeat(60);

    .net则为
    var cf = new ConnectionFactory();
    
    // set the heartbeat timeout to 60 seconds
    cf.RequestedHeartbeat = 60;
    

     如果超过2次心跳无响应,则会认为对方不可到达并关闭连接。此时,客户端通常需要重新连接。具体视客户端的不同而不同。

    具体可见http://www.rabbitmq.com/heartbeats.html。

    在我们的环境中,应该来说负载并不是特别的高,ping 1k的延时基本上都在20ms以内,照理设置10ms的心跳间隔足以,为什么还是会出现,还需要trace_on看下详细的网络包情况。

  • 相关阅读:
    wsl 如何去掉 windows 的环境变量
    wget出现Unable to establish SSL connection
    openssh 升级
    element/JS文件上传和下载excel问题
    mysql操作过程中常见问题汇总
    [VB.NET Tips]线程传递参数四种方法
    主路由拨号_openwrt做旁路由_ipv4端口映射的设置
    Openwrt_Linux_crontab任务_顺序执行脚本
    Armbian_笔记
    Debian10_Centos8_fail2ban
  • 原文地址:https://www.cnblogs.com/zhjh256/p/6207339.html
Copyright © 2011-2022 走看看