504 错误码排查

2023-09-20 17:24:53

当出现 504 错误码时,表示请求超时,服务器无法及时响应请求,需要检查下应用是否有什么耗时的操作,比如是否出现了 SQL 慢查询、是否接口发生死循环、是否出现死锁等,同时需要关注服务器系统负载高不高。

网络异常

接口原本好好的,突然出现超时,最常见的原因可能是网络出现异常,比如:偶然的网络抖动,或者是带宽被占满了。

  • 网络抖动:大多数情况下访问某个网站很快,但偶尔会出现网页一直转圈,加载不出来的情况。有可能是网络出现了抖动,发生数据丢包
  • 带宽被占满:由于页面或者接口设计不合理,当用户请求量突增时,可能会导致服务器的网络带宽被占满。服务器带宽指的是在一定时间内传输数据的大小,比如:1 秒传输了 10M 的数据。如果用户请求量突然增多,超出了 1 秒 10M 的上限,比如 1 秒 100M,而服务器带宽本身 1 秒就只能传输 10M,这样就会导致在这 1 秒内,90M 的数据延迟传输,从而导致接口超时

所以对于有些高并发的请求场景,需要评估是否增加服务器带宽。

线程池满了

API 接口有时为了性能考虑,可能会使用线程池异步查询数据,然后把查询结果进行汇总,最后再返回。

但如果用户请求太多,线程池中已有的线程处理不过来,线程池会把多余的请求,放到队列中排队,等待空闲线程去处理。

如果队列中排队的任务非常多,某次 API 请求一直在等待,没办法得到及时处理,就会出现接口超时。

这时候,可以考虑是否是核心线程数设置的太小了,或者有多种业务场景共用了同一个线程池。

  • 如果是因为核心线程池设置的太小,可以将其调大一些
  • 如果是因为多种业务场景共用了同一个线程池,可以拆分成多个线程池

数据库死锁

假设 API 接口中通过某个 id 更新某条数据时,正好线上在手动执行一个批量更新数据的 SQL 语句。

该 SQL 语句在一个事务当中,并且刚好也在更新那条数据,此时可能就会出现死锁的情况。

当死锁发生时,数据库会将一个事务暂停,直到与其互相竞争资源的事务释放资源。这样就会导致 API 接口的更新数据操作长时间被数据库锁住,无法及时返回数据,从而出现接口超时的情况。

为了避免这种情况发生,可以考虑以下几个解决方案。

  • 确保事务的执行时间尽可能短,尽量避免长时间的 SQL 语句
  • 将长时间的批量更新数据的 SQL 语句拆分成多个较短的 SQL 语句,以减少事务的持有时间
  • 减少事务的范围,仅在必要时才使用事务来更新数据
  • 合理设计数据库的索引和约束,减少锁竞争的可能性
  • 使用数据库的事务隔离级别和锁机制的合适设置,以确保数据一致性同时最小化锁竞争

传入参数太多

有时候偶尔的一次接口超时,是由于参数传入太多导致的。

例如:根据 id 集合批量查询分类接口,如果传入的 id 集合数据量不多,那么不会出现性能问题。毕竟 id 是分类表的主键,可以走主键索引,数据库的查找速度是非常快的。

但如果接口调用方,一次性传入几千个,甚至几万个 id,批量查询分类,也可能会出现接口超时。

因为数据库在执行 SQL 语句前,会评估一下耗时情况,查询条件太多,有可能会判断走全表扫描会更快。

这种情况下 SQL 语句可能会不走索引,从而出现接口超时。

因此在设计批量接口的时候,建议要限制传入的参数集合的大小,如果超过设置的最大参数集合的大小,则接口直接返回失败,并进行友好提示。

超时时间设置过短

通常情况下,建议在调用远程 API 接口时,设置连接超时时间和读超时时间,并且可以动态配置。

连接超时时间指的是在建立网络连接时等待的时间。当客户端尝试连接到服务器时,如果服务器在指定的时间内没有响应,那么连接将被视为超时。这可以是由于网络故障、服务器负载过高或其他原因导致的延迟。连接超时时间的目的是确保在合理时间内建立连接,以防止客户端一直等待而无法进行后续操作。

读超时时间指的是在接收数据时等待的时间。当客户端从服务器请求数据时,如果在指定的时间内未收到任何数据,那么读操作将被视为超时。这可能是由于网络故障、服务器响应延迟或其他原因导致的数据获取延迟。读超时时间的目的是确保客户端能够在合理时间内获取到所需的数据,以避免无限期地等待。

这样做可以防止在调用远程 API 接口时,万一出现性能问题,响应时间很长,避免把服务拖挂的情况。

比如:调用的远程 API 接口,要 100 秒才能返回数据,而设置的超时时间是 100 秒。假设此时 1000 个请求去调用该接口,会导致线程池很快被占满,导致整个服务暂时不可用,至少新的请求过来时是无法及时响应的。

所以需要设置超时时间,同时超时时间也不能设置太长。

一次性返回数据太多

死循环或无限递归

SQL 语句没走索引

服务 OOM

本地 debug 模式

比如:本地开发时直连测试数据库并调用某个 API 接口的业务逻辑,同时开启 debug 模式,在更新某条数据时,假设此时他人也在操作更新相同的数据,就有可能会出现数据库死锁。

参考资料

  • https://mp.weixin.qq.com/s/9xSkSpQs-hzHJx7MumSEEg
更多推荐

Android编译snowboy

一、Ubuntu安装git1.打开终端在Ubuntu系统中,我们可以使用终端输入命令进行操作。打开终端的快捷键为Ctrl+Alt+T。2.安装Git在终端中输入以下命令,即可开始安装Git。sudoapt-getinstallgit登录后复制安装过程中需要输入管理员密码,安装完成后,终端会输出Git的版本号等信息。3.

将近 5 万字讲解 Python Django 框架详细知识点(更新中)

Django框架基本概述Django是一个开源的Web应用后端框架,由Python编写。它采用了MVC的软件设计模式,即模型(Model)、视图(View)和控制器(Controller)。在Django框架中,模型层负责与数据库交互,进行数据的增、删、改、查等操作。视图层用于封装结果,生成页面展示的HTML内容。控制

基于Simulink的用于电力系统动态分析

💥💥💞💞欢迎来到本博客❤️❤️💥💥🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。⛳️座右铭:行百里者,半于九十。📋📋📋本文目录如下:🎁🎁🎁目录💥1概述📚2运行结果🎉3参考文献🌈4Matlab代码、Simulink及文章💥1概述本文介绍了基于Simulink

KT142C-sop16语音芯片的4个IO口如何一对一触发播放_配置文件详细说明

目录KT142C是一个提供串口的SOP16语音芯片,完美的集成了MP3的硬解码。内置330KByte的空间,最大支持330秒的语音长度,支持多段语音,支持直驱0.5W的扬声器无需外置功放如上图,芯片有4个IO口可以一对一,详见如下说明2.3芯片4个IO触发口功能-配置文件-简单说明2.4配置文件注意事项--以及常见问题

pytest框架前后置设置,以及pytest默认规则

一、pytest框架的默认规则1、模块名默认必须以test开头或者以test结尾2、测试类必须以Test开头,并且不能有__init__方法3、测试方法默认必须以test开头当然以后的一些默认规则除测试类不能使用__init__方法外其余的都是可配置的,当然一般情况下我们也不会去修改这些默认配置。二、使用setup与t

《PostgreSQL与NoSQL:合作与竞争的关系》

🌷🍁博主猫头虎(🐅🐾)带您GotoNewWorld✨🍁🐅🐾猫头虎建议程序员必备技术栈一览表📖:🛠️全栈技术FullStack:📚MERN/MEAN/MEVNStack|🌐Jamstack|🌍GraphQL|🔁RESTfulAPI|⚡WebSockets|🔄CI/CD|🌐Git&Versio

盐碱地改良通用技术 铁尾砂改良学习

声明本文是学习GB-T42828.1-2023盐碱地改良通用技术第1部分:铁尾砂改良.而整理的学习笔记,分享出来希望更多人受益,如果存在侵权请及时联系我们1范围本文件描述了铁尾砂改良盐碱地技术的技术原理,规定了技术要求、田间管理和效果评价。本文件适用于铁矿山企业采用经破碎、粉磨、磁选物理工艺选矿后得到的高硅铁尾砂对板结

时间复杂度讲解(数据结构)

目录引言什么是数据,结构和算法时间复杂度的概念如何计算时间复杂度总结引言hello大家好,我是boooooom君家宝。在前期的博客中博主呢对c语言的一些重要知识点进行了讲解,接下来博主的博客内容将为大家呈现的是数据结构算法的知识讲解,纯c语言版本。由于c语言对于数据结构和算法的进阶知识不是非常的契合,所以暂时只用c语言

kafka

1.Kafka概述2.Kafka安装部署3.Kafka架构深入1.Kafka概述1.1定义(1)Kafka是一个分布式的基于发布/订阅模式的消息队列(MessageQueue),主要应用于大数据实时处理领域。(传统使用)分布式:多台服务器干一件事。发布/订阅:消息的发布者不会将消息直接发送给特点的订阅者,而是将发布的消

现场总线学习

文章目录1.现场总线现状2.数据编码2.1数字数据的数字编码2.2数字数据的模拟编码3.通信方式!!!4.局域网及其拓扑结构5.工业总线协议6.为什么要在can协议的控制器和bus总线之间,连接一个can收发器?7.那其他协议也需要这种收发器么?8.OSI网络协议体系1.现场总线现状2.数据编码2.1数字数据的数字编码

PyTorch实战:实现Cifar10彩色图片分类

目录前言一、Cifar10数据集classtorch.utils.data.Datasettorch.utils.data.DataLoader二、定义神经网络普通神经网络:定义损失函数和优化器训练网络-NetCPU训练模型准确率​编辑GPU训练训练网络-LeNet模型准确率点关注,防走丢,如有纰漏之处,请留言指教,非

热文推荐