记一次长连接断开排查过程

这篇具有很好参考价值的文章主要介绍了记一次长连接断开排查过程。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

文章地址

问题

WebSocket 的网络链路是 浏览器 <-> Nginx <-> 后端服务,空闲检测时间是 60 s,浏览器心跳发送时间间隔 10 s,出现了有心跳发送但长连接中断的问题。

过程

  1. 查看后端服务日志,发现是被动断开,不是空闲检测主动断开的,再抓服务器的网络包,确认后端服务是被断开的,排除后端服务的问题。

  2. 使用其他语言建立 WebSocket 长连接,维持 10 秒一次心跳,经过 45 小时测试没有断开连接,那么大概率是浏览器 或 JavaScript 哪里不对。

  3. 抓浏览器的包,这次比较诡异,发现浏览器的长连接也是被动断开的,那问题就只能是 Nginx 的了。

  4. 抓 Nginx 的包,发现每次都是 Nginx 先把后端服务的连接断开,之后再断开浏览器的 WebSocket,查看与后端服务的通信,没有问题,接着查看浏览器发送的心跳包,发现这种场景的最后一个心跳包都是 60 s 前发送的,而正常的心跳是 10 s 一次,那么问题就确定了,是浏览器的心跳包不是 10 s 一次,而是 1 分钟一次导致的,但 1 分钟没有心跳导致断开连接是应该由后端服务的空闲检测触发的,不应该由 Nginx 触发,将该问题扔给 ChatGPT 后得到了一个 Nginx 的参数 proxy_read_timeout,这个参数默认 60 s,即 60 s 内没有通信就关闭连接,这样就解释了为什么 Nginx 会主动断开与后端服务的连接,将 proxy_read_timeout 设置为更长时间,经过测试,主动断开连接的发起者就变成了后端服务的空闲检测机制。

下面的图片描述了这个过程:

记一次长连接断开排查过程

如果图中 1 分钟后的心跳是心跳 1,那么就不会断开连接,如果慢了一会,比如 100 ms,即心跳 2,则会导致连接断开。

  1. 上面 Nginx 的配置只解决了断开连接一定由后端服务的空闲检测发起,但问题的关键在于浏览器的心跳包发送时间间隔不对,刚开始是 10 s 一次,过了一段时间就变成了 1 分钟一次。首先如果在当前页面的话不会发生这种问题,但如果在其他页面就会触发这个问题,接着查看开发者工具中的网络,发现过一段时间定时器变成了 1 分钟一次(也可能是 1 分钟内的不固定的时间点,但断开连接的最后一个心跳一定是 1 分钟),在查阅资料后确定浏览器会优化非当前页面的定时器,将所有定时器合并为 1 分钟触发一次已降低系统资源占用。

  2. 如何解决浏览器的定时器被优化的问题?使用 WebWorker。使用 WebWorker 后定时任务心跳发送的时间间隔不再出现 1 分钟执行一次的问题,也就没有出现过 WebSocket 被断开的问题。看了下友商的前端实现,发现也是 WebWorker。

总结

开始排查时思维有点凌乱,没有确定思路,实际应该先确定心跳(客户端)是否有问题,如果心跳没问题再排查服务端。

资料

https://developer.chrome.com/blog/timer-throttling-in-chrome-88/文章来源地址https://www.toymoban.com/news/detail-427916.html

到了这里,关于记一次长连接断开排查过程的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • 记一次线上BUG排查过程

    1. 线上遇到一个非常奇怪的bug,为一个用户分配业务线类型后,该用户登录时,提示502,但其它的用户登录完全是正常的 2. 问题现象 3. 排查思路 先去看线上日志,看是否有error,但日志里边这个接口200正常返回 本地debug,也复现一样问题,在分配角色类型超过22个总数时就报

    2024年02月09日
    浏览(41)
  • 记一次Native memory leak排查过程

    路由计算服务是路由系统的核心服务,负责运单路由计划的计算以及实操与计划的匹配。在运维过程中,发现在长期不重启的情况下,有TP99缓慢爬坡的现象。此外,在每周例行调度的试算过程中,能明显看到内存的上涨。以下截图为这两个异常情况的监控。 TP99爬坡 内存爬坡

    2024年02月11日
    浏览(35)
  • 记一次Elasticsearch GeoIpDownloader的启动异常排查过程

    最近碰到了Elasticsearch GeoIpDownloader相关的一个异常,花费了不少精力排查,故此记录一下,希望碰到同样问题的童鞋们少走弯路。 这个异常是在Elasticsearch启动的过程中报的error,如下所示,从提示信息来看是因为GeoIpDownloader更新数据库失败导致。 GeoIpDownloader是用于下载地图数

    2024年02月02日
    浏览(34)
  • 记一次.Net Core程序启动失败的排查过程

    阅文时长 | 2分钟 字数统计 | 3212字符 主要内容 | 1、引言背景 2、排查.NetCore启动失败详细过程 3、声明与参考资料 『记一次.Net Core程序启动失败的排查过程』 编写人 | SCscHero 编写时间 | 2021/12/23 PM2:6 文章类型 | 系列 完成度 | 已完成 座右铭 每一个伟大的事业,都有一个微不足

    2024年02月05日
    浏览(42)
  • JAVA开发(记一次504 gateway timeout错误排查过程)

    一、问题与背景: 最近在发布一个web项目,在测试环境都是可以的,发布到生产环境通过IP访问也是可以的,但是通过域名访问就出现504 gateway timeout。通过postman去测试接口也是一样。ip和端口都可以通,域名却不行,百思不得其解。通过一顿百度搜索,解析说通过nginx配置文

    2024年02月11日
    浏览(33)
  • 记一次 Mockito.mockStatic 泄漏导致的单元测试偶发报错排查过程

    相信用 Java 写过单元测试的读者们对 Mockito 不会陌生。至于 Mockito 是什么,为什么要用 Mockito,本文不再赘述。本文记录了一次在 Apache ShardingSphere 项目中,由 Mockito.mockStatic 使用不当导致的单元测试偶发报错排查过程。 Mockito 自 3.4.0 起新增了一个方法 Mockito.mockStatic ,支持对

    2024年02月10日
    浏览(47)
  • 记一次服务器被挖矿的排查过程:xmrig挖矿病毒

    【阿里云】尊敬的aliyun98****8825: 经检测您的阿里云服务(ECS实例)i-0jl8awxohyxk****axz5存在挖矿活动。根据相关法规、政策的规定,请您于2023-07-18 00时前完成挖矿问题整改,否则您的服务将被关停,详情请查看邮件或阿里云站内消息通知。 若您有其他问题,可登陆阿里云官网在

    2024年02月11日
    浏览(39)
  • 记一次eclipse导入的JavaEE项目无法连接数据库的排查

    Eclipse导入了一个JavaEE项目 在虚拟机环境中新建了一个数据库 数据库可以使用本地客户端工具正常连接 导入的JavaEE项目修改了数据源配置后无法启动 相同的数据源配置通过在Idea新建的测试项目可以访问 具体报错如下: +++++++++++++++++++++++++++++分割线+++++++++++++++++++++++++++++ 修改

    2024年02月10日
    浏览(35)
  • 【记一次线上事故的排查思路】- CPU飙升问题排查

    由于项目排期较紧,临时从其他组调来三个开发资源帮我一起做项目,难免上线的时候大家的需求一块上线。 问题来了,上线三天后,线上CPU总是莫名奇妙的突然飙升,飙升后CPU并未降下来,而是一直处在高点。 由于是线上导致的问题,CPU超限后,会自动重启项目,未能保

    2024年01月23日
    浏览(41)
  • 记一次docker启动失败的问题排查

    以前在虚拟机上安装了一个docker,可以正常使用的,今天突然宿主机机器内存条坏了,换了内存条后启动机器,再使用 systemctrl start docker 启动docker,最后使用 docker start containID 启动报错 网上没有找到相应的描述,仔细分析看是 write /proc/sys/kernel/shmmni 报错了,错误原因是 in

    2024年02月14日
    浏览(51)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包