问题背景

介绍两个经典的网络问题,

问题1: 访问位于Azure Application Gateway之后的nodejs server, 偶尔会触发502

问题2: 请求一个Azure App Service, 如果在230s之内请求没有返回,必定timeout

问题1分析

首先来分析问题1,初步看502,那么很自然的认为是后台服务down了,但是检查server状态很正常,并且测试反馈只是偶尔某个请求502,再次刷新立马就恢复正常。由于重现概率很低,尝试去抓网络包,没抓到有用的信息,只能进行猜测。出现502既然不是server的状态有问题,那么就是server端即upstream意外的close了tcp connection。这种情况可能有多种原因比如Server端的资源紧张,比如Server端的keep-alive设置,已经检查过服务器状态正常,那么可能是这个keep-alive的设置导致。

什么是HTTP keep-alive

HTTP Keep-Alive,也称为HTTP persistent connection(持久连接),它允许在一个TCP连接上发送和接收多个HTTP请求和响应,而不需要为每一个新的请求/响应对重新建立和关闭连接。在HTTP/1.0中,默认不使用Keep-Alive,每一次请求/响应结束后,连接就会被关闭。为了启用Keep-Alive功能,客户端必须在请求头中包含Connection: keep-alive。在HTTP/1.1中,Keep-Alive是默认启用的,但是客户端和服务器都可以通过发送一个Connection: close的消息头来请求关闭连接。

那么默认的nodejs keepalive是多长时间,查阅官方资料,为5s。https://nodejs.org/docs/latest/api/http.html#serverkeepAliveTimeout

写段代码简单的试验下:

const express = require('express');
const http = require('http');
const server = http.createServer(app);
app.get('/', async (req, res) => {
await res.send("Hello World!");
});
server.listen(3000, () => {
console.log("start server");
});

查看response header:

抓取网络包并分析:

从图中可以看到,正常情况下,当收到最后一个ACK 5s之后, 由Server端(port 3000)会发送FIN Flag,开始关闭连接。这证明了Server端会主动的close connection, 而某些情况下会发生如下情况:

这个是网上截取的图,但是情况类似,某些情况,TCP Conenction没有正常的断开连接,而是直接Reset, 此时就会发生502。

解决方案

那么解决方案也很明了,只要Server端保证比Client端也就是Application Gateway的Keep-Alive 长,Server端不会在Client端认为可用的时候发送消息,就不会发生此类问题,查阅官方资料,Azure Applicaiton Gateway的HttpAlive v1为120s, v2为75s, 我们用的是V2, 设置为了120s > 75s, 此问题改动之后不再发生。但是需要声明的是用的相同的配置和代码的另外一个产品则从来没发生过此类问题。网络世界很复杂,也许不是这个原因,咱们这里只是拿这个问题来重点介绍HTTP Keep-Alive。

问题2分析

问题2的描述是在230s之内请求没有返回, 那么也就是说230s之内TCP connection一直没有流量传输,那么大概率是触发了TCP Idle Timeout。

什么是TCP Keep-Alive和TCP Idle Timeout

TCP Idle Timeout 是指TCP连接在无数据交换时可以保持空闲状态的最大时间。在这段时间后,如果没有任何数据包(例如TCP段)在连接上发送,连接就可能被认为是不再需要的,并且会被网络设备或操作系统自动关闭。这样做的目的是为了回收不再使用的资源,避免无用连接。

TCP Keep-Alive 是一种网络协议的机制,设计用于在TCP(传输控制协议)连接中检测对方是否已停止响应。TCP 是一种面向连接的协议,用于在计算机网络中的应用程序之间可靠地传输数据。在长时间的空闲期间,一个端点可能在没有任何通知的情况下不再可用,例如电脑可能已经崩溃或网络故障。Keep-Alive 机制可以帮助检测这些情况,确保连接仍然是活跃的,或允许应用程序在连接被对方关闭时采取适当的行动。

注意网络设备和应用程序可以调整TCP Keep-Alive的参数比如时间间隔和重试次数

注意不要把TCP Keep-Alive和Http Keep-Alive混淆。

在Azure中, Azure Load Balancer有个默认的4分钟的TCP Idle timeout, 这也就导致了如果app service一直没返回,则client端大概在230s(windows是230s, linux是240s)抛出timeout异常。

解决方案

那解决方案也比较清晰,由于Azure Load Balancer的设置在AppService里的服务中是不可配置的,那么只能改为异步方式,对于请求来说,可以先返回一个Id,然后循环查询Id对应的状态,而不是一直等待。

欢迎扫码关注我的公众号

计算机网络-Keep Alive的更多相关文章

  1. 计算机网络知识(TCP连接,TCP/UDP区别,HTTP与HTTPS,Socket原理等等)

    1.网络七层协议包含,物理层.数据链路层.网络层(ip协议).传输层(TCP传输控制协议.UDP用户数据报协议).会话层.表示层.应用层(http协议).是一个提供的概念架构协议. 2.TCP/IP协 ...

  2. [计算机网络]简易http server程序

    好久没输出了,知识还是要写下总结才能让思路更加清晰.最近在学习计算机网络相关的知识,来聊聊如何编写一个建议的HTTP服务器. 这个http server的实现源代码我放在了我的github上,有兴趣的 ...

  3. SQL Server 2012故障转移的looksalive check和is alive check

    什么是looksalive check和is alive check SQL Server故障转移集群是建立在windows集群服务上的一种热备的高可用方案.在集群运行过程中,windows集群服务定 ...

  4. [Network] 计算机网络基础知识总结

    计算机网络学习的核心内容就是网络协议的学习.网络协议是为计算机网络中进行数据交换而建立的规则.标准或者说是约定的集合.因为不同用户的数据终端可能采取的字符集是不同的,两者需要进行通信,必须要在一定的标 ...

  5. 计算机网络中的帧封装(C实现)

    这段时间开始复习计算机网络,看到帧封装这一节,结合以前的课程设计,就用C写了个帧封装的程序,说实话C学的确实不怎么样,实现的时候对于文件操作那部分查了好多资料,下面说说帧封装是啥情况. 学过计算机网络 ...

  6. Keeping Async Methods Alive

    Consider a type that will print out a message when it’s finalized, and that has a Dispose method whi ...

  7. 牛人整理分享的面试知识:操作系统、计算机网络、设计模式、Linux编程,数据结构总结 转载

    基础篇:操作系统.计算机网络.设计模式 一:操作系统 1. 进程的有哪几种状态,状态转换图,及导致转换的事件. 2. 进程与线程的区别. 3. 进程通信的几种方式. 4. 线程同步几种方式.(一定要会 ...

  8. 计算机网络(7)-----TCP协议概述

    传输控制协议(Transmission Control Protocol) 概念 一种面向连接的.可靠的.基于字节流的传输层通信协议,由IETF的RFC 793定义.在简化的计算机网络OSI模型中,它 ...

  9. 【转】牛人整理分享的面试知识:操作系统、计算机网络、设计模式、Linux编程,数据结构总结

    基础篇:操作系统.计算机网络.设计模式 一:操作系统 1. 进程的有哪几种状态,状态转换图,及导致转换的事件. 2. 进程与线程的区别. 3. 进程通信的几种方式. 4. 线程同步几种方式.(一定要会 ...

  10. 计算机网络: IP地址,子网掩码,默认网关,DNS服务器详解

    楔子: 以Windows系统中IP地址设置界面为参考(如图1), IP地址, 子网掩码, 默认网关 和 DNS服务器, 这些都是什么意思呢? 学习IP地址的相关知识时还会遇到网络地址,广播地址,子网等 ...

随机推荐

  1. webgl 系列

    webgl 背景 工作所需... 目录 初识 WebGL 绘制一个点 三角形 变换矩阵和动画 渐变三角形 绘制猫 着色器语言

  2. es6 快速入门 系列 —— 解构

    其他章节请看: es6 快速入门 系列 解构 我们经常使用数组或对象存储数据,然后从中提取出相关数据信息 试图解决的问题 以前开发者为了从对象或数组中提取出特定数据并赋值给变量,编写了很多重复的代码, ...

  3. 优雅地使用pt-archiver进行数据归档(转)

    一.引言 最近由于业务需求,需要将公有云RDS(业务库)的大表数据归档至私有云MySQL(历史库),以缩减公有云RDS的体积和成本. 那么问题来了,数据归档的方式有n种,选择哪种呢?经过一番折腾,发现 ...

  4. Spring Boot图书管理系统项目实战-8.续借图书

    导航: pre:  7.借阅图书 next:9.归还图书 只挑重点的讲,具体的请看项目源码. 1.项目源码 需要源码的朋友,请捐赠任意金额后留下邮箱发送:) 2.页面设计 2.1 bookReBorr ...

  5. dp题单——区间dp

    一.基本概念 1.链式区间dp for(int len = 2; len <= n; len++){ //枚举区间长度 for(int i = 1; i + len - 1 <= n; i ...

  6. RESTful API 介绍,设计

    一:RESTful介绍 在互联网发展过程中,最开始是以html静态网页展示内容,url的表现形式一般为 http://www.example.com/getInfo.html:后来随着需求不断提高以及 ...

  7. 【LeetCode二叉树#06】获取二叉树的所有路径(分析递归中的回溯机制)

    二叉树所有路径 力扣题目链接(opens new window) 给定一个二叉树,返回所有从根节点到叶子节点的路径. 说明: 叶子节点是指没有子节点的节点. 示例: 思路 根据题意,每次遍历至子节点, ...

  8. 【应用服务 App Service】App Service For Windows 如何挂载Storage Account File Share 示例

    问题描述 很早之前,介绍了在 App Service for Linux中挂载 Storage Account共享文件,当时Windows无法实现这个功能.而现在,App Service For Wi ...

  9. 【Azure 应用服务】Azure Function (PowerShell) 执行时报错 "out of memory"

    问题描述 在Azure Function App服务中,创建一个PowerShell脚本的函数,遇见了OOM(Out Of Memory)的异常报错: 2022-01-10T07:44:37 Welc ...

  10. UserWarning: To get the last learning rate computed by the scheduler, please use `get_last_lr()`

    将 lr = scheduler.get_lr() 改为 lr = scheduler.get_last_lr()