China .NET Conf 2019-.NET技术架构下的混沌工程实践

这个月的8号、9号,个人很荣幸参加了China.NET Conf 2019 , 中国.NET开发者峰会,同时分享了技术专题《.NET技术架构下的混沌工程实践》,给广大的.NET开发小伙伴介绍混沌工程和高可用性改造实践。会后大家伙聚餐的时候,陈计节老师建议大家将各自的议题分享到社区,分享给大家。因此,今天和大家分享我的技术专题《.NET技术架构下的混沌工程实践》。

整个专题主要分为四个部分:

  1. .NET分布式、微服务架构下的高可用性挑战

  2. 混沌工程简介

  3. .NET混沌工程的实践和成果分享

  4. 展望和规划

一、.NET分布式、微服务架构下的高可用性挑战

目前,我们特来电的技术架构是分布式、微服务化的,线上超过1000台Server,高可用保障压力很大:

  • 系统7*24小时运行,不允许宕机,一旦宕机出问题,直接影响全国人民出行;

  • 系统SLA要求99.95% ,全年可宕机时间只有4.38小时;

  • 服务调用链路越来越长,依赖越来越复杂,某个环节出问题,都有肯能导致服务雪崩、大规模宕机;

  • 线上遭遇:网络抖动、内存泄露、线程阻塞、CPU被打爆、 数据库被打爆、中间件宕机等棘手问题;

  • 每天上百次发布更新,系统高可用性保障压力非常大;

一张全链路监控图可以反映我们系统的复杂:

640?wx_fmt=png

例如主机CPU被打爆的问题,线上经常会遇到:

640?wx_fmt=png

经历了线上各种高可用性问题后,我们做了很多反思和总结:

系统在实现了分布式、微服务化之后,我们到底有多少把握来保证系统的正常运行?  

如果出现问题,整个分布式系统会变得非常“混乱”,甚至会引发系统的大规模宕机。

因此,我们有必要在线上事故出现之前,提前识别出系统有哪些弱点和问题,统一管控系统的固有混沌。

这套管控系统固有混沌的方法和体系,就是我们今天要介绍的主角:混沌工程

二、混沌工程简介

1. 什么是混沌工程?

通过受控的实验,掌握系统运行行为的过程,称为混沌工程。

    混沌工程的典型实践:Chaos Monkey
     一只捣乱的猴子,在你的系统里面上蹦下窜,不停捣乱,直到搞挂你的系统。

    640?wx_fmt=png

2. 为什么需要混沌工程?

   混沌工程可以提升整个系统的弹性。
   通过混沌实验,可以发现系统脆弱的一面,主动发现这些问题,并解决这些问题

3. 混沌工程怎么做?

   混沌工程的一般实施步骤:

1 选择系统正常运行状态下的可度量指标,作为基准的“稳定状态”
2 混沌实验分为实验组和对照组,都能保持系统的“稳定状态”
3 对实验组注入混沌事件,如服务不可用、中间件宕机等混沌事件
4 比较实验组和对照组“稳定状态”的差异

   如果混沌实验前后系统的“稳定状态”一致,则可以认为系统应对这种混沌事件是弹性的、高可用的。
   相反的,如果打破了系统的稳定状态,我们就找到了一个系统弱点,然后尽可能地解决它,提升系统的高可用性。

4. 实施混沌工程的推荐原则

  • 明确系统稳定运行的状态(指标)

  • 混沌事件必须是现实世界可能发生的(合理的)

  • 在生产环境进行混沌实验 :生产环境可以真实地反映系统的稳定性

  • 持续集成:线上应用每天都在更新,通过持续集成的方式可以不断发现问题、解决问题。

  • 最小化影响范围:线上进行混沌实验,必须可控,必须确定混沌实验的最小化影响范围。

   这里大家会问:在生产环境上搞混沌实验,能行吗?

5. 现实中的混沌工程

  生产环境必须以稳定为前提,因此推荐O2O模式的混沌实验:即线下演练、线上验证
  在系统未经过大规模高可用性改造之前,建议首先进行全面的线下演练:

   640?wx_fmt=png

   那么, .NET技术架构下的混沌工程怎么做?

三、.NET混沌工程的实践和成果分享

  我们线上系统主要用到了以下.NET技术栈和开源技术:

  • ASP.NET MVC

  • 基于ASP.NET Core的Web运行框架-WRF

  • 基于ASP.NET Web API的分布式服务网关-SG

  • 基于.NET RPC通讯技术的分布式微服务平台-HSF

  • 基于RabbitMQ和Kafka的消息应用中心-MAC

  • iBatis.NET & Entity Framework

  • RabbitMQ & RabbitMQ Client for .NET

  • Kafka & Confluent.Kafka

  • Redis

  • Nginx

    在上述.NET 技术架构下,我们梳理了大量的混沌工程事件:

    640?wx_fmt=png

    640?wx_fmt=png

    640?wx_fmt=png

     通过大量的混沌实验,我们逐步建立了提升系统高可用性的方法论和体系:

     640?wx_fmt=png

     .NET技术架构下的高可用性改进-依赖治理、容错降级     

      业务场景:
      随着业务复杂度的上升,服务调用链路越来越长,链路上存在大量不可控的因素:      


    • 网络抖动,导致服务异常

    • Redis、MQ、DB等中间件不可用,导致服务超时、异常

    • 依赖的服务不可用,直接影响服务调用方  

     640?wx_fmt=png     

     如何应对:识别强弱依赖,对弱依赖进行降级,对强依赖有限降级     


    • “用户有感知” 是强依赖

    • “用户无感知” 是弱依赖

    • 故障发生时,核心业务有损失的是强依赖,无损失的是弱依赖

      640?wx_fmt=png     

      .NET技术架构下的高可用性改进-解耦/隔离       

      业务场景:
      核心业务的调用链路很长,整个链路上包含主流程和辅流程
      辅流程的重要性低,不能因为辅流程的不可用,影响了主流程。

      640?wx_fmt=png

       如何应对:

       640?wx_fmt=png

       .NET技术架构下的高可用性改进-超时治理        

       业务场景:
       对于服务超时,长时间等待会影响用户体验,并发大时还可能造成线程池被打爆。
       同时可能产生服务级联反应,导致大范围服务雪崩。

       640?wx_fmt=png       

        应对方案:
        超时时间设置:服务刚上线时,可以根据压测情况预估一个值;
        服务上线后再根据实际监控进行修改,比如设置99%的请求响应时间为超时时间。
        超时后的处理策略:
        如果不是核心服务,可直接超时返回失败。
        如果是核心服务,可以设置相应的重试次数.         

        示例:
        配置服务超时时间
        设置Http请求超时时间
        设置数据库连接超时、SQL执行超时
        代码控制超时时间(例如:Polly的Timeout策略)

      .NET技术架构下的高可用性改进-重试补偿         

        业务场景:
        实际线上应用中,假如遇到网络抖动、发布重启、数据库阻塞超时等情况,都有可能引起服务调用失败。         

        应对方案:
        通过失败重试、异常后的补偿,尽可能地保证业务可用。
        重试情况下:业务要保证幂等性、保证最终一致性。        

        示例:
        服务失败重试策略
        消息发送、消费失败重试、补偿
        代码层面失败重试补偿(例如:Polly的Retry策略)

      高可用改进还有很多技巧,这里不一一详细给大家赘述了。

      通过对系统进行全面的高可用性改进,提升了我们对线上系统的信心!

四、 展望和规划

    2019年,我们启动了混沌工程实践,逐步建立了混沌工程的自有方法论和体系,通过近一年的混沌工程实践,混沌工程文化逐渐被开发团队所认可。目前,混沌工程已经逐步过渡到线上生产环境进行(这来自于足够的信心和把握)。但这只是一个起步,未来:

  • 正式的混沌工程团队:通过多团队配合、保障资源的持续投入

  • 覆盖所有的关键核心应用:让混沌工程深入到每个产品

  • 坚持O2O混沌工程实践:线下演练、线上验证,更可控

  • 混沌事件注入工具:ChaosBlade for .NET,工具让混沌工程更高效

  • 持续的混沌实验:持续进行、持续改进

    目标:通过混沌工程揭示问题、解决问题、形成闭环,不断提升系统高可用性。

以上是本次China.NET Conf 2019的技术专题,分享给大家。


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

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

相关文章

分布式应用框架 Dapr

微服务架构已成为构建云原生应用程序的标准,微服务架构提供了令人信服的好处,包括可伸缩性,松散的服务耦合和独立部署,但是这种方法的成本很高,需要了解和熟练掌握分布式系统。为了使用所有开发人员能够使用任何语言和任何框架轻松…

使用ASP.NET Core 3.x 构建 RESTful API - 3.1 API资源命名

为了与RESTful API进行交互,API消费者需要使用到三个概念: 资源的标识。也就是可以找到资源的URI。 HTTP方法。例如GET,POST等等,这些方法是HTTP协议的一部分。 有效载荷(可选),英文就是Payload…

HM编码架构

首先进入编码encmain.cpp里的int main 函数,主函数的入口,里面包含的重要函数是时间计数函数和encode()函数。 在encode函数中开始编码。encode函数中,首先输入YUV序列,初始化内部类和成员变量,转换色彩空间&#xff0…

你可能不知道的 docker 命令的奇淫怪巧

你可能不知道的 docker 命令的奇淫怪巧Intro分享一些可能会用到的一些简单实用却可能是你不知道的 docker 命令dangling imagesbuild 自己的 docker 镜像的时候,有时会遇到用一个甚至多个中间层镜像,这会一定程度上减少最终打包出来 docker 镜像的大小&a…

C++ 快速排序算法

快速排序算法最坏的时间复杂度时o(n*n),期望的运行时间为o(nlgn)。 逻辑分析: 1 先从数组中选取一个数作为基数,可随机选择; 2 将数组中大于该基数的放在该基数右边,小于该基数的放在该基数左边; 3对左…

.NET Core on K8S 学习与实践系列文章索引 (更新至20191116)

更新记录:-- 2019-11-16 增加Docker容器监控系列文章// 此外,今天是11月17日,我又老了一岁,祝我自己生日快乐!近期在学习Kubernetes,基于之前做笔记的习惯,已经写了一部分文章,因此给…

C++插入排序算法

插入排序的时间复杂度为o(n*n)。 逻辑分析: 将数组第一个元素认为是有序数组,然后比较第二个元素的关键字与第一个元素关键字的大小,有序排列。 将数组后面一个元素的关键字插入到前面的有序数组中,一直重复至排序完成。 代码…

身边的设计模式(一):单例 与 RedisCacheManager

大家好,以后我会用23篇文章,来给大家讲解设计模式,当然如果你看过我的项目,很多设计模式已经很会了,只是没有注意到,我这里会讲解一下,大家就会发现,如果你看懂了我的项目&#xff0…

插入排序 希尔排序 C++

最优时间复杂度为o(n),又称缩小增量排序。 逻辑分析: 1、希尔排序首先是确定增量,默认的希尔增量(不一定是最优)为length/2。 2、根据增量分组,将分组的元素利用直接插入法排序。 3、增量增量/2&#x…

Kubernetes包管理器Helm发布3.0版本

Helm 3.0 已经发布,该版本是 CLI 工具的最新主要版本,主要关注简单性、安全性和可用性,内容如下:新特性移除 Tiller(Helm 2 是一种 Client-Server 结构,客户端称为 Helm,服务器称为 Ti…

冒泡排序法 C++

实在是想感叹一下,因为一个很简单的东西,自己在网上找了半天反而弄的很复杂,逻辑性太强,小白实在是看不懂。因此,下面是一个最小白的冒泡排序的实现方式。 时间复杂度o(n*n)。 逻辑分析: 依次比较数组中…

“兼职”运维的常用命令

自从产品转到了 dotNET Core 之后,更深入的接触 Linux和 Docker ,而我每天的工作中,有一部分时间相当于在“兼职”做一些运维的事情。下面是一些在日常中常用的命令,算是个备忘吧。环境操作系统:CentOS7Docker&#xf…

选择排序 C++

选择排序的时间复杂度为o(n*n)&#xff0c;空间复杂度为o(n)。 逻辑分析&#xff1a; 1 假设数组中的最小数为a[0]&#xff0c;然后比较数组中其他数与a[0]的大小&#xff0c;若a[i]<a[0]&#xff0c;则交换两者为止&#xff0c;如此循环下来&#xff0c;最小的数字就存在…

rabbitmq死信队列详解与使用

先从概念解释上搞清楚这个定义&#xff0c;死信&#xff0c;顾名思义就是无法被消费的消息&#xff0c;字面意思可以这样理解&#xff0c;一般来说&#xff0c;producer将消息投递到broker或者直接到queue里了&#xff0c;consumer从queue取出消息进行消费&#xff0c;但某些时…

归并排序算法 C++

感谢博客https://blog.csdn.net/a130737/article/details/38228369 归并排序的时间复杂度为o(nlgn)&#xff0c;空间复杂度为o(n)。是一种采用分治思想的排序方法。 逻辑分析&#xff1a; 假设输入数组a[] { 2, 1, 4, 5, 3, 8, 7, 9, 0, 6 }。 首先将数组二分成两个数组le…

使用ASP.NET Core 3.x 构建 RESTful API - 3.2 开始建立Controller和Action

Demo下面我们就来实践一下。打开之前的项目&#xff0c;并建立CompaniesController&#xff1a; 这里有6个地方比较关键&#xff0c;我们挨个看一下&#xff1a; RESTful API 或者其它Web API的Controller都应该继承于 ControllerBase 这个类&#xff08;点此查看详细的官方文档…

C++ 链表

线性表&#xff08;顺序表&#xff09;有两种存储方式&#xff1a;链式存储和顺式存储&#xff0c;顺式存储如数组&#xff0c;其内存连续分配&#xff0c;且是静态分配。链式存储&#xff0c;内存是不连续的&#xff0c;且是动态分配。前一个元素存储数据&#xff0c;后一个元…

波拉契尔数列 C++

题目&#xff1a;写一个函数&#xff0c;输入n, 求斐波那契数列的第n项。 分析&#xff1a;该题有两种实现方式递归或循环。当n比较大的时候f(n)结果也会比较大&#xff0c;故定义的时候可以采用long(int 也行)。递归会有大量的重复计算&#xff0c;而循环可以把f(n-1)和f(n-2)…

Deepin 下 使用 Rider 开发 .NET Core

国产的 Deepin 不错&#xff0c;安利一下。Deepin 用了也有一两年&#xff0c;也只是玩玩&#xff0c;没用在开发上面。后来 Win10 不太清真了&#xff0c;就想着能不能到 Deepin下撸码。要搞开发&#xff0c;首先少不了 IDE&#xff0c;VS2019 用不来&#xff0c;Vs Code 太复…