除了「加机器」,其实你的微服务还能这样优化

news2024/11/25 21:52:09

    生产实践中,如果遇到业务流量变高导致服务负载升高甚至报警,我们的第一反应往往是「加机器」。

俗话说,能用钱解决的问题都不是问题。

俗话又说,充钱你就能变得更强。

但是,作为一个有理想有抱负的架构师,除了「加机器」,其实你的微服务还能更优雅、更精细地进行优化。

本文预计阅读时间 10 分钟,将从以下三个方面展开:

  • 从「AKF 扩展立方」说起

  • Y 轴扩展的常用模式

  • z 轴扩展的思想与应用

1、从「AKF 扩展立方」说起

在上一篇文章,我们从「服务维度」学习架构师的常用能力 —— 微服务设计与治理。

围绕着微服务生命周期的七个阶段,总结了常用的 16 条原则。

其中原则 15 在微服务服务治理实践中非常重要,本文将重点进行拆解分析。

原则 15:参考「AKF 扩展立方」模型,服务除了「水平扩容」外,还可以考虑「功能拆分」或者 「数据分区」。

所谓 AKF 扩展立方体(AKF Scale Cube),是一个描述从单体应用到一个分布式可扩展架构的模型概念。

  • X 轴:服务和数据的水平扩容。

  • Y 轴:功能 / 业务拆分

  • Z 轴:沿客户边界的服务和数据分区

「水平扩容」比较容易理解,就是我们常见的操作 —— 加机器。

根据 AKF 模型,面对服务负载升高的情况,其实除了加机器外,我们还可以考虑「功能拆分」或者 「数据分区」。

2、Y 轴扩展的常用模式

「Y 轴扩展」相对复杂,我总结了几种模式:

  • 微服务拆分。根据具体业务模型、领域模型拆分更细粒度的微服务。

  • 业务隔离拆分。利用消息队列,将在线业务(OLTP)和耗费大量资源的计算任务拆分隔离。

  • 核心与非核心隔离。对于一个微服务,可以将 SKA 客户与普通客户进行隔离,SKA 客户使用独立的集群资源,提高稳定性。

2.1 微服务拆分

某个微服务负载过高,一个非常常见的原因就是这个微服务承担了过多的职责。这个时候,我们需要根据具体业务模型、领域模型拆分更细粒度的微服务。也是我们常说的「垂直拆分」。

最典型的拆分方法论就是按照领域驱动设计(DDD) 进行拆分。

以电商领域为例,按照领域可以拆分为:

  • 用户服务

  • 商品服务

  • 订单服务

  • 评价服务

  • 其他

系统按照领域拆分为多个微服务后,各个微服务由单独的团队负责整个生命周期的维护,单独部署运行。

这种隔离拆分的方式,能带来以下优势:

  • 提高整体系统的负载能力

  • 各个微服务间具备 独立扩缩容、故障隔离 等能力。

2.2 耗时任务隔离拆分

「Y 轴扩展」除了按照领域进行服务拆分之外,另外一种非常重要的拆分方式,是将在线业务(OLTP) 类型服务中「耗时任务」进行隔离拆分。

我们服务一般会采用 Tomcat 或者 Jetty 部署,同时采用同步调用的方式。以 Jetty 为例,默认线程池最大线程数为 200。如果请求中有耗时任务,影响了同步请求的 RT,那么线程池满后就会阻塞请求。

正如利特尔法则(Little's law)表述的:
在一个稳定的系统(L)中,长期的平均顾客人数,等于长期的有效抵达率(λ),乘以顾客在这个系统中平均的等待时间(W);或者,我们可以用一个代数式来表达:

因此,耗时任务会显著提高服务负载、降低在线业务服务的吞吐能力。

通过引入消息队列或者任务队列框架,我们可以将耗时任务从在线业务服务中进行隔离拆分。

这种隔离拆分的方式,能带来以下优势:

  • 提高在线服务的吞吐能力

  • 避免耗时任务影响在线业务的稳定性。

2.3 核心与非核心隔离拆分

「Y 轴扩展」的第三种方式,是将 核心 与 非核心 进行拆分。

比如,我们通常可能会将「核心接口」与「非核心」接口通过一个服务内的不同线程池实现隔离。但是在节点资源(cpu / 内存 / 带宽等)上并不能实现隔离。

因此,我们可以更进一步,通过集群拆分的形式进行隔离。

通过服务路由的配置,将核心接口路由到核心集群(一般节点配置更高),非核心接口路由到非核心集群。

另外,也有 saas 服务,通常会对 SKA 客户做独立集群,也是类似的逻辑。

其实按用户拆分隔离跟「数据分区」有一点类似,也可以归类到「z 轴扩展」

这种隔离拆分的方式,能带来以下优势:

  • 精细化提高服务吞吐能力(针对核心接口、核心客户)

  • 核心业务独享资源,提高核心业务稳定性

  • 避免非核心接口 / 用户 影响 核心接口 / 用户 的稳定性

3、Z 轴扩展的思想与应用

Z 轴扩展的核心思想,是基于请求者或用户独特的需求,进行系统划分,并使得划分出来的子系统是相互隔离但又是完整的。

生产实践中,常用的 z 轴扩展有两种应用:

  • 单元化架构

  • 数据分区

3.1 单元化架构

单元化架构主要关注的是应用部署、调用层面的问题。

一个单元,是一个五脏俱全的缩小版全站,它部署了所有微服务。

但它又不是真正的全站,因为每个单元只能操作一部分数据。

从这里我们也能看出,单元化架构要求系统必须具备的一项能力 —— 数据分区。

当然,仅把数据分区了还不够,单元化的另外一个必要条件是,全站所有业务数据分区所用的拆分维度和拆分规则都必须一样。

一般来说,我们绝大多数系统都是面向用户的,按用户维度对数据分区,是一个最佳实践。

当然,如果是全球化部署的单元化架构,还需要考虑按照地域进行分区。

3.2 数据分区

数据分区(shard),即是将全局数据按照某一个维度水平划分开来,每个分区的数据内容互不重叠,这也就是数据库「水平拆分」所做的事情。

前面提到了「数据分区」是「单元化」的必要条件,但是「数据分区」还有其他很多场景应用。

最典型的,就是 MySQL 单机瓶颈后,需要进行「分库分表」。在服务中需要引入一些支持数据拆分和路由的中间件,如 sharding-jdbc、mycat 等,在数据层面需要配置相应的分片逻辑。

另外,其他数据库的分区扩展(如 redis 集群、mongo 集群等),也是非常典型的应用场景。

一般包括以下几种数据划分的方式:

  • 数据类型(如:业务类型)

  • 数据范围(如:时间段,用户 ID)

  • 数据热度(如:用户活跃度,商品热度)

  • 按读写分(如:商品描述,商品库存)

4、小结

本文从「AKF 扩展立方」说起,介绍了提高服务负载能力的几种服务治理方式。

除了 X 轴扩展(加机器)外,还可以通过 Y 轴扩展(功能 / 业务拆分)、Z 轴扩展(数据分区)等方式,更优雅、更精细地进行优化。

希望能够抛砖引玉,提供一些启发和思考。如果你有其他补充和建议,欢迎留言讨论。

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

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

相关文章

前端——7.图像标签和路径

这篇文章,我们来讲解一下图像标签 目录 1.图像标签 1.1介绍 1.2实际展示 1.3图像标签的属性 1.3.1 alt属性 1.3.2 title属性 1.3.3 width / height 属性 1.3.4 border属性 1.4注意事项 2.文件夹 2.1目录文件夹和根目录 2.2 VSCode打开目录文件夹 3.路…

决策树学习报告

报告 一、基本概念 决策树的定义:首先,决策树是一种有监督的分类算法——即给定X,Y值,构建X,Y的映射关系。不同于线性回归等是多项式,决策树是一种树形的结构,一般由根节点、父节点、子节点、…

MyBatis-Plus的入门学习

MyBatis-Plus入门学习简介特性快速开始MyBatis-Plus的注解详解Tableld主键生成策略1、数据库自动增长 AUTO2、UUID3、Redis生成id4、MP主键自动生成TableNameTableField自动填充测试方法:update乐观锁select查所有根据id查多个id批量查询简单条件查询(通…

MySQL性能优化

MySQL性能调优 存储数据类型优化 尽量避免使用 NULL尽量使用可以的最小数据类型。但也要确保没有低估需要存储的范围整型比字符串操作代价更低使用 MySQL 内建的数据类型(比如date、time、datetime),比用字符串更快 基本数据类型 数字 整数…

中国巨头在NLP领域的大模型布局

什么是大模型? 大规模模型(large-scale model)是近年来人工智能领域的一个热点话题,因为它们可以对自然语言处理(NLP)和其他任务进行更准确和深入的处理。由于大模型需要庞大的计算资源和数据支持&#xf…

论文投稿指南——中文核心期刊推荐(国家财政)

【前言】 🚀 想发论文怎么办?手把手教你论文如何投稿!那么,首先要搞懂投稿目标——论文期刊 🎄 在期刊论文的分布中,存在一种普遍现象:即对于某一特定的学科或专业来说,少数期刊所含…

SpringSecurity第二讲

目录 二、SpringSecurity02 2.1 JWT概述 2.1.1 JWT介绍 2.1.2 跨域认证问题 2.2 JWT的原理 2.3 JWT的数据结构 2.3.1 Header 2.3.2 Payload 2.3.3 Signature 2.4 JWT的使用方式 2.5 JWT的使用 2.5.1 引入JWT依赖 2.5.2 编写JWT工具类 2.6 编写前后端不分离的项目…

【C语言】每日刷题 —— 牛客语法篇(3)

前言 大家好,继续更新专栏c_牛客,不出意外的话每天更新十道题,难度也是从易到难,自己复习的同时也希望能帮助到大家,题目答案会根据我所学到的知识提供最优解。 🏡个人主页:悲伤的猪大肠9的博客…

sd卡格式化后数据恢复怎么操作

有时候我们需要清空SD卡数据文件,有时候则是因为需要修复SD卡所以需要格式化,但是却被提示无法格式化SD卡。这种情况往往是由于平时SD卡使用时的一些不良习惯或是SD卡中病毒,病毒在运行SD卡中的软件所造成的。那么sd卡格式化后数据恢复怎么操…

[数据结构]栈的深入学习-java实现

CSDN的各位uu们你们好,今天千泽带来了栈的深入学习,我们会简单的用代码实现一下栈, 接下来让我们一起进入栈的神奇小世界吧!0.速览文章一、栈的定义1. 栈的概念2. 栈的图解二、栈的模拟实现三.栈的经典使用场景-逆波兰表达式总结一、栈的定义 1. 栈的概念 栈:一种…

国密SM4分组密码算法

前言密码,是指使用特定变换对数据等信息进行加密保护或安全认证的物项(承载算法、密钥、密文的介质)和技术,主要用于加密和安全认证(身份识别、完整性、抗抵赖性)。密码按照保密等级,又分为核密…

06 电力电子仿真 MATLAB/Simulink

文章目录01 单相半波整流电路02 单相全波整流电路(子系统封装模块)03 三相桥式整流电路(三相模块与示波器使用)04 相控与斩控交交调压(THD计算)05 Buck电路(PWM实现与闭环反馈)06 单…

【STL】Vector剖析及模拟实现

✍作者:阿润菜菜 📖专栏:C vector的常用接口 首先贴上:vector的文档介绍,以备查阅使用。 vector的基本框架: vector的成员变量分别是空间首部分的_start指针和最后一个元素的下一个位置的_finish指针,以…

Tomcat安装及启动

日升时奋斗,日落时自省 目录 1、Tomcat下载 2、JDK安装及配置环境 3、Tomcat配置环境 4、启动Tomcat 5、部署演示 1、Tomcat下载 直接入主题,下载Tomcat 首先就是别下错了,直接找官方如何看是不是广告,或者造假 搜索Tomc…

【强度混合和波段自适应细节融合:PAN-Sharpening】

Intensity mixture and band-adaptive detail fusion for pansharpening (用于全色锐化的强度混合和波段自适应细节融合) 全色锐化的目的是通过高分辨率单通道全色(PAN)图像锐化低分辨率多光谱(MS)图像&a…

ChatGPT、人工智能、人类和一些酒桌闲聊

© 2023 Conmajia Initiated 10th March, 2023 昨天跟某化学家喝酒,期间提到了 ChatGPT。他的评价是:这鬼东西大量输出毫无意义、错漏百出甚至是虚假的信息,“in a confident accent”。例如某次 GPT 针对“描述某某记者”这一问题&#…

C++的入门

C的关键字 C总计63个关键字&#xff0c;C语言32个关键字 命名空间 我们C的就是建立在C语言之上&#xff0c;但是是高于C语言的&#xff0c;将C语言的不足都弥补上了&#xff0c;而命名空间就是为了弥补C语言的不足。 看一下这个例子。在C语言中会报错 #include<stdio.h>…

【C++】C++11——左右值|右值引用|移动语义|完美转发

文章目录一、左值与右值1.概念2.引用3.注意二、右值引用的意义1.左值引用意义2.右值引用和移动语义3.容器新增三、万能引用四、完美转发一、左值与右值 1.概念 左值是什么&#xff1f;右值是什么&#xff1f; 左值是一个表示数据的表达式&#xff08;如变量名或解引用的指针&…

学校学生心理测评系统

青少年在线心理测评系统 这款系统&#xff0c;是和北大合作开发&#xff0c;并真实用于线上测评场景&#xff0c;该项目有完整后台&#xff0c;以及学生管理等模块。 我们欢迎以下形式合作&#xff1a; 单纯研究项目。合作对该测评平台进行升级。单纯使用。 请联系我们 silv…

MyBatis里面用了多少种设计模式?

在MyBatis的两万多行的框架源码中&#xff0c;使用了大量的设计模式对工程架构中的复杂场景进行解耦&#xff0c;这些设计模式的巧妙使用是整个框架的精华。经过整理&#xff0c;大概有以下设计模式&#xff0c;如图1所示。图101类型&#xff1a;创建型模式▊ 工厂模式SqlSessi…