环境
PHP7,Thinkphp5,php-amqp类库

场景描述
生产的消息队列,其消费者总是无故断开,基本在五天左右就会断开,但是程序端消费者的进程却仍在继续,并且没有捕获到任何异常。经过多次尝试,最终将问题定位在mq的心跳问题。因为我们数据中心的防火墙正在终止空闲连接

mq心跳
1.rabbitmq使用心跳机制来保持连接,在正常场景下,客户端期望通过发送心跳包来告知服务端自己存活。如果服务端连续两次发送心跳客户端均无回应,服务端会断开与客户端的连接。心跳间隔可在每次连接时设置。
2.因php是同步语言,它无法在后台运行耗时任务时持续发送心跳包。这时候服务端就会断开连接,而客户端只有继续使用这个队列的时候才会发现已断开

查看消费者源码可以发现,heartbeat的默认值为0,表示不开启心跳检测

当heartbeat>0时表示开启心跳,此时需要注意的问题有:

  1. 应该重新设定read_write_timeout的值,如果该属性低于心跳,则连接将在尝试写入时消失,一般来说,应该使用双倍心跳的值。我使用的是60/30。
  2. 网络问题可能会影响心跳包的发送与接收,导致脚本的异常中断。为防止该问题,应该在消费者外层进行异常捕获,并对异常进行响应的处理,例如脚本中断后进行重启(例如:supervisor进程守护)。

此外,由于mq长时间等待的问题,可能会造成数据库连接的断开,因此我在程序中的处理方法是处理完一次业务后主动断开数据库连接(Db::close()),这样下次业务开始时会重新建立连接。

消费者代码

PHP RabbitMQ的心跳问题相关推荐

  1. RabbitMQ之心跳检测

    Heartbeat超时值 heartbeat超时值定义了RabbitMQ及其client库在多久之后认为TCP连接不可到达.这个值是在client连接RabbitMQ服务器的时候协商好的,在Rabbi ...

  2. rabbitmq 心跳机制

    首先上官方说明:https://www.rabbitmq.com/heartbeats.html 从官方文档可以看到有个heartbeat timeout,服务端默认60s,这里的描述可能有些迷惑性 ...

  3. python使用pika订阅rabbitmq消息链接被重置问题

    最近在做一个运维监控系统的时候,使用python的pika插件订阅rabbitmq消息,程序在运行一段时间后,总是会报链接被充值的错误,具体报错如下: Traceback (most recent c ...

  4. RabbitMQ狂神说笔记(RabbitMQ B站狂神说笔记、KuangStudy、学相伴飞哥)

    一. 引用文章 RabbitMQ狂神说笔记(B站狂神说笔记.KuangStudy.学相伴飞哥) RabbitMQ狂神说笔记(B站狂神说笔记.KuangStudy.学相伴飞哥)百度云盘地址,提取码:07 ...

  5. OpenStack Summit Paris 会议纪要 - 11-04-2014

    前言: 来源:https://wiki.openstack.org/wiki/Summit/Kilo/Etherpads#Ops 不一定翻译准,因为是在summit上随手写的. 重点关注Ops Sum ...

  6. websocket心跳链接代码_Hyperf+RabbitMQ+WebSocket实现大屏幕消息推送

    作者:八重樱 来源:www.cnblogs.com/a609251438/p/12713467.html 介绍 基于 Hyperf+ WebSocket +RabbitMQ 实现的一个简单大屏幕的消息 ...

  7. RabbitMq学习笔记006---修改RabbitMq端口号和心跳时间

    假设读者在Windows系列的操作系统中安装好了Rabbit MQ后,请找到安装路径下的etc文件夹下,将rabbitmq.config.example备份一份,并修改为config类型的文件,即为r ...

  8. JAVA调用mq时做心跳检测,[翻译]RabbitMQ 心跳

    用心跳检测死TCP连接 介绍 网络可能会以许多方式失败,有时会很细微(例如高比率的数据包丢失).中断的TCP连接需要比较长时间(例如,在Linux上默认是大约11分钟)才能被操作系统检测到.AMQP ...

  9. rabbitmq 学习 之 心跳检测(13)

    https://www.rabbitmq.com/heartbeats.html 简介 网络在很多情况下会失败,有时情况很微妙(比如 丢包率很高).操作系统检测到 TCP 断开是一个适中的时间(在 L ...

最新文章

  1. hibernate 中set的3个属性(inverse,cascade,order_by)
  2. vim全局搜索并跳转
  3. jpa 实体映射视图_JPA教程:实体映射-第2部分
  4. MySQL函数/数据库函数
  5. 【华为云技术分享】云小课 | 华为云镜像服务扫盲帖——汇集5大功能,21个常见案例
  6. (转)SpringMVC学习(十二)——SpringMVC中的拦截器
  7. 自己写的Weblogic的poc
  8. python2中可以使用print()函数吗_Python3中的 print 函数有哪些用法?
  9. 一些常用jar包作用
  10. Androidstudio 里面的app下目录介绍
  11. iapp导入源码使用教程,iapp保存图像代码教程
  12. python中function是什么意思_Python中的Function定义方法
  13. 龙卷风收音机android安卓版,龙卷风收音机
  14. 畅购第9天项目总结(Spring Security Oauth2 JWT)
  15. 雷蛇鼠标:单机偶尔变成双击
  16. python自定义标识符的使用区分大小写吗_Python中的标识符是不区分大小写的
  17. Java 与 区块链技术_java区块链技术有哪些主要的特点和应用
  18. c语言 一个数组奇数左边 偶数右边,C语言设计实验报告(第七次)
  19. matlab作业1,matlab作业报告一
  20. 【Office软件使用】Word往框里打勾

热门文章

  1. [转]解密回声消除技术之二(应用篇)
  2. 输电线路在线监测(测温装置)
  3. CSS3 实现 60 FPS (60帧)动画效果
  4. 参与澳门熊猫创意征名,喜获欧盛M55“爱拍”影音手机
  5. iMX6Q Sabresd Board SPL Mode
  6. 计算机网络专业教师团队建设,教师团队建设的创新探索与思考
  7. B、dB、dBm、dBW、dBi、dB、Np
  8. tomcat启动项目
  9. 装饰者设计模式(java版本)
  10. 谷粒商城14——订单支付(AliPay)