Soul 云原生网关最佳实践

news2024/9/21 22:35:53

作者:Soul 运维

公司介绍

Soul 是基于兴趣图谱和游戏化玩法的产品设计,属于新一代年轻人的虚拟社交网络。成立于2016年,Soul 致力于打造一个“年轻人的社交元宇宙”,最终愿景是“让天下没有孤独的人”。在 Soul,用户可以无顾虑地表达自己,认知他人,探索世界,交流兴趣和观点,获得精神共鸣和认同感,在交流中获取信息,并获得有质量的新关系。

问题与挑战

在这里插入图片描述

2.1 多层网关链路长

Soul 在 2020 年开始逐渐试探容器服务,在 ECS 转型容器阶段,出现了容器入口网关(Ingress-Nginx),微服务网关,加上统一接入层的 SLB+Tengine;造成了多重网关的架构;链路太长不仅带来成本和 RT 的问题,而且导致排查一个请求异常,需要拉非常多的人解决,定位问题代价非常大。

在这里插入图片描述

2.2 Ingress-Nginx 开源问题今年 Ingress-Nginx 社区反馈稳定性和安全问题比较多,暂时停止接收新功能,对 Soul 是一个巨大隐患。

在这里插入图片描述

2.3 Grpc 转发负载不均衡问题

  1. 内网部分服务开放 gRPC 入口,gRPC 是基于 HTTP/2 之上的,而 HTTP/2 被设计为一个长期存在的 TCP 连接,所有都通过该连接进行多路复用。这样虽然减少了管理连接的开销,但是在负载均衡上又引出了新的问题。
  2. 由于我们无法在连接层面进行均衡,为了做 gRPC 负载均衡,我们需要从连接级均衡转向请求级均衡。换句话说,我们需要打开一个到每个目的地的 HTTP/2 连接,并平衡这些连接之间的请求。
  3. 这就意味着我们需要一个 7 层负载均衡,而 K8s 的 Service 核心使用的是 kube proxy,这是一个 4 层负载均衡,所以不能满足我们的要求。
  4. 目前使用独立 evnoy + headless 方案解决 gPRC 转发不均衡问题,slb 暴露 envoy 的端口供其他服务调用;但维护成本较高,evnoy 节点资源浪费较为严重

在这里插入图片描述

2.4 Ingress 稳定性及局限性

  1. 由于业务的不确定性,随着业务请求的波动,nginx ingress controller 会出现连接数突增,导致 ingress controller 健康检查不通过;nginx ingress controller上游的检测需要时间及 fail 次数积累,导致这一阶段用户请求大量失败或重试。(如下图)

在这里插入图片描述

  1. HTTP 路由仅支持 host 和 path 匹配,对于高级路由功能没有通用配置,只能通过 annotation 来实现,比如使用 Nginx Ingress Controller 实现 URL 重定向,需要配置 nginx.ingress.kubernetes.io/rewrite-target annotation 已无法适应可编程路由的需求。
  2. 不同命名空间中的服务要绑定到同一个网关中的情况在实际情况下经常出现,而入口网关无法在多个命名空间中共享;这样就增加 Ingress-Nginx 及 Ingress-Controller的拆分难度。

2.5 业务发布抖动

  1. 虽然 Kubernetes 自身具备优雅线上机制,及 Liveness 和 Readiness 等就绪检查,但服务启动后,瞬间开始接收请求,服务还是会受到瞬间流量的冲击及链接层面的压力。
  2. 服务发布可分为多批,但我们将整个发布过程中看做整体时,看到的是服务RT忽然升高,造成局部业务阶段性响应变慢,给用户最直观的感受是卡顿(单次请求较慢或请求失败后的重试),在用户侧可能感知到服务降级或服务不可用,从而影响用户体验。

技术选型

由于开源 Ingress-Nginx 遇到比较多的问题,由于线上流量巨大难以定位和解决概率超时问题,因此我们考虑投入更多研发人员解决这个问题,还是选择 Envoy 网关解决,还是选择阿里云 ASM、MSE 云原生网关两个产品,因此我们针对这三个新技术方向做了全面评估。

在这里插入图片描述

综上所述, Envoy 已是现阶段数据面较好的选择(可以解决现有nginx ingress controller的性能和稳定性问题),由于性能要求比较高,因此我们优先做了性能压测。

3.1 压测数据

我们通过对线上服务三种不同方案的压测数据对比(SLB+Envo+headless svc、ALB、MSE),主要测试性能和 gRPC 负载均衡能力两方面;压测数据显示,MSE 云原生网关在 RT 和成功率上均有优势,并且能满足 Soul gRPC 的转发需要;那 MSE 是否能满足 Soul 所有业务需求呢?是否能解决最大集群超时问题呢?因此我们对 MSE 进行了更全面的评估。

在这里插入图片描述

3.2 全面技术评估

  • 对 MSE 云原生网关进行功能、稳定性、性能、安全等全方位评估,看看是否满足 Soul 未来要求。

在这里插入图片描述

  • Soul 的业务场景比较复杂,评估 MSE 云原生网关将流量网关、微服务网关、安全网关三合一,集成 10+ 云产品,开箱即用,满足业务需求。

在这里插入图片描述

  • Soul 对稳定性要求非常高,任何抖动都会导致大量用户影响,考虑 MSE 云原生网关经历阿里双十一大规模生产验证,久经打磨,奠定了我们生产使用的信心。

在这里插入图片描述

  • 由于 Soul 流量非常大,网关机器规模大,因此成本是一个关键的考量点,压测显示 MSE 云原生网关采用软硬一体解决方案,比自建性能高 1 倍左右。

在这里插入图片描述

  • Soul 后端有大量 Dubbo 服务,目前通过自研业务网关做 HTTP 到 Dubbo 协议转换,考虑 MSE 云原生网关支持 HTTP 到 Dubbo 协议转换,支持直接挂 Dubbo 服务,有利于未来架构收敛。

在这里插入图片描述

3.3 迁移方案

  • 由于 MSE 兼容 Ingress 标准,因此创建完云原生网关实例,监听已有的 Ingress 资源,就可以直接迁移后端到路由转发规则;
  • MSE 与 Ingress-Nginx 可以共存,因此只需要从上游把流量从 Ingress-Nginx 逐渐切到 MSE 云原生网关即可,按照不同的域名进行灰度,降低变更风险。
  • 在 Soul 的场景中,流量切换 MSE 后,Ingress-Nginx 没有完全的下线,保持了 2 个节点,并增加 HPA 配置,以备不时之需;
  • gRPC 转发 MSE 替换原有的独立 Envoy,业务服务修改 svc 中服务暴露协议及端口即可,逐个服务迁移;

3.4 技术方案

3.4.1 短期方案

Soul 的网关链路比较长,解决最紧迫超时问题、服务发布预热问题,因此第一期先替换Ingress-Nginx,并将容器入口网关/微服务网关合并;

在这里插入图片描述

3.4.2 终态方案

将网关链路降为最短;下线微服务网关,将http转发rpc能力托管MSE;下线Tengine,将 ECS 转发能力托管在 MSE;最终实现 SLB->MSE->POD/ECS****

在这里插入图片描述

落地效果

4.1 稳定性及 RT 前后对比

MSE 切换后处理及响应请求时间平稳,从峰值 500ms 下降至峰值 50ms

在这里插入图片描述

4.2 服务发布产生的错误码对比

Ingress-Nginx 与 MSE 错误码对比,服务发布期间 502 降为 0,499 平均降低 10%;

在这里插入图片描述

4.3 预热与启动 RT 问题

落地解决了大部分超时问题,但是启动慢 Java 程序发布超时问题还没解决,因此我们开启服务预热功能,业务启动逐步打流量过来,防止大量流量打到刚启动 Java 进程超时。

开启预热效果:从图中可以看出,Pod 在刚刚启动后,并没有瞬间接收到全量,而是在 5 分钟的时间里逐渐预热服务,这一点在服务 http 入口请求数量,Pod 网络进出流量,Pod CPU 使用率均可以看到;Nginx 需要自己从底层到上层的各种监控,采用云原生网关后,提供一站式观测视图,提供丰富网关 prometheus 指标,方便观测和解决复杂问题。

在这里插入图片描述

在这里插入图片描述

未来规划

  1. 采用云原生网关将流量、安全、微服务网关三合一,大幅降低请求链路条数、降低架构复杂度

  2. 降低运维和排查成本,降低整个链路 RT,提升客户满意度。

  3. 开启 HTTP 3.0,提升网络传输效率,提升客户体验

  4. 采用服务自治(在线抓包、诊断、巡检)降低排查问题消耗

  5. 采用混沌工程提前识别稳定性风险;

MSE 实践价值

  1. 随着MSE 的落地,可以看到链路明显缩短,问题排查及运维工作大大减少
  2. 替代业务网关,Http转Dubbo能力的抽象,大大减少了研发及运维工作量3. 稳定性及平滑迁移方案完善,可以做到真正的开箱即用

MSE 云原生网关、注册配置专业版、微服务治理企业版预付费首购享8折,首购1年及以上享7折;MSE ZooKeeper 专业版首购5折。

点击此处查看微服务引擎 MSE 产品官网

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

springboot复习(黑马)(持续更新)

学习目标基于SpringBoot框架的程序开发步骤熟练使用SpringBoot配置信息修改服务器配置基于SpringBoot的完成SSM整合项目开发一、SpringBoot简介1. 入门案例问题导入SpringMVC的HelloWord程序大家还记得吗?SpringBoot是由Pivotal团队提供的全新框架,其设计…

为什么低代码最近又火了起来?是钉钉的原因吗?

为什么低代码最近又火了起来?是钉钉的原因吗? 钉钉的入局固然推动了人们对于低代码的讨论,但低代码由来已久,其火爆其实是大势所趋。 那么本篇文章将来解读一下:为什么低代码最近又火了?是资本的推动还是…

佩戴舒适的蓝牙耳机有哪些?佩戴舒适的蓝牙耳机推荐

音乐对许多人而言,都是一种抚慰生命的力量,特别是在上下班的时候,在熙熙攘攘的人流中,戴着耳机听一首动听的曲子,无疑会让人心情变得更加舒畅,要想获得出色的音乐体验,没有一副出色的耳机可不行…

动态内存基础(三)

动态内存的相关问题 ● sizeof 不会返回动态分配的内存大小 #include<iostream> #include<new> #include<memory> #include<vector> int main(int argc, char *argv[]) {int* ptr new int(3);std::cout << sizeof(ptr) << std::endl; //…

阶段式/瀑布完整软件研发流程

软件产品开发流程&#xff1a;下图所示的是一个软件产品开发大体上所需要经历的全部流程&#xff1a;编辑1、启动在项目启动阶段&#xff0c;主要确定项目的目标及其可行性。我们需要对项目的背景、干系人、解决的问题等等进行了解。并编制项目章程和组建项目团队&#xff0c;包…

STM32实战项目-状态机函数应用

前言&#xff1a; 本章主要介绍一下&#xff0c;状态机在工程中的应用&#xff0c;下面我会通过这种方式点亮LED灯&#xff0c;来演示他的妙用。 目录 1、状态机应用 1.1流水灯函数 1.1.1led.h 1.1.2led.c 1.2状态机函数 1.2.1定义举常量 1.2.2结构体封装 1、状态机应…

设计模式-01

1&#xff0c;设计模式概述 1.1 软件设计模式的产生背景 "设计模式"最初并不是出现在软件设计中&#xff0c;而是被用于建筑领域的设计中。 1977年美国著名建筑大师、加利福尼亚大学伯克利分校环境结构中心主任克里斯托夫亚历山大&#xff08;Christopher Alexand…

VUE3使用JSON编辑器

1、先看看效果图&#xff0c;可以自行选择展示效果 2、这是我在vue3项目中使用的JSON编辑器&#xff0c;首先引入第三方插件 npm install json-editor-vue3yarn add json-editor-vue33、引入到项目中 // 导入模块 import JsonEditorVue from json-editor-vue3// 注册组件 …

【pytorch onnx】Pytorch导出ONNX及模型可视化教程

文章目录1 背景介绍2 实验环境3 torch.onnx.export函数简介4 单输入网络导出ONNX模型代码实操5 多输入网络导出ONNX模型代码实操6 ONNX模型可视化7 ir_version和opset_version修改8 致谢原文来自于地平线开发者社区&#xff0c;未来会持续发布深度学习、板端部署的相关优质文章…

RocketMQ5.1控制台的安装与启动

RocketMQ控制台的安装与启动下载修改配置开放端口号重启防火墙添加依赖编译 rocketmq-dashboard运行 rocketmq-dashboard本地访问rocketmq无法发送消息失败问题。connect to &#xff1c;公网ip:10911&#xff1e; failed下载 下载地址 修改配置 修改其src/main/resources中…

【操作系统原理实验】银行家算法模拟实现

选择一种高级语言如C/C等&#xff0c;编写一个银行家算法的模拟实现程序。1) 设计相关数据结构&#xff1b;2) 实现系统资源状态查看、资源请求的输入等模块&#xff1b;3) 实现资源的预分配及确认或回滚程序&#xff1b;4) 实现系统状态安全检查程序&#xff1b;5) 组装各模块…

TCP模拟HTTP请求

HTTP的特性HTTP是构建于TCP/IP协议之上&#xff0c;是应用层协议&#xff0c;默认端口号80HTTP协议是无连接无状态的HTTP报文请求报文HTTP协议是以ASCⅡ码传输&#xff0c;建立在TCP/IP协议之上的应用层规范。HTTP请求报文由请求行&#xff08;request line&#xff09;、请求头…

Flutter 自定义今日头条版本的组件,及底部按钮切换静态样式

这里写目录标题1. 左右滑动实现标题切换&#xff0c;点击标题也可实现切换&#xff1b;2. 自定义KeepAliveWrapper 缓存页面&#xff1b;2.2 使用3. 底部导航切换&#xff1b;4. 自定义中间大导航&#xff1b;5.AppBar自定义顶部按钮图标、颜色6. Tabbar TabBarView实现类似头条…

iOS开发之UIStackView基本运用

UIStackView UIStackView是基于自动布局AutoLayout&#xff0c;创建可以动态适应设备方向、屏幕尺寸和可用空间的任何变化的用户界面。UIStackView管理其ArrangedSubview属性中所有视图的布局。这些视图根据它们在数组中的顺序沿堆栈视图的轴排列。由axis, distribution, align…

java医院云HIS系统:融合B/S版电子病历系统 能与公卫、PACS等各类外部系统融合

医院HIS系统源码 云HIS系统源码&#xff1a;SaaS运维平台完整文档 有源码&#xff0c;有演示 java基层医院云his系统 融合B/S版电子病历系统&#xff0c;支持电子病历4级 拥有自主知识产权。 看演示及源码可私信我哦&#xff01; 一、系统概述 一款满足二甲医院、基层医疗机构…

九、会话技术CookieSession

会话技术 1&#xff0c;会话跟踪技术的概述 对于会话跟踪这四个词&#xff0c;我们需要拆开来进行解释&#xff0c;首先要理解什么是会话&#xff0c;然后再去理解什么是会话跟踪: 会话:用户打开浏览器&#xff0c;访问web服务器的资源&#xff0c;会话建立&#xff0c;直到有…

3D目标检测(二)—— 直接处理点云的3D目标检测网络VoteNet、H3DNet

前言上次介绍了基于Point-Based方法处理点云的模块&#xff0c;3D目标检测&#xff08;一&#xff09;—— 基于Point-Based方法的PointNet点云处理系列,其中相关的模块则是构成本次要介绍的&#xff0c;直接在点云的基础上进行3D目标检测网络的基础。VoteNet对于直接在点云上预…

科目一《综合素质》

目录综合素质重点题型分布注意事项章节分解第一章 职业理念第一节 教育观1. 教育观&#xff08;基本内涵&#xff09;一字不差背过第二节 学生观2. 学生观 一字不差背过第三节 教师观3. 教师观 一字不差背过第二章 教育法律法规第一节 教师的权利与义务第二节 学生的权利及其保…

QT基础入门【Demo篇】QString的相关操作

&#x1f4a2;&#x1f4a2;目录总览&#x1f4a2;&#x1f4a2;&#xff1a;QT基础入门目录总览 QString支持的操作符号有&#xff1a; 用于字符串之间比较&#xff1a;"!" "<" "<" "" ">" 用于字符串之间传递&a…

第九章 多机系统

考柿时间是3.9 文章目录多机系统并行性发展及计算机系统的分类开发并行性的途径计算机系统的分类(Flynn分类)SISD与片内并行&#xff08;芯片内的并行机制&#xff09;SIMD分成两个子类&#xff1a;MIMD分为两类&#xff08;**主要区别就是它们是否有共享的内存**、单系统映像&…