rabbitMQ rascal/amqplib报错 Error: Unexpected close 排查

这篇具有很好参考价值的文章主要介绍了rabbitMQ rascal/amqplib报错 Error: Unexpected close 排查。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

以下是一些可能导致此 RabbitMQ 客户端或任何其他 RabbitMQ 客户端中的套接字读取或写入失败的常见场景

1.错过(客户端)心跳

第一个常见原因是RabbitMQ 检测到心跳丢失。发生这种情况时,RabbitMQ 将添加一个有关它的日志条目,然后根据规范要求关闭连接。

以下是 RabbitMQ 日志中丢失的客户端心跳的样子:

2017-09-26 08:04:53.596 [warning] <0.2375.628> closing AMQP connection <0.2375.628> (127.0.0.1:54720 -> 127.0.0.1:5672):

missed heartbeats from client, timeout: 8s

对于I/O操作与使用者操作不并发的客户端(我相信这里是这样的),如果使用者操作花费的时间超过检测信号超时,RabbitMQ将检测到错过的客户端检测信号。禁用心跳可能有所帮助,但我不建议这样做。

如果您禁用心跳,请确保您的内核配置为使用合理的TCP keepalive 设置,默认情况下并非所有流行的 Linux 发行版都是如此

rabbit心跳

查看rabbitmq日志 /var/log/rabbitmq/rabbit@ecmaster.log

closing AMQP connection <0.4893.0> (127.0.0.1:58310 -> 127.0.0.1:5672):

 missed heartbeats from client, timeout: 10s

web控制台 connection界面中可查看hearbeats 的值。

rabbitmq client unexpectedly closed tcp connection,rabbitmq,ruby,分布式

client与rabbitqm-server协商心跳检查时间(server默认为60s),

如果任一值为0,则使用两者中较大的值,否则使用两者中较小的值。

零值表示对等​​方建议完全禁用心跳。要禁用心跳,两个对等方都必须选择加入并使用值0。强烈建议不要这样做,除非已知环境在每个主机上使用 TCP keepalive(见第5条)。也强烈建议不要使用非常低的值。

rascal 可以调整配置文件的connection.options.heartbeat来配置心跳时间,默认为10。

rabbitmq-server可在/etc/rabbitmq/rabbitmq.conf(不存在就新建) 调整heartbeat 配置项 heartbeat = 60   修改后重启systemctl restart rabbitmq-server.service 即可

2.中介关闭“非活动”TCP 连接

第二个常见原因:TCP 连接被中介(例如代理或负载均衡器)关闭。

如果您在 RabbitMQ 日志中看到以下内容

2017-09-26 08:08:39.659 [warning] <0.23042.628> closing AMQP connection <0.23042.628> (127.0.0.1:54792 -> 127.0.0.1:5672, vhost: '/', user: 'guest'):

client unexpectedly closed TCP connection

这意味着客户端的 TCP 连接在 AMQP 0-9-1(该客户端的)连接之前关闭。有时这是无害的,意味着应用程序在终止之前不会关闭连接。不太好,但没有功能上的缺点。此类日志条目还可能表明客户端应用程序进程失败(与此线程无关),或者很常见的是,代理关闭了连接。代理和负载均衡器具有 TCP 连接不活动超时,心跳指南中提到)。它们的长度通常为 30 秒到 5 m。

虽然心跳和 TCP keepalive 的设计目的不是为了解决不幸的负载均衡器或代理设置,但通过产生定期的网络流量,它们恰好可以做到这一点。

3.其他连接生命周期日志条目

下面的条目不一定与失败的套接字写入相关,但值得解释它们,

因为它们在解决连接相关问题时非常有用(并且可能会被误解)。

如果您在 RabbitMQ 日志中仅看到以下内容:closing AMQP connection <0.13219.456> (153.x.x.x:56468 -> 185.x.x.x:5672)

(没有任何提及或心跳、意外关闭的 TCP 连接、连接错误或 RabbitMQ 端的任何超时套接字写入),这意味着客户端连接已干净且成功关闭,并且是应用程序发起的。

{writer,send_failed,{error,timeout}}

意味着 RabbitMQ 尝试写入套接字,但该操作超时。如果您在客户端写入失败的同时看到此情况,则意味着连接出现故障,但未启用心跳或 TCP keepalive,并且未更快地检测到它。

4.其他可能的原因?TCP 连接可能会失败。

在大多数其他情况下,失败的套接字写入就是失败的套接字写入。网络连接可能会失败或性能下降。这个客户端或 RabbitMQ 无法避免这一点。这正是 AMQP 0-9-1、STOMP、MQTT 等消息传递协议引入heartbeats的原因,而在该客户端中,heartbeats 并不能很好地实现其目的。

5.一种的替代方案:TCP Keepalive

TCP keepalive可以作为一种替代方案。 它们不保证您的连接永远不会失败 - 目标仍然是更快地检测此类连接 - 因此您仍然可能会看到失败的套接字写入。

TCP KeepAlive

TCP 包含一种与上面介绍的消息传递协议中的心跳(又名保活)类似的机制:TCP 保活。由于默认值不充分,不能假定 TCP keepalive 适合消息传递协议。但是,通过适当的调整,在无法期望应用程序启用检测信号或使用合理值的环境中,它们可以作为额外的防御机制

在某些极少数情况下,仅靠心跳是不够的(例如,当涉及的连接使用不具有某种心跳机制的协议时),必须将 TCP keepalive 配置为使用相当低的超时值。

通过将 TCP keepalive 配置为较低的系统特定值,也可以使用 TCP keepalive 来代替心跳。在这种情况下,可以停用心跳。这种方法的主要好处是,无论使用什么协议和客户端库,计算机上的所有 TCP 连接都将使用相同的值。

TCP协议通过KeepAlive机制判断是应用程序掉线了还是确实没有数据传输,当超过一段时间之后,TCP自动发送一个数据为空的报文给对方,如果对方回应了这个报文,说明对方还在线,连接可以继续保持,如果对方没有报文返回,并且重试了多次之后则认为连接丢失,没有必要保持连接。

KeepAlive并不是默认开启的,在Linux系统上没有一个全局的选项去开启TCP的KeepAlive。需要开启KeepAlive的应用必须在TCP的socket中单独开启。Linux Kernel有三个选项影响到KeepAlive的行为:

sysctl -a|grep keepalive //查看数值

net.ipv4.tcpkeepalivetime = 7200

net.ipv4.tcpkeepaliveintvl = 75

net.ipv4.tcpkeepaliveprobes = 9

tcpkeepalivetime的单位是秒,表示TCP连接在多少秒之后没有数据报文传输启动探测报文;  60

tcpkeepaliveintvl单位是也秒,表示前一个探测报文和后一个探测报文之间的时间间隔,

tcpkeepaliveprobes表示探测的次数。

sysctl -w net.ipv4.tcp_keepalive_time=60 调整KeepAlive参数

sysctl -w net.ipv4.tcp_keepalive_intvl=10

sysctl -w net.ipv4.tcp_keepalive_probes=6

连接恢复

自动连接恢复是多个 RabbitMQ 客户端多年来支持的功能,例如Java 客户端和Bunny。这被认为是 RabbitMQ 团队已经解决的问题,

至少就恢复拓扑时的一般方法和恢复步骤顺序而言是这样。考虑遵循这些客户文档中概述的步骤,而不是重新发明自己的步骤。文章来源地址https://www.toymoban.com/news/detail-763878.html

到了这里,关于rabbitMQ rascal/amqplib报错 Error: Unexpected close 排查的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Docker无法启动,报错:Docker Desktop - Unexpected WSL error

    =======以下是Annie第二次修改记录于2023.12.4日======= 如果以后开机也遇到这个启动不起。可以简化这个步骤: 1、打开管理员CMD,或者Windows Powershell,输入: Enable-WindowsOptionalFeature -Online -FeatureName Microsoft-Windows-Subsystem-Linux 重启WSL, 2、打开管理员CMD,或者Windows Powershell,输入:

    2024年02月04日
    浏览(45)
  • Docker Desktop 启动报错 Unexpected WSL error 问题解决

    🚀 作者主页: 有来技术 🔥 开源项目: youlai-mall 🍃 vue3-element-admin 🍃 youlai-boot 🌺 仓库主页: Gitee 💫 Github 💫 GitCode 💖 欢迎点赞 👍 收藏 ⭐留言 📝 如有错误敬请纠正! 启动 Docker Desktop 报错 Unexpected WSL error,报错完整信息如下: 以管理员身份运行 CMD ,输入 netsh wi

    2024年02月05日
    浏览(45)
  • jsx文件eslint报错 Parsing error: Unexpected token < eslint

    最近在使用react native开发app的发现一个问题: 报错详情: 可以看到,这是jsx的正确写法,并没有语法错误,但是eslint还是报错,大致意思就是意外的符号 ,可以大概推断是eslint没有正确解析jsx语法造成的,虽然程序可以正常运行,但是对于强迫症来说,确实受不了。 原因:

    2024年02月13日
    浏览(29)
  • 解决Docker报错问题:Docker Desktop – Unexpected WSL error

         最近因为准备在NAS上通过Docker容器方式安装MYSQL,发现https://hub.docker.com网站被墙了,无法自动安装,同时又找不到靠谱的离线镜像,所以准备在Window上安装Docker,通过电脑的网络代理制作离线镜像再上传到NAS上。        在Windows下安装Docker并不是很顺利,安装完启动时

    2024年01月22日
    浏览(39)
  • Mac m1 安装rabbitmq+php-amqplib

    rabbitmq 官方地址 https://www.rabbitmq.com mac 软件包 Downloading and Installing RabbitMQ — RabbitMQ 一.这里我选择 homebrew  二.php代码 用composer 安装 10年软件开发经验,结交朋友! 分销商城系统开发,App商城开发 商务合作 samshop168 欢迎私信,必回

    2024年02月09日
    浏览(29)
  • windows11启动docker报错:Docker Desktop - Unexpected WSL error

    问题描述 windows11启动docker(版本为4.26.1)报错: Docker Desktop - Unexpected WSL error An unexpected error was encountered while executing a WSL command. Common causes include access rights issues, which occur after waking the computer or not being connected to your domain/active directory. Please try shutting WSL down (wsl -shutdown) and/or

    2024年04月12日
    浏览(28)
  • docker pull报错error pulling image configuration: received unexpected HTTP status: 530或者500

    执行docker pull或者执行docker-compose up去拉镜像的时候报上述错误 修改系统中docker对应的配置文件即可,如下: 重新启动 docker :service docker start 然后再重新执行docker pull即可

    2024年02月11日
    浏览(29)
  • Git报错: error: RPC failed; curl 56 HTTP/2 stream 5 was reset; send-pack: unexpected disconnect

    背景: 在本地修改了大量的代码并commit后,最后一次性push时,出现错误。 分析: 从报错的信息来看,貌似是和远程Git连接出现了问题,因此,可以从以下三个角度来分析: 本地和远程Git仓库连接有问题,由于刚提交成功过,可以排除掉; 本地和远程Git仓库的数据传输速度慢

    2024年03月18日
    浏览(43)
  • 超全整理,Jmeter性能测试-脚本error报错排查/分布式压测(详全)

    性能脚本error报错问题排查 1、脚本运行过程中报错 1)在windows系统jmeter中,给测试脚本添加查看结果树,添加保存错误日志信息 第一步,给文件取名error.xml 第二步,仅错误日志 第三步,点击配置,全部勾选 2)把linux系统中保存的error日志文件,导入到windows系统jmeter查看结

    2024年02月07日
    浏览(42)
  • yarn安装依赖包报错 An unexpected error occurred: “htps://registry.npm.taobao.org/vue-router: Invalid protoc

    yarn安装依赖包报错 这是因为网络不好导致的下载依赖包请求超时报错,更改下载地址即可。 步骤1.请求地址设置成淘宝源 步骤2.对node-sass镜像源进行设置 步骤3.重新下载 参考文章:https://blog.csdn.net/i_am_a_div/article/details/107935408

    2024年02月14日
    浏览(36)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包