【端午安康,给大家讲个“网络”故事,深刻一下!】

牛马我🐴上周又挨锤了, 网络是不稳定的,博学多知的你可能知道,可能不知道。但假如没亲身经历过,知不知道都不深刻,牛马踩了个网络的坑,深刻了,这里分享下,

一个真相

无论是 移动端的4/5G网络,PC端的宽带有线网络 ,还是 云上的网络,都是不稳定的。

多年来,线上服务都是躲在大公司运维基建的后面,或依托于阿里云等服务厂商的网络架构后面,我习惯性的认为云上的网络是相对可靠的,基本上不会出什么大问题。直到这天,

两次事故

7天内连续2次,类似下面这种,在线ToC业务的 p99屏响突然被拉高,表现为

  • 体感上:ToC的在线服务突然有明显延迟,甚至部分超时,
  • 指标上:所有服务 p99 都在短时间,都被拉升,类似如图表现,

p99表现,图上是个示意,横轴是时间线,纵轴是延迟时间单位是秒。

p99是网络性能统计中的一个指标,表示99%的请求延迟或响应时间小于或等于该值,用于衡量系统在极端情况下的表现。

开始分析

部署上:这些服务各自独立,独立数据库,独立部署,都部署在某个k8s集群上,如下图。

依次排查,全流程,各指标先快速看一眼,

  • k8s 流量入口,无暴涨流量,正常,
  • 业务所在k8s集群,Prometheus监控,服务所在环境cpu/mem/io等正常,
  • 数据库,无大量慢查询,cpu/mem/io/连接数等正常,

整体指标快速一过,无明显异常,线索中断,思考一下,这个时候需要抓一条具体的返回延时大的请求来看下,看下请求具体耗时情况。按照这个思路一抓,还真抓到了,

APM立功

之前服务基建,服务有接入apm工具,这里选用的是elasticsearch - apm工具,会对请求进行抽样抓取,

看具体请求,类似下图这样,发现请求时间变长,有一大部分耗时在开始的某个函数上,这个函数再细看发现和redis的操作有关,redis去拿数据,有时特别慢,甚至超时。

(备注:为了加速查询,业务里使用redis,有个初始的数据会从redis里拿,拿到以后再进行后续流程)

一下范围就缩小了不少,这下好办了 ,再细查,看业务层和redis的相关日志,发现有报错,

罪魁祸首,网络波动

这一查,发现了p99升高的时候,redis连接有断开报错。 原来 业务层的出口(k8s集群的出口) 与 redis之间的连接串走的是公网,公网网络环境复杂,网络一波动,连接短时间内断开,流量就有异常,p99就会被拉升。

而我们这里 Redis 和 业务层 应该是走内网的,所以很快 ,解决方案,

走内网

切换完内网连接串后,p99正常,没有在出现 接口延时 ,指标上涨等问题 ,这个问题本身看起来解决了。但是事后,在想下,这个真的全怪网络波动吗? 甚至说 换成内网就一定没有网络问题吗?

是时候转变思路了

网络本身复杂,涉及软硬件模块众多,甚至与运营商有关,虽然可以说大部分时间,网络都是可靠的,但是这并不绝对。
所以,开发时的思路就要改变了,开发时要假设, 网络是不稳定的 ,针对这种不稳定,有不稳定的开发模式。

三点建议

  • 内网

尽量内网连接,针对这个问题,假设外网99%的时候是正常的,内网就是99.999%的概率是正常的,这里数据也许不准确,但是却说明了 优先使用内网连接的重要性常识性的东西,没注意踩坑了,才真正深刻了。

  • 容错

代码结构优化 , 数据库重连策略 ,连接数,连接间隔,一般默认就OK ,但是有的时候 需要根据你的业务,敏感程度,还是有调整和优化的必要性的,这个要具体问题 具体看。

同时建立好相应的指标,看实际开销和指标 能达多少,做好业务需求和运维成本能接收的均衡即可。

  • 大规模

当业务体量到达一定程度时,上面的提到各种优化,其实并不能解决的。就假如说你在北京的运营商都挂了,区域所在的网络整体都down了,而你的业务又是高敏感的,每分钟都垮垮掉钱,就问你怕不怕?这个时候就不得不提异地容灾了。异地容灾有比较成熟的方案 ,网络上也有比较多介绍的文章,这里就先不再展开。

结语

遇到坑,填上坑,通过填坑,反思一下,对一个真相更深刻,那么就今天 ,深刻了各位 哈哈哈哈哈。最后祝大家端午安康,轻松填坑,快速成长,升职加薪!

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

neo4j入门并使用案例说明

1、neo4j是什么 Neo4j是一个高性能的NoSQL图形数据库,它将结构化数据存储在网络(在数学角度称为图)上,而不是传统的表中。Neo4j是一个嵌入式的、基于磁盘的、具备完全的事务特性的Java持久化引擎。它因其高性能、轻量级、易嵌入和…

docker安装rabbitmq详解

目录 1、安装 1-1.查看rabbitmq镜像 1-2.下载Rabbitmq的镜像 1-3.创建并运行rabbitmq容器 1-4.查看启动情况 1-5.启动web客户端 1-6.访问rabbitmq的客户端 2..遇到的问题 解决方法: 1、安装 1-1.查看rabbitmq镜像 docker search rabbitmq 1-2.下载Rabbitmq的镜像 拉…

企业应如何选择安全合规的内外网文件摆渡系统?

网络隔离是一种安全措施,旨在将网络划分为不同的部分,以减少安全风险并保护敏感信息。常见的隔离方式像物理隔离、逻辑隔离、防火墙隔离、虚拟隔离、DMZ区隔离等,将网络隔离成内网和外网。内外网文件摆渡通常指在内部网络(内网&am…

OrangePi Kunpeng Pro深度评测:性能与体验的完美融合

文章目录 一、引言二、硬件开箱与介绍1.硬件清单2.硬件介绍 三、软件介绍四、性能测试1. 功率测试2. cpu测试2.1 单线程cpu测试2.2 多线程cpu测试 五、实际开发体验1. 搭建API服务器2. ONNX推理测试3. 在线推理平台 五、测评总结1. 能与硬件配置2. 系统与软件3. 实际开发体验个…

144、二叉树的前序递归遍历

题解: 递归书写三要素: 1)确定递归函数的参数和返回值。要确定每次递归所要用到的参数以及需要返回的值 2)确定终止条件。操作系统也是用栈的方式实现递归,那么如果不写终止条件或者终止条件写的不对,都…

Maven项目的创建

目录 1、Maven简介配置(1)设置本地仓库(2)修改Maven的jdk版本(3)添加国内镜像源添加到idea中 2、常用命令3、IDEA2023创建Maven项目(1)Maven和Maven Archetype区别(1-1&a…

内存管理--3.用幻灯片讲解C++手动内存管理

用幻灯片讲解C手动内存管理 1.栈内存的基本元素 2.栈内存的聚合对象 3.手动分配内存和释放内存 注意:手动分配内存,指的是在堆内存中。 除非实现自己的数据结构,否则永远不要手动分配内存! 即使这样,您也应该通过std::allocator…

rv1126-rv1109-openssh-密码秘钥等功能修改

1.openssh是允许外部登录的工具 2.真的是很复杂的设备 3.移植分布,怎么得到我们想要的openssh 去网上自己寻找安装包下载; 4.怎么预制进arm主板,把编译出来的openssh放进去 其中除了ssh_config和sshd_config;其他都是秘钥,公钥和私钥; root账户走的秘钥的修改,不改是默认的r…

Web 网页性能优化

Web 网页性能及性能优化 一、Web 性能 Web 性能是 Web 开发的一个重要方面,侧重于网页加载速度以及对用户输入的响应速度 通过优化网站来改善性能,可以在为用户提供更好的体验 网页性能既广泛又非常深入 1. 为什么性能这么重要? 1. 性能…

SpringBoot+Vue体育馆管理系统(前后端分离)

技术栈 JavaSpringBootMavenMySQLMyBatisVueShiroElement-UI 角色对应功能 学生管理员 功能截图

SpringBoot: 启动流程和类装载

前面我们学过Spring定制了自己的可执行jar,将真正执行时需要的类和依赖放到BOOT-INF/classes、BOOT-INF/lib来,为了能够识别这些为止的源文件,Spring定制了自己类加载器,本节我们来讲解这个类加载器。本节涉及的内容主要包括: Sp…

网络协议三

数据中心 一、DNS 现在网站的数目非常多,常用的网站就有二三十个,如果全部用 IP 地址进行访问,恐怕很难记住 根 DNS 服务器 :返回顶级域 DNS 服务器的 IP 地址 顶级域 DNS 服务器:返回权威 DNS 服务器的 IP 地址 …

uni-app uni-swipe-action 滑动操作状态恢复

按照uni-app官方文档的写法 当前同一条滑动确认之后 页面列表刷新 但是滑动的状态还在 入下图所示: 我们需要在滑动确认之后 页面刷新 滑动状态恢复 那么我们就来写一下这部分的逻辑: 首先,配置一下:show"isOpened[item.id]" chan…

数据结构(C):二叉树前中后序和层序详解及代码实现及深度刨析

目录 🌞0.前言 🚈1.二叉树链式结构的代码是实现 🚈2.二叉树的遍历及代码实现和深度刨析代码 🚝2.1前序遍历 ✈️2.1.1前序遍历的理解 ✈️2.1.2前序代码的实现 ✈️2.1.3前序代码的深度解剖 🚝2.2中序遍历 ✈…

CentOs7 JDK21 安装

CentOs7 JDK21 安装 准备工作 先检查系统是否之前已经安装了jdk 。如果已经安装的话需要卸载。 方式一:使用压缩包的方式 下载jdk21的压缩包 https://www.oracle.com/java/technologies/downloads/ 将下载的gz压缩包上传到服务器并解压 # 创建文件夹 (你可以自…

【Python】读取文件夹中所有excel文件拼接成一个excel表格 的方法

我们平常会遇到下载了一些Excel文件放在一个文件夹下,而这些Excel文件的格式都一样,这时候需要批量这些文件合并成一个excel 文件里。 在Python中,我们可以使用pandas库来读取文件夹中的所有Excel文件,并将它们拼接成一个Excel表…

yarn保姆级安装和使用

目录 前言 一、yarn简介 主要特性 使用场景 二、yarn的安装 yarn的下载 配置环境变量 三、yarn的常用命令 四、yarn的常用配置项 五、npm与yarn的区别 前言 本文旨在介绍如何安装和使用Yarn,以及它的一些常见用法。我们将从Yarn的基本概念开始,…

卡尔曼滤波器例子

卡尔曼滤波器 卡尔曼滤波器(Kalman Filter)是一种用于线性系统状态估计的递归算法,可以有效地融合传感器数据和系统模型来估计系统的状态。它在机器人学中广泛应用,尤其是位置和速度等状态的估计。通过卡尔曼滤波器,可以有效地估计机器人在二维平面内的真实位置,并减小测…

【JavaEE】Spring IoCDI详解

一.基本概念 1.Ioc基本概念 Ioc: Inversion of Control (控制反转), 也就是说 Spring 是⼀个"控制反转"的容器. 什么是控制反转呢? 也就是控制权反转. 什么的控制权发发了反转? 获得依赖对象的过程被反转了也就是说, 当需要某个对象时, 传统开发模式中需要自己通…

商城项目【尚品汇】08异步编排

文章目录 1.线程的创建方式1.1继承Thread类,重写run方法1.2实现Runnable接口,重写run方法。1.3实现Callable接口,重新call方法1.4以上三种总结1.5使用线程池创建线程1.5.1线程池创建线程的方式1.5.2线程池的七大参数含义1.5.3线程池的工作流程…