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

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

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

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

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

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

Kubernetes包管理器Helm发布3.0版本

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

“兼职”运维的常用命令

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

rabbitmq死信队列详解与使用

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

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

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

C++ 链表

线性表(顺序表)有两种存储方式:链式存储和顺式存储,顺式存储如数组,其内存连续分配,且是静态分配。链式存储,内存是不连续的,且是动态分配。前一个元素存储数据,后一个元…

波拉契尔数列 C++

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

Deepin 下 使用 Rider 开发 .NET Core

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

[视频演示].NET Core开发的iNeuOS物联网平台,实现从设备PLC、云平台、移动APP数据链路闭环...

此次我们团队人员对iNeuOS进行了全面升级,主要升级内容包括:(1) 设备容器增加设备驱动,包括:西门子(S7-200smart、S7-300、S7-400、S7-1200、S7-1500)、三菱(FxSerial…

选择开源项目什么最重要?

开发人员在决定是否使用某个开源项目时考虑到的最重要事项是什么?代码质量?安全性?好的文档?上述因素都很重要,但根据 Tidelift 和 The New Stack 的联合调查,控制着开源项目的开源许可证才是最需要考量的因…

居然不知道和的区别?

前言那年刚找工作那会,就碰到过这么一个简单的题目“&和&&的区别” 那时知识面窄,大概也就知道1.都是作为逻辑与的运算符。2.&&具有短路功能,计算出前者false,就不需计算后者的true or false。后来在微信群里…

【DevOps进行时】自动化测试之单元测试

在DevOps建设中,主流的测试分层体系可以分为单元测试、接口测试和界面测试。Google曾提出一个经验法则:70%的小型测试,20%的中型测试,10%大型测试。当然,这个比例不是确定的,不同类型的项目,测试…

Zongsoft.Data 发布公告

很高兴我们的 ORM 数据访问框架(Zongsoft.Data)在历经两个 SaaS 产品的应用之后,今天正式宣布对外推广。它是一个类 GraphQL 风格的 ORM(Object/Relational Mapping) 数据访问框架。又一个轮子?在很长时间里,.NET 阵营似乎一直缺乏一个被普遍…

使用 .NET Core模板引擎创建自定义的模板和项目

本文要点.NET CLI 包含了一个模板引擎,它可以直接利用命令行创建新项目和项目项。这就是“dotnet new”命令。默认模板集涵盖了默认控制台和基于 ASP.NET 的应用程序以及测试项目所需的基本项目和文件类型。自定义模板可以创建更加有趣或定制化的项目和项目项&#…

.NET Core前后端分离快速开发框架(Core.3.0+AntdVue)

时间真快,转眼今年又要过去了。回想今年,依次开源发布了Colder.Fx.Net.AdminLTE(254Star)、Colder.Fx.Core.AdminLTE(335Star)、DotNettySocket(82Star)、IdHelper(47Star),这些框架及组件都是本着以实际出发,实事求是的态度&…

.Net开发3年,应聘大厂惨遭淘汰,如何翻身打脸面试官?

(设计师忘记了,这里还有个双十一福利课,还能1元秒杀!)

面对金九银十铜十一你真的准备好了吗?

作者:回首笑人间,高级Java工程师一枚,热爱研究开源技术,架构师社区合伙人!前言:又是一年一度的金九银十跳槽季,回首在经历了半个月的求职奔波后,终于又能安稳的静下心来敲代码了&…

深入理解二叉搜索树

什么是二叉搜索树? 顾名思义,一颗二叉搜索树是基于二叉树来组织的,它包括许多动态集合操作(Search,MiniNum, MaxiNum, Prodecessor, Successor, Insert 和Delete等)。二叉搜索树上的基本操作所花费的时间与…