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 的值。

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 团队已经解决的问题,

至少就恢复拓扑时的一般方法和恢复步骤顺序而言是这样。考虑遵循这些客户文档中概述的步骤,而不是重新发明自己的步骤。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/121273.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

维控PLC——LX2N :编程口通讯协议

文章目录 说明通讯帧通讯命令字通讯数据地址维控 LX2N&#xff08;LX2V&#xff09;通讯协议举例 说明 该协议适用于维控LX2N系列PLC&#xff0c;关于维控 LX1S的协议在另一篇文章中描述。 通讯帧 通讯采用ASCII码&#xff0c;校验方式采用和校验。 请求帧格式:报文开始命令…

Flutter——最详细(AppBar)使用教程

AppBar简介 Material Design 应用栏(标题栏) 使用场景&#xff1a; 顶部标题栏包括一些常用的菜单按钮 属性作用leading左边工具视图automaticallyImplyLeading左边图标的颜色title标题视图actions右边菜单按钮flexibleSpace其高度将与应用栏的整体高度相同bottom左侧底部文本内…

vr航空博物馆综合展馆趣味VR科普体验

第十期广州科普开放日 10月28日周六上午九点半&#xff0c;广州卓远VR科普基地再次迎来一批前来体验的亲子家庭&#xff0c;陆续到达的市民朋友让整个基地都热闹了起来&#xff0c;他们在这里开启了一场别开生面的VR科普体验。 一期一会&#xff0c;趣味VR科普 10月广州科普开放…

Unity3d C#实现编辑器不运行状态下执行的脚本

第一章方式&#xff1a; 函数前面 [ContextMenu("Play")] &#xff0c;Inspector面板右键调用 第二种方式&#xff1a; OnValidate() &#xff0c;值改变自动执行 using UnityEngine; using System.Linq;public class NightController : MonoBehaviour {pub…

蓝桥杯每日一题203.11.7

题目描述 题目分析 使用dp思维&#xff0c;当前位置是否可行是有上一位置推来&#xff0c;计算出最大的可行位置即可 #include <stdio.h> #include <string.h>#define N 256 int f(const char* s1, const char* s2) {int a[N][N];int len1 strlen(s1);int len2 …

Kibana Dashboard饼图展示keyword子字符串去重统计

日志内容 log.info("请求开始 uri: {} header RequestId:{}", request.getRequestURI(), reqId, request.getHeader("request_id"));操作步骤 进入Dashboard菜单 点击Create Dashboard按钮 点击Create Panel按钮 选择Aggregation based 然后选择Pie饼图 …

第十一章《搞懂算法:聚类是怎么回事》笔记

聚类是机器学习中一种重要的无监督算法&#xff0c;可以将数据点归结为一系列的特定组合。归为一类的数据点具有相同的特性&#xff0c;而不同类别的数据点则具有各不相同的属性。 11.1 聚类算法介绍 人们将物理或抽象对象的集合分成由类似 的对象组成的多个类的过程被称为聚…

数字化转型:云表低代码开发助力制造业腾飞

数字化转型已成为制造业不可避免的趋势。为了应对市场快速变化、提高运营效率以及降低成本&#xff0c;制造业企业积极追求更加智能化、敏捷的生产方式。在这个转型过程中&#xff0c;低代码技术作为一种强大的工具&#xff0c;正逐渐崭露头角&#xff0c;有望加速制造业的数字…

高性能网络编程 - The C10M problem

文章目录 Pre概述回顾C10K实现C10M的挑战思路总结 Pre 高性能网络编程 - The C10K problem 以及 网络编程技术角度的解决思路 概述 在接下来的10年里&#xff0c;因为IPv6协议下每个服务器的潜在连接数都是数以百万级的&#xff0c;单机服务器处理数百万的并发连接&#xff0…

Python实用技巧:将 Excel转为PDF

将Excel文件转换为PDF可以方便储存表格数据&#xff0c;此外在打印或共享文档时也能确保表格样式布局等在不同设备和操作系统上保持一致。今天给大家分享一个使用第三方Python库Spire.XLS for Python 实现Excel转PDF的简单方法。 实现步骤 首先&#xff0c;通过pip命令来安装依…

Vue实现面经基础版案例(路由+组件缓存)

一、面经基础版-案例效果分析 1.面经效果演示 2.功能分析 通过演示效果发现&#xff0c;主要的功能页面有两个&#xff0c;一个是列表页&#xff0c;一个是详情页&#xff0c;并且在列表页点击时可以跳转到详情页底部导航可以来回切换&#xff0c;并且切换时&#xff0c;只有…

基于鱼鹰算法的无人机航迹规划-附代码

基于鱼鹰算法的无人机航迹规划 文章目录 基于鱼鹰算法的无人机航迹规划1.鱼鹰搜索算法2.无人机飞行环境建模3.无人机航迹规划建模4.实验结果4.1地图创建4.2 航迹规划 5.参考文献6.Matlab代码 摘要&#xff1a;本文主要介绍利用鱼鹰算法来优化无人机航迹规划。 1.鱼鹰搜索算法 …

华为数通方向HCIP-DataCom H12-831题库(多选题:141-160)

第141题 项目实施方案主要包含哪些项? A、风险控制措施 B、人员安排 C、时间规划 D、割接流程 答案:ABCD 解析: 项目实施方案主要包括:时间规划、人员安排、割接流程、风险控制措施。 第142题 以下哪些广域网链路属于报文交换网? A、PSIN B、ISDN C、X.25 D、ATM E、MSTP…

工程(十四)——ubuntu20.04 PL-VINS

博主创建了一个科研互助群Q&#xff1a;772356582&#xff0c;欢迎大家加入讨论。这是一个科研互助群&#xff0c;主要围绕机器人&#xff0c;无人驾驶&#xff0c;无人机方面的感知定位&#xff0c;决策规划&#xff0c;以及论文发表经验&#xff0c;以方便大家很好很快的科研…

Node.js中的回调地狱

聚沙成塔每天进步一点点 ⭐ 专栏简介 前端入门之旅&#xff1a;探索Web开发的奇妙世界 欢迎来到前端入门之旅&#xff01;感兴趣的可以订阅本专栏哦&#xff01;这个专栏是为那些对Web开发感兴趣、刚刚踏入前端领域的朋友们量身打造的。无论你是完全的新手还是有一些基础的开发…

QDockWidget DEMO 动态添加QDockWidget ,无主窗口,禁止tab重叠

效果&#xff1a; 关键代码&#xff1a; 1、删除主窗口&#xff0c;使用QDockWidget替代主窗口 QWidget* p takeCentralWidget();if (p)delete p;setDockNestingEnabled(true);centralWidget new QDockWidget(this);centralWidget->setAllowedAreas(Qt::AllDockWidgetAre…

docker部署es+kibana

es 暴露的端口特别多 &#xff0c;十分耗内存&#xff0c;数据一般要放置到安全目录&#xff0c;挂载 官网推荐的命令&#xff1a;docker run -d --name elasticsearch --net somenetwork -p 9200:9200 -p 9300:9300 -e "discovery.typesingle-node" elasticsearch…

目标检测标注的时代已经过去了?

在快速发展的机器学习领域&#xff0c;有一个方面一直保持不变&#xff1a;繁琐和耗时的数据标注任务。无论是用于图像分类、目标检测还是语义分割&#xff0c;长期以来人工标记的数据集一直是监督学习的基础。 然而&#xff0c;由于一个创新性的工具 AutoDistill&#xff0c;这…

DocTemplateTool - 可根据模板生成word或pdf文件的工具

你是否经常遇到这样的场景&#xff1a;产品运营有着大量的报告需求&#xff0c;或者给客户领导展现每周的运营报告&#xff1f;这些文档类的任务可以交给运营同事&#xff0c;他们负责文档排版和样式&#xff0c;你作为开发人员你只需要提供数据源&#xff0c;和一个映射表&…

目标检测回归损失函数(看情况补...)

文章目录 L1 loss-平均绝对误差(Mean Absolute Error——MAE)L2 loss-均方误差(Mean Square Error——MSE)Smooth L1 LossMAE、MSE、Smooth L1对比IoU LossGIoU LossDIoU Loss、CIoU LossE-IoU Loss、Focal E-IoU LossReferenceL1 loss-平均绝对误差(Mean Absolute Error——…