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

序言

在微服务架构风格中,微服务通常设计遵循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

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

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

相关文章

头歌资源库(20)最大最小数

一、 问题描述 二、算法思想 使用分治法,可以将数组递归地分割成两部分,直到数组长度为1或2。然后比较这两部分的最大、次大、次小、最小数,最终得到整个数组中的最大两个数和最小两个数。 算法步骤如下: 定义一个函数 findMinM…

Java - 程序员面试笔记记录 实现 - Part3

4.1 线程与进程 线程是程序执行的最小单元,一个进程可以拥有多个线程,各个线程之间共享程序的内存空间以及一些进程级资源,但拥有自己的栈空间。 4.3 Java 多线程 方法一:继承 Thread 类,重写 run 方法;…

二分法查找有序表的通用算法(可查链表,数组,字符串...等等)

find_binary函数 注意事项: (1)你设计的迭代器模板中必须有using value_type T,且有加减运算功能,其本上能与C标准库std中一样。 (2)集合必须是有序的。 下面是函数代码: /// &…

一次建表语句触发的ORA-600报错分析

​ 某次在客户Oracle数据库执行一条建表语句时,报出ORA-600错误。 报错代码如下: ORA-00600: 内部错误代码, 参数: [rwoirw: check ret val], [], [], [], [], [], [], [], [], [], [], [] 相关的建表语句如下: ​ 在报错发生后,…

Android studio开发入门教程详解(复习)

引言 本文为个人总结Android基础知识复习笔记。如有不妥之处,敬请指正。后续将持续更新更多知识点。 文章目录 引言UITextView文本基本用法实际应用常用属性和方法 Button按钮处理点击事件 EditText输入框基本属性高级特性 ImageView图片ImageView的缩放模式 Prog…

Qt中udp指令,大小端,帧头帧尾实际示例

前言 虽然QT中,udp发送和接收,其实非常简单,但是实际工作中,其实涉及到帧头帧尾,字节对齐,以及大小端序的问题。比如网络中,正规的一般都是大端序,而不是小端序,大多数的…

不到 5 元的随身 WiFi 刷 Debian 系统 做轻量家庭服务器

本文首发于只抄博客,欢迎点击原文链接了解更多内容。 前言 前不久在某宝均价 5 元买了两个随身 WiFi,拆机看了看丝印都是 MSM8916 ,正好是红米 2 同款的骁龙 410 的芯片,可以刷个 Debian 当作家庭服务器来跑一些轻量的服务。 不过手气不是很好,两个都是 512M + 4G 的配置…

单机安装基于LNMP结构的WordPress网站 web与数据库服务分离

网站的类型: Jave:LNMT PHP:LNMP Python: LNMU 项目部署: 1.项目的类型(项目的开发语言) 2.项目运营平台的技术选择 3.尽快让项目运行起来 all in one部署 4. 架构的优化 配置ansible管理环境 配置nginx 配置数据库服务…

day11_homework_need2submit

Homework 编写—个将ts或mp4中视频文件解码到yuv的程序 yuv数据可以使用如下命令播放: ffplay -i output yuv-pix_fmt yuv420p-s 1024x436 要求: ffmpeg解析到avpacket并打印出pts和dts字段完成解码到avframe并打印任意字段完成yuv数据保存 // teminal orders on bash cd ex…

11.SQL注入-盲注基于(base on boolian)

SQL注入-盲注基于boolian案例利用 首先总结一下sql语句中的函数意思 #查看当前所在的数据库 mysql> select database(); ------------ | database() | ------------ | pikachu | ------------ 1 row in set (0.00 sec)#函数substr里1是从第几位开始取字符,2…

油猴Safari浏览器插件:Tampermonkey for Mac 下载

Tampermonkey 是一个强大的浏览器扩展,用于运行用户脚本,这些脚本可以自定义和增强网页的功能。它允许用户在网页上执行各种自动化任务,比如自动填写表单、移除广告、改变页面布局等。适用浏览器: Tampermonkey 适用于多数主流浏览…

Java的进程和线程

一Java的进程 二Java的线程 多线程 ◆如果在一个进程中同时运行了多个线程,用来完成不同的工作,则称之为“多线程”。 ◆多个线程交替占用CPU资源,而非真正的并行执行。 ◆多线程好处。 ◆充分利用CPU的资源。 ◆简化编程模型。 ◆良好的用…

3-1 激活函数和神经网络思想

3-1 激活函数和神经网络思想 主目录点这里

【抽代复习笔记】26-群(二十):子群的定义以及第一、第二判定定理

子群 定义1:(G,o)是一个群,H是G的非空子集,若H关于G的乘法o也能作成群(满足群的判定定理:封闭性、结合律、单位元、逆元),则称H为G的子群,记作H ≤ G;若H是G的真子集&am…

【启明智显分享】手持遥控器HMI解决方案:2.8寸触摸串口屏助力实现智能化

现代生活不少家居不断智能化,但是遥控器却并没有随之升级。在遥控交互上,传统遥控器明显功能不足:特别是大屏智能电视,其功能主要由各种APP程序实现。在电脑上鼠标轻轻点击、在手机上触摸屏丝滑滑动,但是在电视上这些A…

SpringBoot 启动流程二

SpringBoot启动流程二 我们首先查看构造方法 SpringApplication 我们发现这个构造方法还是在SpringApplication类里面 这个构造方法还是调用了自身的构造方法 传入了两个参数 第一个参数叫resourceLoader 传入的是一个资源加载器 要从外部读入东西 这个方法通过this关键字…

c++纵横字谜

1.实现一个纵横字谜 2.支持14x14的网格 3.可以查看答案 4.猜测错误会提示答案信息 5.从txt读取词汇 6.每次游戏开始 随机生成纵横字谜 n’h

leetcode216.组合总和III、40.组合总和II、39.组合总和

216.组合总和III 找出所有相加之和为 n 的 k 个数的组合,且满足下列条件: 只使用数字1到9 每个数字 最多使用一次 返回 所有可能的有效组合的列表 。该列表不能包含相同的组合两次,组合可以以任何顺序返回。 示例 1: 输入: k 3, n 7 输出…

deepin UOS AI 如何配置自定义模型

科技飞速发展的今天,操作系统作为计算机系统的灵魂,其每一次的更新与变革都牵动着无数用户的心弦。近日,开源操作系统 deepin 迎来了一次重大更新,这次更新不仅在性能上进行了全面优化,更在 AI 智能化方面迈出了划时代…

【解决方案】笔记本电脑屏幕亮度调节失效(Dell G15 5510 使用Fn调节)

目前解决方案:使用驱动总裁(其他的驱动安装软件应该也可以,个人觉得这个好用),更新显卡驱动即可。如图所示本人更新了Intel UHD Graphics核显驱动,功能回复正常。 使用Fn快捷键调节亮度如图所示&#xff0…