现代分布式系统架构的权衡分析

news/2024/4/21 14:10:07/文章来源:https://blog.csdn.net/weixin_37604985/article/details/136495585

介绍

现代软件系统,特别是遵循分布式架构的系统,以其复杂性和可变性而闻名。这些系统由许多元素组成,每个元素都引入潜在的权衡,可能影响成本、性能、可伸缩性和可靠性等因素。对于导航软件现代化和转型领域的IT架构师、业务分析师、数据架构师、软件工程师和数据工程师来说,理解这些权衡至关重要。本文旨在阐明在分布式架构中进行权衡分析的过程和重要性,提供有关与这一复杂但不可或缺的实践相关的方法、技术、工具和竞争方法的见解。

软件架构传统上是一个决策和权衡的领域。在一个以精确和创新为生的领域中,每个选择都会产生后果。理解这些后果已经变得至关重要,因为我们正在迎来技术飞速发展的时代,在这个时代,每个决策既是一个机会,也是一个挑战。

在科技风景的动态画卷中,有一个有趣的演变故事:从过去的单体巨兽到今天的灵活的分布式系统。当我们站在这个前所未有的灵活性和不断增长的复杂性的交汇点时,一件事变得非常明确 — 决策很重要。而做出这些决策呢?嗯,这是一种艺术、科学和一点点占卜的融合。

1. 了解现代分布式系统景观

进化飞跃: 曾经整个应用程序都驻留在单个服务器或集群上的日子已经过去。微服务的兴起,容器化(比如Docker),云计算巨头如AWS、Azure和GCP,甚至边缘计算的前沿,都从根本上重新定义了软件架构。这些创新解放了应用程序,赋予了它们无与伦比的可伸缩性和韧性。•双刃剑: 分布式系统尽管有着诸多优点,却也带来了复杂的挑战。微服务的自治性,例如,也引入了潜在的同步、延迟和通信障碍。

2. 现代权衡分析的需求

历史背景: 仅仅十年或二十年前,单体架构是标准。那是一个简单的时代,面临的挑战也很直接。然而,数字革命引入了许多新的架构模式。从微服务到无服务器计算,这些模式提供了前所未有的灵活性和健壮性,重新定义了软件可以实现的边界。•复杂性和机会: 随着技术的发展,与之相关的复杂性也在增加。现在,架构师必须考虑云原生方法、Kubernetes等容器编排工具,以及持续集成和部署的复杂性。然而,随着这些挑战的出现,创新和优化的机会也随之而来,使架构师的角色变得比以往任何时候都更加关键。

b30101f128099f670eba28605a5cc38c.png
1*1_A_KonLQdz-LiZmdYsiww.png

现代权衡分析的需求

3. 辨识现代软件系统中的权衡

在现代软件可能性的辽阔领域中航行,类似于穿越一个机遇和陷阱的海洋。正如蜘蛛侠的本·帕克叔叔明智地说过的那样,“拥有强大的力量就意味着拥有巨大的责任。” 分布式系统提供了可伸缩性、韧性和灵活性。然而,它们也引入了数据一致性、系统编排、容错等方面的挑战。在这个领域做出的决策具有深远的影响。

a. 架构风格:

1.微服务: 它们提供了模块化、可伸缩和独立部署应用程序部分的能力。然而,它们也引入了与服务发现、服务间通信和数据一致性相关的挑战。2.无服务器: 通过消除基础设施管理的负担并提供按需可伸缩性,无服务器架构承诺成本效益。然而,由于启动时间较长和潜在的供应商锁定,它可能不适用于具有特定性能要求的应用程序。3.事件驱动架构: 倾向于异步通信,增强可伸缩性,但需要强大的机制来确保数据一致性。4.云原生: 旨在充分利用云计算的好处,云原生架构强调可伸缩性、韧性和灵

活性。它通常使用容器化、微服务和持续交付实践。尽管它提供了快速的可伸缩性和适应性,但在编排、服务网格管理和多云部署方面可能出现复杂性。

1.分层(或N层)架构: 将系统划分为不同层次,例如表示、业务逻辑和数据访问层。每一层都有特定的责任,只与其相邻的层进行交互。2.响应式架构: 构建响应式、具有弹性和消息驱动的系统。它设计用于处理现代应用程序的异步性质。3.六边形(或端口和适配器): 通过将应用程序划分为内部和外部部分,侧重于关注点的分离。这允许应用程序与外部技术和工具隔离。

b. 数据库类型: 数据是现代应用程序的生命线。

1.关系数据库: 以其结构化的模式和强大的ACID保证而闻名,在需要复杂连接和事务的情况下表现出色。然而,它们的权衡可能包括潜在的可伸缩性问题。2.NoSQL: 设计用于灵活性、可伸缩性和高性能。然而,一致性有时可能是一个挑战,特别是在将可用性置于严格一致性之上的数据库中。3.矢量数据库: 适用于高性能分析,但可能引入数据处理的复杂性。4.图数据库: 适用于互联数据探索,但对于非图操作可能不够高效。5.时间序列数据库: 优化处理时间戳数据,特别适用于监控、金融和物联网应用程序。它们的权衡可能包括对非时间序列操作的有限功能。6.内存数据库: 将数据存储在计算机的主内存(RAM)中,以实现更快的响应时间。它们用于速度至关重要的应用程序。7.面向对象数据库: 以面向对象编程中使用的对象形式存储数据。8.分布式数据库: 将数据分布在多个服务器上,可以在单个位置或多个位置扩展。9.分层数据库: 将数据组织成树状结构,其中每个记录都有一个单一的父节点。10.网络数据库: 与分层数据库类似,但允许每个记录具有多个父节点。11.多模式数据库: 支持多种数据模型,可以存储不同类型的数据。

c. 集成平台模式:

随着系统的增长,其组件之间的有效通信变得至关重要。

1.点对点: 直接的点对点集成可能导致紧密耦合并阻碍系统的可扩展性。消息代理解耦了服务通信,提供了消息队列和负载分布,但引入了另一层复杂性,可能成为单点故障。采用异步处理的事件驱动架构具有可伸缩性和实时响应的优势,但要求强大的机制来确保数据一致性和顺序。2.API网关: API网关充当客户端和服务之间的桥梁,提供统一的访问点、集中的身份验证等功能。需要考虑的权衡包括由于额外的网络跳跃而导致的增加的延迟、如果没有适当缩放可能产生的潜在瓶颈,以及管理另一个组件的复杂性。然而,它简化了客户端交互,提供了集中的日志记录和分析,并可以抽象底层服务的复杂性。3.消息代理: 解耦服务通信,提供消息队列和负载分布。然而,它们可能引入另一层复杂性并成为单点故障。4.发布/订阅(Pub/Sub): 允许服务发布事件/消息,而其他服务订阅它们。这解耦了服务并提供了可伸缩性,但管理消息顺序和确保传递可能是个挑战。5.请求/回复: 一种同步模式,其中一个服务发送请求并等待回复。这可能引入延迟,特别是如果响应服务需要时间来处理。6.事件溯源: 将状态更改捕获为事件,允许系统通过重播事件来重建状态。对于需要审计跟踪的系统非常有用。7.数据集成(ETL): 用于在系统之间移动数据的流程,通常是从操作系统到数据仓库。8.批量集成: 数据以批量而不是单独的方式在系统之间传递。对于大量数据来说是高效的,但可能引入等待下一批次的延迟。9.编排: 一个中央服务(编排器)负责管理服务之间的交互,确保它们按特定顺序执行。10.流式处理: 数据的连续流,按记录或在滑动时间窗口上逐步处理。

d. 可观测性:

1.度量: 关于进程的定量数据,通常用于系统健康检查。2.追踪: 跟踪请求在组件之间传播的过程。3.日志: 软件组件生成的详细记录,对调试至关重要。4.事件: 系统内的显着发生,值得注意。事件可以是从用户操作到系统警报的任何内容。5.用户体验监控: 观察和了解最终用户如何与系统交互,关注性能和可用性。6.网络性能监控: 监控和分析网络流量和指标,以评估网络的性能和健康状况。7.合成监控: 模拟用户与系统的交互,以测试性能和可用性。8.实时用户监控(RUM): 捕获和分析用户实时交互,以了解实际用户体验。9.容器和编排监控: 监控容器化应用程序和Kubernetes等编排平台的健康和性能。

e. DevSecOps:

1.自动化安全: 使用工具自动执行安全检查和扫描。包括静态应用程序安全测试(SAST)、动态应用程序安全测试(DAST)和依赖扫描。2.持续监控: 确保实时监控应用程序以检测和响应威胁。这包括监控系统日志、用户活动和网络流量以发现任何可疑活动。3.CI/CD自动化: 持续集成和持续部署(CI/CD)管道确保代码更改在部署之前自动进行测试、构建和部署。在这些流水线中集成安全检查可以确保在部署之前检测到并解决漏洞。4.基础设施即代码(IaC): 使用代码和自动化管理和配置基础设施。像Terraform和Ansible这样的工具可以用于此,确保在这些脚本中遵循安全最佳实践。5.容器安全: 随着容器化变得更为普遍,确保容器映像和运行时的安全性至关重要。这包括扫描容器映像以查找漏洞,并确保运行时安全。6.秘密管理: 确保像API密钥、密码和证书等敏感数据得到安全存储和管理。像HashiCorp Vault这样的工具可以帮助安全地管理和访问秘密。7.威胁建模: 定期评估并建模对应用程序的潜在威胁。这种主动方法有助于了解潜在的攻击向量并加以缓解。8.质量保证(QA)集成: 在整个开发周期中嵌入质量检查和测试,而不仅仅是在开发后阶段。9.协作和沟通: 促进开发、运维和安全团队之间的有效沟通和协作。10.配置管理: 通过控制对软件的更改来管理和保持产品性能的一致性。11.持续改进: 实施机制以从所有利益相关方那里收集反馈,并持续改进流程和工具。12.漏洞管理: 不仅仅是扫描,还包括系统性地管理、优先排序和修复发现的漏洞。

f. 通信协议:

1.HTTP/REST: 一种广泛采用的协议,以其简单性和状态无关性而闻名,通常用于Web服务和API。2.gRPC: 一种高性能、开源的RPC框架,使用Protocol Buffers并支持双向流等特性,使其对于微服务通信非常高效。3.GraphQL: 一种用于API的查询语言,允许客户端精确请求所需内容,减少了REST中常见的过度获取和不足获取问题。4.WebSocket: 一种提供全双工通信通道的协议,非常适用于实时Web应用程序。5.SOAP(Simple Object Access Protocol): 一种用于在Web服务中交换结构化信息的协议,使用XML,以其稳健性和可扩展性而闻名。6.MQTT(Message Queuing Telemetry Transport): 一种轻量级的消息协议,设计用于低带宽、高延迟或不可靠网络,通常在物联网场景中使用。7.AMQP(Advanced Message Queuing Protocol): 一种面向消息的中间件协议,专注于消息排队、路由和可靠性,适用于企业级消息传递。8.Thrift(Apache Thrift): 用于可伸缩的跨语言服务开发的软件框架,结合了软件堆栈和用于高效的多语言服务部署的代码生成引擎。9.CoAP(Constrained Application Protocol): 用于物联网中受限节点和网络的Web传输协议,类似于HTTP但更适用于低功率设备。10.ZeroMQ: 高性能异步消息库,提供消息队列但无需专用消息代理,用于分布式或并发应用程序。11.SignalR: ASP.NET的库,简化向应用程序添加实时Web功能的过程,非常适合Web应用程序中的实时通信。

b1e3f27fa25ff891e5ff0a09cf472000.png
1*ku-j4Pf4BAORg98NMo5d9A.png

g. 安全性:

1.身份验证: 确认用户或系统的身份。2.授权: 确保用户或系统只能访问其有权访问的资源。3.加密: 通过使用算法将数据转换为不可读的格式,以保护数据的机密性。4.漏洞管理: 持续监测、识别和解决系统中的漏洞,以减小潜在的攻击面。5.审计和合规性: 记录系统中的活动,以及确保系统遵循相关法规和标准。6.网络安全: 确保网络的安全性,包括防火墙、入侵检测系统(IDS)等。7.终端安全: 保护终端设备免受威胁,包括恶意软件、病毒和网络攻击。8.应急响应: 开发计划以应对安全事件,包括对潜在威胁的快速响应。9.容器安全: 确保容器映像和运行时的安全性,包括扫描容器映像以查找漏洞,限制容器权限等。10.API安全: 保护API免受滥用和攻击,包括使用API密钥、OAuth等安全措施。11.开发人员培训: 向开发人员提供安全培训,以确保他们了解并遵循安全最佳实践。12.业务连续性和灾难恢复: 制定计划以确保在安全事件发生时能够迅速有效地恢复业务运营。13.漏洞披露和响应: 为外部研究人员提供漏洞披露通道,并建立响应机制以及漏洞修复的过程。14.合作伙伴和供应链安全: 确保与合作伙伴和供应链的交互是安全的,防止攻击者通过这些渠道进入系统。

4. 权衡分析的方法

a. 成本与性能:

选择云服务: 在成本和性能之间进行权衡的一个关键方面是选择云服务。一些提供商可能在某些方面更具成本效益,而在其他方面则提供更好的性能。进行基于工作负载需求的综合评估,以选择最适合的云服务提供商。•弹性伸缩: 使用弹性伸缩来调整资源,以适应变化的工作负载。这可以在低峰时期减少成本,而在高峰时期提供足够的性能。•成本优化工具: 利用云提供商的成本优化工具和服务,以分析和优化资源使用,确保在提供足够性能的同时最小化成本。

b. 可靠性与可伸缩性:

多区域部署: 在多个区域部署应用程序以提高可用性。这可能会增加一些复杂性和成本,但可以显著提高系统的可靠性。•负载均衡: 使用负载均衡来分发流量,确保没有单个点成为系统的瓶颈。这有助于提高可伸缩性和可用性。•自动化运维: 利用自动化运维工具,确保系统的自愈能力。自动化可以降低系统故障的影响,提高可靠性。

c. 一致性与性能:

分布式事务: 在需要一致性的场景中使用分布式事务。这可能对性能产生一些影响,但确保了数据的一致性。•分片: 将数据分片以提高性能。然而,这可能会导致在跨分片的事务中更难维护一致性。•缓存: 使用缓存来加速读取操作,但要注意缓存可能导致一致性的问题。采用合适的缓存策略,如缓存失效策略或写入时更新缓存,以维护一致性。

d. 管理复杂性:

微服务通信: 在微服务架构中,微服务之间的通信可能是复杂性的一个关键来源。选择合适的通信模式,如HTTP/REST、gRPC等,并使用适当的工具来简化通信。•集成平台选择: 选择合适的集成平台模式,如API网关、消息代理等,以管理服务之间的通信。这有助于减轻通信复杂性。•监控和观察: 使用适当的监控和观察工具来了解系统的运行状况。这有助于快速诊断和解决问题,减轻管理复杂性。

e. 安全性与灵活性:

零信任安全模型: 采用零信任安全模型,即不信任系统内部和外部的任何实体。这有助于提高系统的安全性,但可能增加一些管理和配置的复杂性。•角色基础访问控制(RBAC): 使用RBAC来管理对系统资源的

访问。这有助于提高安全性,但需要灵活的配置和管理。

f. 开发速度与质量:

敏捷开发实践: 采用敏捷开发实践,如Scrum或Kanban,以提高开发速度。然而,确保在快速开发的同时不牺牲代码质量。•自动化测试: 利用自动化测试以确保代码质量。这有助于加速开发过程,但需要一些额外的时间来编写和维护测试套件。•代码审查: 实施代码审查以确保高质量的代码。这可能增加开发时间,但提高了代码的可维护性和质量。

g. 用户体验与性能:

前端优化: 通过前端优化措施,如缓存、资源合并、异步加载等,提高用户体验。然而,这可能会增加一些开发和维护的复杂性。•全球内容分发网络(CDN): 使用CDN以提高全球用户的访问性能。这可以显著减少加载时间,但需要管理CDN配置和成本。

h. 灵活性与稳定性:

特性切分: 将系统切分为小的功能单元,以提高灵活性。但要注意,这可能增加系统的复杂性,因为需要管理多个功能单元。•特性开关: 使用特性开关以便在运行时启用或禁用特定功能。这有助于在不影响整个系统的情况下进行特性切换,但需要额外的配置。

结论

权衡分析在设计和管理复杂系统时至关重要。团队需要认真考虑不同方面之间的权衡,以便在各种需求和约束下做出明智的决策。这可能涉及技术选择、架构决策、流程设计等多个方面。在整个开发和运维周期中,持续的监控和反馈机制对于适应变化和不断优化系统也非常关键。最终,权衡不仅是一次性的决策,更是系统演进过程中的不断迭代和调整。

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

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

相关文章

MyBatis3源码深度解析(四)Statement

文章目录 前言2.4 Statement2.4.1 java.sql.Statement2.4.1.1 创建Statement对象2.4.1.2 执行查询SQL语句2.4.1.3 执行更新SQL语句2.4.1.4 执行不确定类型的SQL语句2.4.1.5 批量执行SQL语句 2.4.2 java.sql.PreparedStatement2.4.2.1 创建PreparedStatement对象2.4.2.2 占位符的…

centos7中python3.10找不到openssl解决方案

如果有用其他方法安装了其他版本openssl,记得卸载其他的openssl,删除其他的openssl相关文件。 yum remove openssl* rm -rf ***下载最新版的openssl文件 按照官网安装方法安装openssl 官方安装地址https://docs.python.org/3/using/unix.html#on-linu…

鸿蒙Harmony应用开发—ArkTS声明式开发(基础手势:RotationGesture)

用于触发旋转手势事件,触发旋转手势的最少手指为2指,最大为5指,最小改变度数为1度。 说明: 从API Version 7开始支持。后续版本如有新增内容,则采用上角标单独标记该内容的起始版本。 接口 RotationGesture(value?: …

SQL Server基础指令(创建与检索)

数据库demo 数据库RUNOOB 表Websites 元素: 创建 创建数据库 create database xxx Create database school 创建数据表 create table xxx create table student 数据表插入记录 insert into 第一种形式无需指定要插入数据的列名,只需提供被插入的…

【算法训练营】:数字三角形,背包问题1,背包问题2(python实现)

数字三角形 时间限制&#xff1a;2 sec 空间限制&#xff1a;256 MB 问题描述 给定一个高度为 n 的“数字三角形”&#xff0c;其中第 i 行&#xff08;1<i<n&#xff09;有 i 个数。&#xff08;例子如下图所示&#xff09; 初始时&#xff0c;你站在“数字三角形”的顶…

卡哇伊龙猫404页面源码

卡哇伊龙猫404页面&#xff0c;具有动态下雨&#xff0c;龙猫微笑等动态特效 HTML单页源码&#xff0c;喜欢的朋友可以下载 下载地址 https://www.qqmu.com/2416.html

初次安装WordPress后如何进行网站设置(主题安装、插件安装、网站美化、网站备份、安全性提升、伪静态、多域名设置等)WordPress网站常见问题设置指南

专栏地址: WordPress建站主题美化系列教程https://blog.csdn.net/seeker1994/category_12184577.html 一文搞懂WordPress是什么?为什么用它建站?怎么安装与部署? 使用腾讯云快速搭建WordPress网站流程详解 ...... 1. 前言 专栏上几篇文章介绍了小白零基础如何使用腾讯…

文件定时自动备份方法

备份文件&#xff1a;数据安全的坚实保障 在数字化时代&#xff0c;我们的生活和工作已经离不开电子文件。这些文件可能包含重要的工作资料、珍贵的个人照片、无法替代的创意作品等。然而&#xff0c;电脑硬盘的损坏、病毒的侵袭、甚至误操作都可能导致文件丢失&#xff0c;给…

【硬件工程师面经整理21_其它】

文章目录 1 为何电源的滤波电路常常是大电容配合小电容滤波2 小信号敏感信号是什么&#xff0c;如何保护敏感信号3 555定时器4 CMOS不用输入管脚该怎么处理。5 为什么一个标准的倒相器中 P 管的宽长比要比 N 管的宽长比大&#xff1f;6 S11和反射系数和插损的关系7 眼图的功能8…

44、网络编程/数据库相关操作练习20240306

一、代码实现数据库的创建&#xff08;员工信息表&#xff09;&#xff0c;并存储员工信息&#xff08;工号、姓名、薪资&#xff09;&#xff0c;能实现增加人员信息、删除人员信息、修改人员薪资操作。 代码&#xff1a; #include<myhead.h>int do_update(sqlite3 *p…

计算机网络|Socket

文章目录 Socket并发socket Socket Socket是一种工作在TCP/IP协议栈上的API。 端口用于区分不同应用&#xff0c;IP地址用于区分不同主机。 以下是某一个服务器的socket代码。 其中with是python中的一个语法糖&#xff0c;代表当代码块离开with时&#xff0c;自动对s进行销毁…

pinia报错does not provide an export named ‘hasInjectionContext

你们好&#xff0c;我是金金金。 场景 我这里是uniappvue3编写的一个小程序项目&#xff0c;在集成pinia过程当中遇到此问题&#xff0c;报错请求的模块 未提供 导出名hasInjectionContext&#xff08;位于 pinia.mjs:6:10&#xff09; 以下我项目当中vue和pinia的具体依赖版本…

学习vue3使用在线官方开发环境play.vuejs.org进行测试

更多ruoyi-nbcio功能请看演示系统 gitee源代码地址 前后端代码&#xff1a; https://gitee.com/nbacheng/ruoyi-nbcio 演示地址&#xff1a; http://122.227.135.243:9666 更多nbcio-boot功能请看演示系统 gitee源代码地址 后端代码&#xff1a; https://gitee.com/nbach…

如何使用 CSS object-fit 进行图片的缩放和裁剪

简介 在处理图片时&#xff0c;你可能会遇到需要保持原始宽高比的情况。保持宽高比可以防止图片被拉伸或压缩而出现失真。解决这个问题的常见方法是使用 background-image CSS 属性。更现代的方法是使用 object-fit CSS 属性。 在本文中&#xff0c;你将探索 object-fit CSS …

Pytorch 复习总结 6

Pytorch 复习总结&#xff0c;仅供笔者使用&#xff0c;参考教材&#xff1a; 《动手学深度学习》Stanford University: Practical Machine Learning 本文主要内容为&#xff1a;Pytorch 计算机视觉。 本文先介绍了计算机视觉中两种常见的改进模型泛化性能的方法&#xff1a…

子矩阵的和 刷题笔记 {二维前缀和}

首先我们的目标是让 s[i][j]表示为其左方和上方形成的矩阵所有元素的和 加上s[i-1][j]和s[i][j-1]后 s[i-1][j-1]部分重复了所以减去 最后加上a[i][j]即可完成目标 s[i][j]s[i-1][j]s[i][j-1]-s[i-1][j-1]a[i][j]; 然后看题目要求 要求x1,y1,x2,y2围成的小正方形内的元素和…

Vue中如何进行非父子组件通信?

当谈及Vue中非父子组件通信时&#xff0c;我们通常会考虑使用Event Bus或者Vuex来实现。以下是我为您准备的一些面试题内容和示例代码&#xff1a; 面试题&#xff1a;“Vue中如何进行非父子组件通信&#xff1f;” 在Vue中&#xff0c;父子组件之间的通信通常是通过props和e…

ChatGPT提问技巧——控制温度和TOP-P样本

ChatGPT提问技巧——控制温度和TOP-P样本 “控制温度和Top-P抽样”在自然语言处理中&#xff0c;控制温度是指通过调整生成文本的随机性和多样性&#xff0c;而Top-P抽样是一种生成文本的策略&#xff0c;它选择概率最高的前P个词作为候选词汇。这两个技术常用于生成文本的质量…

降低85%的gc发生率:ES的GC调优实践!

#大数据/ES #经验 #性能 问题背景 客户方面反馈的问题是ES入库速度变慢&#xff0c;延迟升高到几百毫秒&#xff0c;导致数据积压过多&#xff0c;影响了业务。 排查发现ES的服务日志出现不少的gc overhead现象&#xff0c;下面是一个示例的日志片段&#xff1a; [yyyy-MM-…

算法刷题day22:双指针

目录 引言概念一、牛的学术圈I二、最长连续不重复序列三、数组元素的目标和四、判断子序列五、日志统计六、统计子矩阵 引言 关于这个双指针算法&#xff0c;主要是用来处理枚举子区间的事&#xff0c;时间复杂度从 O ( N 2 ) O(N^2) O(N2) 降为 O ( N ) O(N) O(N) &#xf…