单体架构、微服务和无服务器架构

前言

在这篇文章中,我将演示在决定使用单体架构、微服务架构和无服务器架构时的权衡的简化心智模型。目标是突显每种风格的固有优势和缺陷,并提供关于何时选择哪种架构风格的指导。

单体架构

对于小团队或项目来说是理想的入门架构。它简单易上手,通常在需要超过一个团队的规模之前能够提供很多收益。

在构建单体架构时,务必从模块化开始,即使可能会增加样板代码。这意味着构建组件并在层之间保持严格的逻辑分离(更多详见Clean Architecture)。

  • 通信层 — 服务的外部接口
  • 封装 — 业务逻辑或用例的清晰接口
  • 领域实体 — 业务对象的数据表示,仅供内部使用
  • 架构隔离 — 避免实体之间的跨领域连接
优势

•开发便利性 — 所有代码都在一起。•部署便利性 — 所有代码一起部署。•网络效率 — 所有计算发生在进程内。•成本共享效率 — 每台服务器上有大型共享的 CPU 和内存池。

权衡

  • 组织规模的限制 — 由于开发、部署和代码的紧密耦合,需要协调的开销增加。
  • 技术债务的风险 — 容易采取捷径,构建紧密耦合的代码。

当您的团队看起来像上面的插图时,这表明您应该考虑演进您的架构到微服务。开发中的复杂性增加会高风险地降低质量,从而导致生产力减缓。这产生了一个矛盾的效果,即您雇佣的人越多,交付就变得越慢和不可预测。

微服务

对于业务需求开始增长并且团队分成多个团队时,这是理想的架构。这个里程碑自然地与将单体架构拆分成自然的、上下文边界的微服务相配合,以便团队可以更独立地扩展。

设计你想要的组织,架构会追随着,踌躇着走来

我强烈建议采用Inverse Conway Maneuver策略,打破您的通信模式,否则促使单体的熟悉模式将继续像胶水一样将团队粘在一起。

优势

  • 独立交付 — 减少依赖关系。
  • 明确所有权 — 实现强大的所有权模型。
  • 组织规模 — 促进团队间相对独立的并行努力。
  • 独立扩展 — 计算隔离允许平台的各部分独立扩展。
权衡

  • 协调标准 — 标准的变化可能泄漏到架构中,降低一致性和整体可维护性。
  • 网络延迟惩罚 — 曾经在单个服务中共同存在的进程现在正在进行引入端到端计算的网络调用,引入了延迟。
  • 资源共享减少 — 曾经共享相同 CPU、内存和磁盘需求的进程现在部署有自己的专用资源。
  • 成本增加 — 与单体相比,每个服务的额外网络 I/O 和资源会导致额外的成本。

无服务器

对于不需要实时保证的某些工作负载来说,这是理想

的架构风格。异步、分布式处理,不要求代码始终保持热和立即可用。

截至撰写本文时,该行业正在朝着编写更经济的系统的“绿色”方向发展,以减少我们计算的碳足迹。我认为这种架构风格是生态系统的一个强大补充,但并不能完全取代它的前辈的必要性。

优势

  • 精益扩展 — 仅扩展所需的无服务器函数。
  • 成本效益 — 仅在需要时使用最少的资源部署资源。(警告:仅当计算是间歇性的时候。在计算需要保持热时,请查看下面的权衡。
权衡

  • 资源效率惩罚 — 曾经共享相同 CPU、内存和磁盘需求的进程现在每个都有自己的最小要求。
  • 成本效益差 — 只有在部署时有恒定需求,使每个函数运行像热服务器时。
  • 网络惩罚 — 与单体和微服务相比,每个函数调用现在都是一个网络跳跃,而不是作为进程内计算共同存在。

随着时间的推移演进

那么,当您的业务或产品的需求不断增长时,您的架构演进可能是什么样子呢?

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

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

相关文章

C++---string类

一.string类&#x1f357; C支持C风格的字符串&#xff0c;另外还提供了一种 字符串数据类型&#xff1a; string是定义在头文件string中的类&#xff0c;使用前需要包含头文件string。 #include<string> C语言中的字符串需要引用头文件#include<string.h> #includ…

Helm Dashboard — Kubernetes 中管理 Helm 版本的 GUI

Helm Dashboard 通过提供图形用户界面&#xff0c;使在 Kubernetes 中管理 Helm 版本变得更加容易&#xff0c;这是许多开发人员所期望的。它可用于在 Kubernetes 中创建、部署和更新应用程序的版本&#xff0c;并跟踪其状态。 本文将探讨 Helm Dashboard 提供的特性和优势&am…

基于Spring+mybatis+vue的饮食分享系统(Java毕业设计)

大家好&#xff0c;我是DeBug&#xff0c;很高兴你能来阅读&#xff01;作为一名热爱编程的程序员&#xff0c;我希望通过这些教学笔记与大家分享我的编程经验和知识。在这里&#xff0c;我将会结合实际项目经验&#xff0c;分享编程技巧、最佳实践以及解决问题的方法。无论你是…

Flutter首页框架搭建

1.下载flutter 2. 安装android 3.配置环境变量 关于环境搭建部分&#xff0c;哪天写一下&#xff0c;日志杂乱无章。 打开android studio 新建项目&#xff0c;选择flutter 新建文件夹创建 navigator和pages 文件夹下分别创建文件&#xff0c;tab_navigator.dart&#xff…

《PCI Express体系结构导读》随记 —— 第I篇 第2章 PCI总线的桥与配置(19)

接前一篇文章&#xff1a;《PCI Express体系结构导读》随记 —— 第I篇 第2章 PCI总线的桥与配置&#xff08;18&#xff09; 2.4 PCI总线的配置 PCI总线定义了两类配置请求&#xff0c;一个是Type 00h配置请求&#xff0c;另一个是Type 01h配置请求。PCI总线使用这些配置请求…

c# 视频播放之Vlc.DotNet.Forms

先说下优缺点 优点&#xff1a;与电脑无关&#xff0c;能播放主流编码格式视频。 缺点&#xff1a;只能播放本地视频&#xff0c;网络视频播放不了。 下面是具体操作和代码 1. 安装Vlc.DotNet.Forms 和 VideoLAN.LibVLC.Windows Vlc.DotNet.Forms 是播放库&#xff0c;Vid…

找不到mfc100.dll的解决方法,怎么修复mfc100.dll文件

当我们在使用电脑时&#xff0c;时常可能会遇到各类系统提示的错误信息。"找不到mfc100.dll" 就是这些错误之一&#xff0c;该错误提示会妨碍我们执行一些应用程序或特定代码。为了帮助读者克服这个技术障碍&#xff0c;本篇文章将详尽阐明导致该问题的根本原因&…

Flink(十三)【Flink SQL(上)SqlClient、DDL、查询】

前言 最近在假期实训&#xff0c;但是实在水的不行&#xff0c;三天要学完SSM&#xff0c;实在一言难尽&#xff0c;浪费那时间干什么呢。SSM 之前学了一半&#xff0c;等后面忙完了&#xff0c;再去好好重学一遍&#xff0c;毕竟这玩意真是面试必会的东西。 今天开始学习 Flin…

Pandas.Series.count() 非空单元格计数 详解 含代码 含测试数据集 随Pandas版本持续更新

关于Pandas版本&#xff1a; 本文基于 pandas2.1.2 编写。 关于本文内容更新&#xff1a; 随着pandas的stable版本更迭&#xff0c;本文持续更新&#xff0c;不断完善补充。 Pandas稳定版更新及变动内容整合专题&#xff1a; Pandas稳定版更新及变动迭持续更新。 Pandas API参…

对象数组变成一维数组,导出txt文件

假设对象数组格式为此 arr1: [{id: 1,title: 我是1目录,children: [{id: 11,title: 我是1-1目录,children: [{id: 111,title: 我是1-1-1目录,children: [],},],},],},{id: 2,title: 我是2目录,children: [{id: 21,title: 我是2-1目录,children: [],},],},], 页面如下 先在页面…

WEB接口测试之Jmeter接口测试自动化 (三)(数据驱动测试)

接口测试与数据驱动 1简介 数据驱动测试&#xff0c;即是分离测试逻辑与测试数据&#xff0c;通过如excel表格的形式来保存测试数据&#xff0c;用测试脚本读取并执行测试的过程。 2 数据驱动与jmeter接口测试 我们已经简单介绍了接口测试参数录入及测试执行的过程&#xff0…

HNU-计算机网络-实验5(自选)-安全相关编程实验

计算机网络 课程综合实验安全相关编程实验&#xff08;RUST&#xff09; 计科210X 甘晴void 202108010XXX 【前言】 这个《课程综合实验》是21级开始新加的实验&#xff0c;之前都没有。具体的可以看实验指导书&#xff0c;是用的19级同学的毕设。我完成的这个实验需要一点点R…