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

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

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


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

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


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


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

  • 从「AKF扩展立方」说起
  • Y轴扩展的常用模式
  • z轴扩展的思想与应用


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


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

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

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

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


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

640.png

  • X轴:服务和数据的水平扩容。
  • Y轴:功能/业务拆分
  • Z轴:沿客户边界的服务和数据分区


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

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


2、Y轴扩展的常用模式


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

  • 微服务拆分。根据具体业务模型、领域模型拆分更细粒度的微服务。
  • 业务隔离拆分。利用消息队列,将在线业务(OLTP)和耗费大量资源的计算任务拆分隔离。
  • 核心与非核心隔离。对于一个微服务,可以将SKA客户与普通客户进行隔离,SKA客户使用独立的集群资源,提高稳定性。


2.1 微服务拆分


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

640.png

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

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

  • 用户服务
  • 商品服务
  • 订单服务
  • 评价服务
  • 其他

640.png

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

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

  • 提高整体系统的负载能力
  • 各个微服务间具备 独立扩缩容、故障隔离 等能力。

2.2 耗时任务隔离拆分


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


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

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


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

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

640.png

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

  • 提高在线服务的吞吐能力
  • 避免耗时任务影响在线业务的稳定性。


2.3 核心与非核心隔离拆分


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


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


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

640.png

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

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

640.png

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

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

  • 精细化提高服务吞吐能力(针对核心接口、核心客户)
  • 核心业务独享资源,提高核心业务稳定性
  • 避免非核心接口/用户 影响 核心接口/用户 的稳定性

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


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

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

  • 单元化架构
  • 数据分区


3.1 单元化架构


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

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

640.png

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


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

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


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

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


3.2 数据分区


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


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


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


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

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

  • 数据类型(如:业务类型)
  • 数据范围(如:时间段,用户 ID)
  • 数据热度(如:用户活跃度,商品热度)
  • 按读写分(如:商品描述,商品库存)


4、小结


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

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


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


往期热门笔记合集推荐:

  • HBase原理与实战笔记合集
  • MySQL实战笔记合集
  • Canal/Otter源码与实战笔记合集
  • Java实战技巧笔记合集
目录
相关文章
|
6月前
|
运维 云计算 Docker
深入理解与实践:基于Docker的微服务架构优化策略
本文旨在为软件开发和运维人员提供一个全面的指南,探讨如何通过Docker容器技术优化微服务架构。我们不仅深入分析了Docker在微服务环境中的关键作用,还提出了一系列实践策略,以提高部署效率、增强系统稳定性,并确保服务的可伸缩性和安全性。通过具体案例分析和比较传统部署方式的局限性,本文展示了Docker如何成为微服务架构优化不可或缺的工具,旨在帮助读者构建一个更加灵活、高效和可靠的服务环境。
216 1
|
2月前
|
消息中间件 缓存 监控
优化微服务架构中的数据库访问:策略与最佳实践
在微服务架构中,数据库访问的效率直接影响到系统的性能和可扩展性。本文探讨了优化微服务架构中数据库访问的策略与最佳实践,包括数据分片、缓存策略、异步处理和服务间通信优化。通过具体的技术方案和实例分析,提供了一系列实用的建议,以帮助开发团队提升微服务系统的响应速度和稳定性。
|
14天前
|
存储 NoSQL 分布式数据库
微服务架构下的数据库设计与优化策略####
本文深入探讨了在微服务架构下,如何进行高效的数据库设计与优化,以确保系统的可扩展性、低延迟与高并发处理能力。不同于传统单一数据库模式,微服务架构要求更细粒度的服务划分,这对数据库设计提出了新的挑战。本文将从数据库分片、复制、事务管理及性能调优等方面阐述最佳实践,旨在为开发者提供一套系统性的解决方案框架。 ####
|
1月前
|
监控 API 开发者
后端开发中的微服务架构实践与优化
【10月更文挑战第17天】 本文深入探讨了微服务架构在后端开发中的应用及其优化策略。通过分析微服务的核心理念、设计原则及实际案例,揭示了如何构建高效、可扩展的微服务系统。文章强调了微服务架构对于提升系统灵活性、降低耦合度的重要性,并提供了实用的优化建议,帮助开发者更好地应对复杂业务场景下的挑战。
22 7
|
1月前
|
Cloud Native API 持续交付
利用云原生技术优化微服务架构
【10月更文挑战第13天】云原生技术通过容器化、动态编排、服务网格和声明式API,优化了微服务架构的可伸缩性、可靠性和灵活性。本文介绍了云原生技术的核心概念、优势及实施步骤,探讨了其在自动扩展、CI/CD、服务发现和弹性设计等方面的应用,并提供了实战技巧。
|
1月前
|
开发者 Docker 微服务
利用Docker Compose优化微服务架构
在微服务架构中,Docker Compose提供了一种简便有效的方法来定义和运行多容器Docker应用程序,通过YAML文件配置服务、网络和卷,实现一键创建和启动。这不仅确保了开发、测试和生产环境的一致性,还简化了团队协作和维护工作,大幅提升了开发效率。本文将详细介绍Doker Compose的核心优势、基本使用方法及高级功能,帮助你更好地管理和优化微服务架构。
|
1月前
|
存储 Kubernetes 监控
深度解析Kubernetes在微服务架构中的应用与优化
【10月更文挑战第18天】深度解析Kubernetes在微服务架构中的应用与优化
109 0
|
2月前
|
Kubernetes Java Android开发
用 Quarkus 框架优化 Java 微服务架构的设计与实现
Quarkus 是专为 GraalVM 和 OpenJDK HotSpot 设计的 Kubernetes Native Java 框架,提供快速启动、低内存占用及高效开发体验,显著优化了 Java 在微服务架构中的表现。它采用提前编译和懒加载技术实现毫秒级启动,通过优化类加载机制降低内存消耗,并支持多种技术和框架集成,如 Kubernetes、Docker 及 Eclipse MicroProfile,助力开发者轻松构建强大微服务应用。例如,在电商场景中,可利用 Quarkus 快速搭建商品管理和订单管理等微服务,提升系统响应速度与稳定性。
75 5
|
2月前
|
消息中间件 缓存 监控
优化微服务架构中的数据库访问:策略与实践
随着微服务架构的普及,如何高效管理和优化数据库访问成为了关键挑战。本文探讨了在微服务环境中优化数据库访问的策略,包括数据库分片、缓存机制、异步处理等技术手段。通过深入分析实际案例和最佳实践,本文旨在为开发者提供实际可行的解决方案,以提升系统性能和可扩展性。
|
3月前
|
安全 数据可视化 数据安全/隐私保护
【Azure 微服务】新创建的Service Fabric集群,如何从本地机器上连接到Service Fabric Explorer(Service Fabric状态/错误查看工具)呢?
【Azure 微服务】新创建的Service Fabric集群,如何从本地机器上连接到Service Fabric Explorer(Service Fabric状态/错误查看工具)呢?
【Azure 微服务】新创建的Service Fabric集群,如何从本地机器上连接到Service Fabric Explorer(Service Fabric状态/错误查看工具)呢?
下一篇
无影云桌面