微服务粒度难题:找到合适的微服务大小

序言

在微服务架构风格中,微服务通常设计遵循SRP(单一职责原则),作为一个独立部署的软件单元,专注于做一件事,并且做到极致。作为开发人员,我们常常倾向于在没有考虑为什么的情况下尽可能地将服务做得小。这种关于什么是和不是什么是单一职责的主观性是我们开发人员在服务粒度方面容易犯错误的地方。为了克服开发团队在微服务尺寸上面临的这种困境,理解粒度驱动因素至关重要。

粒度

在微服务中,我们有两个概念——模块化,涉及将系统分解成独立部分,另一个是粒度,处理这些独立部分的大小。

确定正确的粒度水平——服务的大小——是微服务架构中我们开发人员苦苦挣扎的众多难点之一。粒度不是由服务中的类的数量或代码行数来定义的,而是由服务的职责来定义的——因此,找到服务粒度的正确之道存在困惑。

服务的粒度分为两种对立的力量——粒度解耦器和粒度整合器。

粒度解耦器

什么时候我应该考虑将一个服务拆分成更小的部分?

粒度整合器

4e7a9f0f29100bb64a53ab2b89ba9cc9.png
1*MAAtLdlv1aOoeK8mj2qx3Q.png

什么时候我应该考虑将服务重新组合在一起?

粒度解耦器

由于我们生活在微服务和纳米服务的时代,大多数开发团队往往会错误地随意拆分服务,而忽略随之而来的后果。为了找到合适的大小,应对不同参数进行权衡分析,并在微服务的上下文和边界上做出明智的决策。

粒度解耦驱动因素提供了何时将服务拆分成更小部分的指导和依据。让我们看看这些驱动因素如何影响微服务的尺寸,以一个例子为例。

示例:考虑一个典型的通知服务,它执行三项操作:通过短信、电子邮件或邮寄信件通知客户。

42ba8ec21f9c0ec99a5bc63fda9d30e3.png
1*FlsStAZ7o0yJW31DkbWSOg.png

让我们在解耦驱动因素上分析这个场景,并找到合适的尺寸。我们从:

服务范围和功能

服务是否在做太多不相关的事情? 范围和功能主要取决于两个属性——第一个是内聚性,指的是特定服务操作之间的相互关系的程度和方式。第二个是组件的总体大小,通常以职责数量、服务的入口点数量或两者的综合来衡量。 场景:观察通知服务,有人可能会说将这个服务拆分成三个单独的单一职责服务。但这是正确的做法吗?答案是否定的!因为这个服务具有相对较强的内聚性,即所有这些功能都与一件事有关,即通知,并且具有一个单一的目的。所以,不需要拆分这个服务,它应该是一个服务执行三项操作。 接下来是:

代码波动性

df2f39421957a78b5a7d84807cc48d33.png
1*Gh7EjGVU9FtBG1ttkFP77g.png
9c94dd2223f13b78d7a38ae28d01429e.png
1*E8X9xfhIzlX9rWcGuHsK3Q.png

更改是否仅限于服务的一部分? 代码波动性是源代码更改的频率。我们必须衡量服务中代码更改的频率,以合理解释为什么要拆分服务。 场景:假设我们有以下服务功能的指标:

现在,如果我们依据更改的指标来看,邮寄信件通知部分的频繁更改也需要测试短信和电子邮件部分,从而作为单一服务,这增加了测试范围和部署风险。那么我们如何解决这个问题呢?

如果我们将这个服务拆分成两个单独的服务,电子通知和邮寄信件通知,那么频繁的更改现在被隔离在自己的服务中,从而减少了测试范围并降低了部署风险。

可扩展性和吞吐量

2b60145e21bc7f802d90be591d2214e7.png
1*E16W42_Zdffz3gBYCa1wkQ.png
25b9e80bb2de7ff9ae90c3650c1517a8.png
1*SpnfrWKzuci21UBtpsQRVQ.png

服务的部分是否需要不同的扩展能力? 不同服务功能的可扩展性需求可以客观地测量,以量化服务是否应拆分。 场景:再次考虑通知服务示例,测量单个服务的可扩展性需求如下:

在这种情况下,作为一个单一服务,电子邮件和邮寄信件功能必须不必要地扩展以满足短信通知的需求,从而影响成本和弹性(如MTTS,即平均启动时间)。这完全合理地解释了将通知服务拆分成独立的服务——短信、电子邮件和信件,因为这样可以让每个服务独立扩展以满足它们不同的吞吐量需求。

容错性

是否存在导致服务关键功能失败的错误? 应用程序在特定领域内继续运行的能力,即使发生了致命崩溃(如OOM)。 场景:考虑我们的通知服务场景,假设电子邮件功能继续出现OOM错误并致命崩溃,整个整合服务将会瘫痪,包括短信和邮寄信件处理。 将这个单一的整合通知服务拆分成三个独立的服务,为客户通知领域提供了一定的容错性。因此,电子邮件功能中的致命错误不会影响短信或邮寄信件。 进一步说明:现在,这里可能会出现一个问题,因为电子邮件功能频繁崩溃,为什么不将短信和邮寄信件功能合并?这是一个有效的问题。如果我们记得,当我们讨论代码波动性场景时,我们将邮寄信件与电子邮件和短信分开,并将它们合并成一个——电子通知。如果我们在那里能这样做,我们也可以在这里这样做。那么,为什么不呢? 因为电子邮件和短信是相关的,它们都是电子通知方式。但在这里,短信和邮寄通知没有任何共同之处可以将它们合并。换句话说,这里没有内聚性。

注意:记住,如果一个服务难以命名,因为它在做多个不相关的事情,那么考虑拆分服务。第二,每当拆分服务时,无论驱动因素是什么,总是检查是否可以与“剩余”功能形成强烈的内聚性。 所以,在这里将通知服务拆分成三个独立的服务是有意义的。 最后一个驱动因素是:

可扩展性

服务是否总是在扩展以添加新功能? 随着服务扩展,添加额外功能的能力。 场景:假设我们有新的功能要添加到通知服务——比如移动推送通知、桌面通知、社交媒体通知等。这些新功能当然可以添加到一个单一的整合通知服务中。然而,每次添加新通知时,整个通知服务都需要进行测试,并且所有通知功能都需要不必要地部署到生产环境中。

38a9851a0cecb4cfa75b7594bc5620f6.png
1*_BANDIxrGCZ7lc3ztjtigQ.png

注意:仅当事先知道计划和希望作为域的一部分的额外整合功能时,才应用此场景。

推荐实践

1.如果一个服务难以命名,因为它在做多个不相关的事情,那么考虑拆分服务。2.每当拆分服务时,无论驱动因素是什么,总是检查是否可以与“剩余”功能形成强烈的内聚性。3.根据业务能力而不是技术能力拆分服务。4.在设计微服务时使用单一职责原则(SRP),但要牢记强内聚性的全景。5.使用解耦驱动因素分析拆分服务的权衡。

5f861c537236ed68ab35cfdb4f738322.jpeg
1*wv6KRMwT65gNRbS4XBDvNA.jpeg

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

全面教程:在Ubuntu上快速部署ZeroTier,实现Windows与VSCode的局域网无缝访问

文章目录 1 背景介绍2 Windows上的操作3 Ubuntu上的操作4 连接 1 背景介绍 在现代工作环境中,远程访问公司内网的Ubuntu主机对于开发者来说是一项基本需求。然而,由于内网的限制,传统的远程控制软件如向日葵和todesk往往无法满足这一需求。作…

二叉树之遍历

二叉树之遍历 二叉树遍历遍历分类前序遍历流程描述代码实现 中序遍历流程描述代码实现 后序遍历流程描述代码实现 层次遍历流程描述代码实现 总结 二叉树遍历 遍历分类 遍历二叉树的思路有 4 种,分别是: 前序遍历二叉树,有递归和非递归两种…

用dify实现简单的Agent应用(AI信息检索)

这篇文章里,我们来聊聊如何使用字节最新的豆包大模型,在 Dify 上来快速完成一个具备理解需求、自主规划、自主选择工具使用的简单智能体(Agent)。 准备工作 完整准备过程分为:准备 Docker 环境、启动 Dify 程序、启动…

线性代数基础概念:矩阵

目录 线性代数基础概念:矩阵 1. 矩阵的定义 2. 矩阵的运算 3. 矩阵的特殊类型 4. 矩阵的秩 5. 矩阵的初等变换 6. 矩阵的特征值与特征向量 7. 矩阵的应用 8. 矩阵总结 总结 线性代数基础概念:矩阵 矩阵是线性代数中的另一个重要概念&#xff0…

vue目录说明

vue目录说明 主要目录说明 .vscode - - -vscode工具的配置文件夹 node_modules - - - vue项目的运行依赖文件夹 public - - -资源文件夹(浏览器图标) src- - -源码文件夹 .gitignore - - -git忽略文件 index.html - - -入口html文件 package.json - - -…

windows搭建mqtt服务器,并配置DTU收集传感器数据

1.下载并安装emqx服务器 参考:Windows系统下本地MQTT服务器搭建(保姆级教程)_mqtt windows-CSDN博客 这里我下载的是emqx-5.3.0-windows-amd64.zip版本 下载好之后,放到服务器的路径,我这里放的地方是:C…

图像信号处理器(ISP)基础算法及处理流程

💪 专业从事且热爱图像处理,图像处理专栏更新如下👇: 📝《图像去噪》 📝《超分辨率重建》 📝《语义分割》 📝《风格迁移》 📝《目标检测》 📝《暗光增强》 &a…

FreeRTOS之队列上锁和解锁(详解)

这篇文章将记录我学习实时操作系统FreeRTOS的队列上锁和解锁的知识,在此分享给大家,希望我的分享能给你带来不一样的收获! 目录 一、简介 二、队列上锁函数prvLockQueue() 1、函数初探 2、应用示例 三、队列解锁函…

转让北京文化传媒公司带营业性演出经纪许可证

影视文化传播倡导将健康的影视文化有效传播给观众,从而构建观众与电影制作者的良 性沟通与互动,是沟通电影制作者与电影受众的重要桥梁。影视文化泛指以电影,电视方式所进行的全部文化创造,即体现为电影,电视全部的存在…

找不到msvcp120.dll无法继续执行的原因分析及解决方法

在计算机使用中,经常会遇到msvcp120.dll文件丢失的情况,很多人对这个文件不是很熟悉,今天就来给大家讲解一下msvcp120.dll文件的丢失以及这个文件的重要性,让大家更好地了解计算机,同时也可以帮助我们更好地掌握这个文…

航模插头篇

一、常见的电池插头(电调端 是公头 电池端 是母头) 电池总是被插的 1.XT60头 过流大 安全系数高 难插拔 2.T插 插拔轻松 过流比较小 容易发烫 电调端 是公头 电池端 是母头 3.香蕉头插孔 过流够 插拔轻松 但 容易插反 爆炸 4.TX90(和XT60差…

2024 年 亚太赛 APMCM (A题)中文赛道国际大学生数学建模挑战赛 | 飞行器外形的优化 | 数学建模完整代码+建模过程全解全析

当大家面临着复杂的数学建模问题时,你是否曾经感到茫然无措?作为2022年美国大学生数学建模比赛的O奖得主,我为大家提供了一套优秀的解题思路,让你轻松应对各种难题! 完整内容可以在文章末尾领取! 第一个问…

C++内存管理(候捷)第一讲 笔记

内存分配的每一层面 applications可以调用STL,里面会有allocator进行内存分配;也可以使用C 基本工具primitives,比如new, new[], new(), ::operator new();还可以使用更底层的malloc和free分配和释放内存。最底层的是系统调用&…

明星代言6个提升企业形象的杀手锏-华媒舍

在当今竞争激烈的商业世界中,企业形象的塑造对于品牌的发展至关重要。而明星代言作为一种常见的营销手段,被广泛使用来提升企业形象和产品销售。本文将介绍明星代言的六个杀手锏,帮助您了解如何通过明星代言来提升企业形象。 1. 拥有广泛的影…

十二、【源码】Spring整合AOP

源码地址:https://github.com/spring-projects/spring-framework 仓库地址:https://gitcode.net/qq_42665745/spring/-/tree/12-spring-aop Spring整合AOP 核心类: DefaultAdvisorAutoProxyCreator:用于在Spring框架中自动为符…

若依多数据源原理分析

首先,想明白不同的接口想要使用不同的数据源。 那么自然想到了AOP,自定义注解。 通过自定义注解标注当前方法到底使用的是哪个数据源。 上面是前置条件。 看下若依是怎么处理的: 1.定义自定义注解,以及对应的多数据源的枚举类…

天润融通分析AI技术助力客户服务,实现满意度三倍增长

如今,客户体验越来越成为影响客户决策的核心要素。 对于企业来讲,客户在不同触点的每一次互动体验,都成为塑造品牌声誉的“Aha时刻”。但同时,随着社会的发展的加速,客户的需求也在日新月异,给企业带来挑战…

Codeforces Round 955 (Div. 2, with prizes from NEAR!)(A~C题解)

这场比赛怎么说呢,一开始打的还算好,能进前1000,但是后面就被卡住了,这个确实没办法水平还是不够,学过的还是没想起来,后面继续练 A. Soccer 题解:水题一个,想要在过程中出现平局的…

web零碎知识

&nbsp 在html文件中 连续的空格会被认为是一个空格 所以我们需要使用&nbsp来代表空格 &#x3000 把这个当成tab键来使用 我们可以引入js文件,就可以减少html文件的长度。 首先创建一个js文件夹,然后在js文件夹中创建一个,后缀…

【第17章】MyBatis-Plus自动维护DDL

文章目录 前言一、功能概述二、注意事项三、代码示例四、实战1. 准备2. ddl配置类3. 程序启动4. 效果(数据库) 总结 前言 在MyBatis-Plus的3.5.3版本中,引入了一项强大的功能:数据库DDL(数据定义语言)表结构的自动维护。这一功能…