首页 > 其他分享 >如何避免单点风险:基于实践经验分享服务拆分原则的一些思考

如何避免单点风险:基于实践经验分享服务拆分原则的一些思考

时间:2023-05-01 20:44:49浏览次数:55  
标签:基于 服务 业务 实践经验 架构 拆分 单点 团队

  • 缘起:系统崩了

  • 具体情况:1%的请求影响了剩余90%的请求

  • 架构演进:拆分热点服务【进程级隔离】

  • 复盘

  • 总结

  • 拆服务的经典实践

 


不能变形的变形金刚也叫变形金刚?

缘起
系统崩溃了?别惊慌!这里有快速恢复的方法!
分析发现,网站崩时服务X被流量打垮,继而依赖服务X的其它服务开始互相“踩踏”,最终崩溃。
网站崩时,服务X的QPS过高,实际达到了业务gateway服务的2倍~~

 

出故障时的系统结构概览:

 


一个请求的生命周期

具体情况:1%的请求影响了剩余90%的请求

 

相同时段之前崩掉服务的情况:

 

业务gateway的流量为什么会远小于服务x的流量是不是合理?

 

业务服务与基础数据服务耦合在一块是不是合理的??

 


接口响应时长, 也从毫秒级, 快速退化到秒级

 

图片

一个查Redis缓存的请求耗时7708ms

图片

org.springframework.web.servlet.FrameworkServlet.doGet(javax.servlet.http.HttpServletRequest request, javax.servlet.http.HttpServletResponse response)

解决方案:拆分热点服务【进程级隔离】+水平扩容+k8s HPA

https://www.processon.com/view/6447cd7e8e188d4a087d3d1e

架构升级后服务的效果:
1、架构更合理了
2、接口响应时间更短

 

 

复盘
1、这是谁的问题?
这是服务的稳定性的问题。

2、有什么问题?
一个服务崩了,导致整个业务系统崩了。

3、解决的思路是什么?
把整个业务系统依赖的基础拆出来。

总结
一个基础服务不可用,导致整个业务系统不可用。
然后,通过把这个基础服务拆成一个单独的服务,来解决这个问题。

 

思考
服务拆分的原则是什么?

在分享关于服务拆分的思考之前,让我们先来谈一些相关的概念吧。

什么是架构?

软件架构是指软件系统的顶层结构,而架构设计的目的是为了解决软件复杂度,是为了使软件项目更加可靠、高效和可扩展,以便于持续迭代。
架构的思考来源于对生命周期的识别,以及对生命周期的拆分。如果没有生命周期拆分的思考,就不能算架构。什么是微服务架构?
微服务架构是一种架构模式,它提倡将单一应用程序划分成一组小的服务,服务之间互相协调、互相配合,为用户提供最终价值。微服务架构的本质是分布式系统。
来看看Martin Fowler大佬的理解:

 


上述英文的三个关键词分别是:small、lightweight、automated,这基本上浓缩了微服务的精华,也是微服务和SOA的本质区别所在。

微服务拆分的目的是什么?服务拆分的目的是将庞大复杂的系统拆分成小而简单的服务,以便更好地应对持续迭代的需求。
这样做的好处在于,各个服务可以独立运行,降低了彼此的耦合度,使得后续的开发、部署、测试和维护等工作更加容易进行,从而提高了系统的可靠性、可扩展性和可维护性。因此,服务拆分不仅是为了简化系统,也有助于让系统更好地适应未来的变化

微服务拆分的原则:化大而复杂为小而简单。

进行服务化拆分,把一个大而复杂的问题化解为多个小而简单的问题,服务之间通过契约来约定依赖,做到服务独立发布和演进。
微服务到底有多微,是个仁者见仁,智者见智的问题,最重要的是团队觉得是合适的。但注意,要达成“团队觉得合适”的结论,至少还应该遵循以下两个基本前提:

  • 业务独立性

首先,应该保证微服务是具有业务独立性的单元,并不能只是为了微而微。关于如何判断业务的独立性,也有不同的考量。譬如可以将某一个领域的模型作为独立的业务单元,譬如 订单、商品、财务、售后等;也可以将某业务行为作为独立的业务单元,譬如发送邮件、不同数据库之间的业务数据同步等。

  • 团队自主性

其次,考虑到团队的沟通及协作成本,一般不建议超过10个人。当团队超过10个人,在沟通、协作上的所耗费的成本会显著增加。当团队成员超过10个人的时候,可以考虑继续再划分子团队,让不同的子团队承担独立的工作。

微服务拆分过程中的坑

  • 微服务拆过细,过分强调“small”
  • 微服务基础设施不健全,忽略了“automated”
  • 微服务并不轻量级,规模大了后,“lightweight”不再适应


如何拆分?

对拆分依据的思考,实际上是在问:“服务的粒度如何界定”。
针对微服务拆分过细导致的问题,建议基于团队规模进行拆分,类似贝索斯在定义团队规模时提出的“两个披萨”理论(每个团队的人数不能多到两个Pizza都不够吃的地步)。
那么,以“三个火枪手”为原则的微服务拆分粒度,即一个微服务三个人负责开发。当我们在实施微服务架构时,根据团队的规模来划分微服务数量,如果业务规模继续发展,团队规模扩大,我们再将已有的微服务按这个原则拆分。
“三个火枪手”的原则主要应用于微服务设计和开发阶段,如果微服务经过一段时间发展后已经比较稳定,处于稳定期了,无需太多的开发,那么1个人维护1个微服务甚至几个微服务都可以。
拆分的思路

基于“三个火枪手”的理论,我们可以计算出拆分后合适的服务数量,但具体怎么拆分也是有技巧的,并不是快刀斩乱麻随便拆分成指定的数量就可以了。常见的拆分方式有如下几种,接下来我们一一介绍。
(1)基于业务逻辑拆分
将系统中的业务模块按照职责范围识别出来,每个单独的业务模块拆分为一个独立的服务。
(2)基于可扩展拆分
将系统中的业务模块按照稳定性进行排序,将已经成熟和改动不大的服务拆分为稳定服务,将经常变化和迭代的服务拆分为变动服务。刚开始,稳定的服务粒度可以粗一些,即使逻辑上没有强关联的服务,也可以放在同一个子系统中。例如,将“消息推送服务”和“升级服务”放在同一个子系统中。
这样拆分主要是为了提升项目快速迭代的效率,避免在开发的时候,不小心影响已有的成熟功能,引发了线上问题。
(3)基于可靠性拆分
将系统中的业务模块按照优先级排序,将可靠性要求高的核心服务和可靠性要求低的非核心服务拆分开来,然后重点保证核心服务的高可用。具体拆分的时候,核心服务可以是一个,也可以是多个,只要最终的服务数据满足“三个火枪手”的原则就可以。
这样拆分可以带来如下几个好处:

  • 避免非核心服务故障影响核心服务

  • 核心服务高可用方案可以更简单

核心服务的功能逻辑更加简单,存储的数据可能更少,用到的组件也会更少,设计高可用方案在大部分情况下要比不拆分要简单得多。

  • 能够降低高可用成本

    将核心服务拆分出来后,核心服务占用的机器、带宽等资源比不拆分要少得多。因此只针对核心服务做高可用方案,机器、带宽等成本比不拆分要节省较多。

    (4)基于性能拆分

基于性能拆分和基于性能拆分类似,将性能要求高或性能压力大的模块拆分出来,避免性能压力大的服务影响其它服务。
常见的拆分方式和具体的性能瓶颈有关,可以拆分Web服务、数据库、Cache等。
例如,电商的抢购,性能压力最大的入口的排队功能,可以将排队功能独立为一个服务。

以上几种拆分方式不是多选一,而是可以根据实际情况自由排列组合。

小结
服务拆分的目的是为了提高软件项目的可靠性、效率和可扩展性,以便更好地应对持续迭代的需求、支撑软件的增长。通过将大型应用程序拆分成小的、独立的部分,可以降低系统复杂度并提高整体质量。这种架构设计也有助于快速开发、测试和部署代码,从而提高开发团队的工作效率。
如果无法实现上述的目标,就需要重新考虑是否有必要进行服务拆分。


引用
https://martinfowler.com/articles/microservices.html
https://time.geekbang.org/column/intro/100006601?code=SWmCO2yChZKMsxvoZphPgPyr8SX0c6wLhHZBcxyOZFs%3D&source=app_share
《从零开始学架构 照着做,你也能成为架构师》
《微服务 架构与实践》
《聊聊“架构”》
https://www.bilibili.com/video/av71345202

https://mp.weixin.qq.com/s/f1sEprXHw1ciYljH5PP3yw

 

标签:基于,服务,业务,实践经验,架构,拆分,单点,团队
From: https://www.cnblogs.com/softidea/p/17366971.html

相关文章

  • cas单点登录-1.准备cas-server
    1、获取对应java版本的cas服务端代码GitHub-apereo/cas-overlay-template:ApereoCASWAROverlaytemplate对应的java版本为(截止2023/4/27) 根据电脑环境拉取对应分支的代码2、编译打包window:点击build.sh,或者执行命令mvncleanpackage-Dmaven.test.skip=true获取w......
  • 数位拆分
    https://ac.nowcoder.com/acm/contest/11228/D观察这四种操作,a=0,b=1,b可以乘上x,且a可以加上b观(1234)x,x表示为x进制,则(1234)x=1*pow(x,3)+2*pow(x,2)+3*pow(x,1)+4*pow(x,0)此时已经发现了构造方法,即将n这个十进制的数转换为x进制,再根据上面列的进制拆分来还......
  • leetcode343. 整数拆分
    classSolution{public:intf[60];//f[i]记录i能拆出的最大乘积intintegerBreak(intn){for(inti=2;i<=n;i++)for(intj=1;j<i;j++)//枚举最后一个拆出的数字,这里不能只循环到i/2f[i]=max(f[i],max(j*f[i-j],j*(i-j)));......
  • C#开发的免费PDF转换、压缩、拆分、合并助手
    《骑士科技星火计划》现推出首款产品—《工程人PDF助手》,为工程人打造属于自己的PDF功能助手,具有PDF转换、压缩、拆分及合并等功能。《工程人PDF助手》为《骑士科技星火计划》首款产品,安装步骤简单,操作便捷,供各位工程人免费使用! 获取方式欢迎关注公众号《工程人的编程课堂》,后......
  • .NET CORE开源 DDD微服务 支持 多租户 单点登录 多级缓存、自动任务、分布式、日志、
    源代码地址https://github.com/junkai-li/NetCoreKevin基于NET6搭建跨平台DDD思想WebApi架构、IDS4单点登录、多缓存、自动任务、分布式、多租户、日志、授权和鉴权、CAP、SignalR、docker部署 如需简约项目可直接去除项目引用解耦设计都可以单独引用架构默认全部引用并启动......
  • asp.net程序通过Microsoft Azure中SAML协议实现单点登录
    1.新建应用程序登录Azure门户,进入左侧菜单“企业应用程序--所有应用程序”,点“新建应用程序”,继续点“创建你自己的应用程序”,如下图选择和录入名称:填好应用的名称、想要如何处理应用程序必须选择第三个“继承未在库中找到的任何其他应用程序(非库)”,之后点“创建”按钮;2.单......
  • 【ACM算法竞赛日常训练】DAY16【奇♂妙拆分】【区区区间间间】【小AA的数列】数学 |
    DAY16共3题:奇♂妙拆分(简单数学)区区区间间间(单调栈)小AA的数列(位运算dp)......
  • 响应拆分漏洞
    1、介绍典型的响应拆分漏洞,是指攻击者可以控制参数,使得受害者用户的浏览器接收到的响应头部字段的名称或值被拆分成多个字段。一般,在网络传输中,http的头部字段以\r\n结尾。但是如果响应字段中,包含攻击者控制的参数,本身存在\r\n,那么传输给用户客户端后,会被解析出下一个响应字段。......
  • 代码随想录 day 46 139.单词拆分
    给定一个非空字符串s和一个包含非空单词的列表wordDict,判定 s是否可以被空格拆分为一个或多个在字典中出现的单词。说明:拆分时可以重复使用字典中的单词。你可以假设字典中没有重复的单词。示例1:输入:s="leetcode",wordDict=["leet","code"]输出:true解释:......
  • 【打怪升级】【微服务】聊聊微服务拆分设计
    并不是所有的场景都适合微服务,我理解技术开发者都有一颗追求新技术的心,但是更重要的是业务场景及团队。关于微服务微服务架构,说白了就是一种上层体系的演变。从最早的单体架构,到前后分离,SOA,甚至微服务架构,其实它们都在做一件事,并且都朝着一个方向去发展:那就是分而治之......