当前位置: 首页 > 科技观察

除了“加机器”,其实你的微服务也可以这样优化_0

时间:2023-03-20 23:14:04 科技观察

在生产实践中,如果业务流量大导致服务负载增加甚至告警,我们的第一反应往往是“加机器”机”。俗话说,能用钱解决的问题就不是问题。俗话说,充钱才能变强。但是,作为一个有理想有抱负的架构师,除了“加机器”之外,其实你的微服务还可以优化得更优雅、更精细。本文预计阅读时间为10分钟,将从以下三个方面入手:从《AKF扩展立方体》,Y轴扩展的常见模式和Z轴扩展的思路与应用1.来自在上一篇《AKF扩展魔方》这篇文章中,我们从“服务维度”——微服务设计与治理,学习架构师的常用能力。围绕微服务生命周期的七个阶段,总结了16条常用的原则。其中原则15在微服务服务治理实践中非常重要。本文将重点进行拆解和分析。原则15:参照“AKFExpansionCube”模型,服务除了“横向扩展”,还可以考虑“功能拆分”或“数据分区”。所谓AKFScaleCube是一个模型概念,描述了从单一应用到分布式可扩展架构的转变。X轴:服务和数据的横向扩展。Y轴:功能/业务拆分Z轴:服务和数据沿客户边界划分“横向扩展”比较好理解,就是我们常用的操作——加机器。根据AKF模型,面对增加的服务负载,除了增加机器,我们还可以考虑“功能拆分”或“数据分区”。2、Y轴展开的常见方式“Y轴展开”比较复杂。我总结了几种模式:微服务拆分。根据特定的业务模型和领域模型拆分更细粒度的微服务。业务隔离和拆分。使用消息队列拆分和隔离消耗大量资源的在线业务(OLTP)和计算任务。核心和非核心隔离。对于一个微服务,SKA客户端可以和普通客户端隔离,SKA客户端使用独立的集群资源来提高稳定性。2.1微服务拆分某个微服务负载高的一个很常见的原因是微服务承担了太多的职责。这时候我们就需要根据具体的业务模型和领域模型来拆分更细粒度的微服务。也就是我们常说的“垂直拆分”。最典型的拆分方法是按照领域驱动设计(DDD)进行拆分。以电商领域为例,按照领域可以拆分为:用户服务、商品服务、订单服务、评价服务、其他系统。部署运行。这种隔离拆分的方式可以带来以下好处:提高整体系统的负载能力,每个微服务都具有独立的扩缩容、故障隔离等能力。2.2耗时任务的隔离拆分“Y轴扩展”除了按领域拆分服务,还有一个很重要的拆分方式是在在线业务(OLTP)类服务点上对“耗时任务”进行隔离拆分。我们的服务一般使用Tomcat或者Jetty来部署,同时采用同步调用的方式。以Jetty为例,默认线程池最大线程数为200,如果请求中有耗时任务影响同步请求的RT,当线程池满时请求会被阻塞。正如利特尔定律所言:在一个稳定的系统中(L),长期平均顾客数等于长期有效到达率(λ)乘以顾客在这个系统中的平均等待时间(W);或者,我们可以用一个代数表达式:因此,耗时的任务会显着增加服务负载,降低在线业务服务的吞吐量。通过引入消息队列或任务队列框架,我们可以将耗时的任务与在线业务服务隔离开来。这种隔离拆分的方式可以带来以下好处:提高在线服务的吞吐量,避免耗时任务影响在线服务的稳定性。2.3核心与非核心隔离拆分“Y轴展开”的第三种方式是拆分核心与非核心。例如,我们通常可能在一个服务内通过不同的线程池来隔离“核心接口”和“非核心”接口。但是无法在节点资源(cpu/内存/带宽等)上实现隔离。因此,我们可以更进一步,以集群分裂的形式进行隔离。通过服务路由的配置,核心接口路由到核心集群(一般节点配置较高),非核心接口路由到非核心集群。另外还有saas服务,一般都是为SKA客户做独立的集群,也是类似的逻辑。实际上,用户拆分和分离有点类似于“数据分区”,也可以归为“z轴扩展”。核心客户)核心业务独享资源,提高核心业务稳定性,避免非核心接口/用户影响核心接口/用户的稳定性根据独特需求,对系统进行划分,划分后的子系统相互隔离但又完整.在生产实践中,常用的z轴扩展有两种应用:单元化架构数据分区3.1单元化架构单元化架构主要关注应用部署和调用层面的问题。一个单元是一个按比例缩小的全站,拥有所有的内部机构,它部署了所有的微服务。但它不是真正的全站仪,因为每个单元只能操作一部分数据。从这里我们也可以看出,单元化架构需要一个系统必须具备的能力——数据分区。当然,仅仅对数据进行分区是不够的。单元化的另一个必要条件是全站所有业务数据分区使用的拆分维度和拆分规则必须相同。一般来说,我们的大部分系统都是面向用户的,按照用户维度来划分数据是一个最佳实践。当然,如果是全球部署的单元化架构,还需要考虑区域划分。3.2数据分区数据分区(shard)是将全局数据按照一定的维度进行横向划分,每个分区的数据内容互不重叠。这就是数据库“水平拆分”的作用。前面说过,“数据分区”是“单元化”的必要条件,但是“数据分区”还有很多其他的应用场景。最典型的就是MySQL单机瓶颈之后,需要进行“分库分表”。服务中需要引入一些支持数据拆分和路由的中间件,如sharding-jdbc、mycat等,并需要在数据层面配置相应的分片逻辑。此外,其他数据库(如redis集群、mongo集群等)的分区扩容也是一个非常典型的应用场景。一般包括以下数据划分方式:数据类型(如:业务类型)、数据范围(如:时间段、用户ID)、数据热度(如:用户活跃度、商品热度)、阅读量写作要点(如:商品描述、商品库存)4.总结本文从《AKF扩展魔方》入手,介绍几种提高服务承载能力的服务治理方式。除了X轴扩展(加机)、Y轴扩展(功能/业务拆分)、Z轴扩展(数据分区)等方式,可以更优雅、更精细地优化。