深入浅出 -- 系统架构之微服务架构的新挑战

尽管微服务架构有着高度独立的软件模块、单一的业务职责、可灵活调整的技术栈等优势,但也不能忽略它所带来的弊端。本篇文章,我们从网络、性能、运维、组织架构和集成测试五个方面来聊一下设计微服务架构需要考虑哪些问题,对设计有哪些挑战呢?

1、跨进程通信带来的问题

前面我们聊过了,以往的单体应用,系统是在单机中进行进程通信,通信的稳定性相当好,只要服务器不宕机,基本上不会出现通信中断或异常的问题(超时不计入)。但是将单体应用打散为分布式架构后,系统的通信方式改变为了进程间通信,往往还有可能伴随着跨设备的网络访问,那么架构师在设计的时候,就必须要考虑应用的上下游系统因网络因素导致无法通信的问题。要假设网络是不可靠的(就相当于是前端页面不应该相信用户的一切输入,该做的数据校验一定要做),并对网络异常情况作出符合预期的异常处理。

以支付场景为例:用户支付成功后,系统自动调用短信发送服务给用户发送支付成功的短信,此时就需要考虑到如果短信发送不成功需要做什么异常处理。是标记未发送后重试,还是通过App进行消息提示,并将异常信息入库提醒运维检查短信服务运行情况。

单体应用调用链路:

微服务架构下的调用链路:

2、响应延迟带来的问题

与单体架构进程内通行相比,微服务架构的跨进程、跨网络通信在网络传输与消息序列化带来的延迟是不可忽略的。尤其是在五个以上的微服务间消息调用时,网络延迟对于实时系统的影响是很大的。

以红海行动电影中的1130近防炮的弹道计算为例:需要通过雷达监测的敌方炮弹的射速、方位、风速等因素计算近防炮在何时、哪些方位发射子弹进行拦截。在这种情况下,使用微服务架构带来的延迟,可能导致炮弹都打到身上了,弹道计算数据还没传过来。显然这类系统采用分布式设计就不合适。 以上例子纯属军事外行瞎猜,只是为了举例,说的不对的还请不要介意。。

3、运维方面的问题

之前的单体架构,运维在部署系统时,直接将系统jar或war包丢到容器里启动就行了,就算是没有自动化部署,工作量也不是很大。同时,以前的系统升级都是以周或月为单位,就算是人肉运维也都可以应付得过来。而对于微服务而言,每个服务都是可独立运行、独立部署、独立维护的业务单元。再加上市场的需求越来越高,运维人员每天面对成百上千台服务器发布几十次都是有可能的,人肉运维和部署显然已经无法满足互联网的快速变化。

自动化运维架构图

4、组织架构带来的问题

微服务架构带来的不仅是软件架构的改变,也是公司组织架构的改变。

单体架构下,公司以职能划分部门(项目部、产品部、设计部、开发部、测试部、运维部)进行独立管理考核,技术人员负责其中的某几个模块开发即可,可由统一的项目经理、产品经理、UI设计师进行支撑。

微服务架构下,是以业务模块进行团队划分,每个团队是内聚的,要求可以完成从调研到发版的全流程,尽量减少对外界的依赖。如何将之前的职能团队调整为按业务划分的研发团队,同样是对组织架构的巨大挑战。毕竟人的思想比架构更难改变。

单体架构下团队配置

微服务架构下团队配置

5、集成测试变得异常艰难

传统的单体架构集成测试是将不同的模块按业务流程进行组合,在进程内验证每种可能性下模块间的协作是否符合预期即可。对于微服务而言,系统被拆解成独立的运行单元,服务间采用接口进行通信。要获取准确的结果,必须搭建完整的微服务环境。同时,跨网络通信带来的网络延迟、超时、带宽、数据量等因素都将影响最终结果,测试结果容易产生偏差。

所以,微服务架构并不是没有缺点,在一定程度上,可能造成的影响比单体的影响大很多。那么我们是难道就不进行改造吗?有困难就退缩不是一个优秀架构师该有的品质。那有什么可借鉴的经验吗?当然有,我们以后再下篇接着聊!

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

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

相关文章

Webots常用的执行器(Python版)

文章目录 1. RotationalMotor2. LinearMotor3. Brake4. Propeller5. Pen6. LED 1. RotationalMotor # -*- coding: utf-8 -*- """motor_controller controller."""from controller import Robot# 实例化机器人 robot Robot()# 获取基本仿真步长…

ChatGPT/GPT4科研应用与绘图技术及论文写作

2023年随着OpenAI开发者大会的召开,最重磅更新当属GPTs,多模态API,未来自定义专属的GPT。微软创始人比尔盖茨称ChatGPT的出现有着重大历史意义,不亚于互联网和个人电脑的问世。360创始人周鸿祎认为未来各行各业如果不能搭上这班车…

2024年第十七届“认证杯”数学中国数学建模网络挑战赛思路

2024年第十七届“认证杯”数学中国数学建模网络挑战赛将于2024年4月举行。 比赛两个阶段统一报名,参赛费为每队100元人民币(两个阶段总共)。如果需要组委会提供详细的论文评价,需要再支付100元人民币的论文点评费(即每个参赛队支…

c++的学习之路:19、模板

摘要 本章主要是说了一些模板,如非类型模板参数、类模板的特化等等,文章末附上测试代码与导图 目录 摘要 一、非类型模板参数 二、类模板的特化 1、概念 2、函数模板特化 3、类模板特化 三、模板的分离编译 1、什么是分离编译 2、模板的分离编…

2024.4.8力扣每日一题——使数组连续的最少操作数

2024.4.8 题目来源我的题解方法一 去重排序滑动窗口 题目来源 力扣每日一题;题序:2009 我的题解 方法一 去重排序滑动窗口 参考官方题解。 记数组 nums的长度为 n。经过若干次操作后,若数组变为连续的,那么数组的长度不会改变&…

ip地址切换器安卓版,保护隐私,自由上网

在移动互联网时代,随着智能手机和平板电脑的普及,移动设备的网络连接变得愈发重要。为了满足用户在不同网络环境下的需求,IP地址切换器安卓版应运而生。本文将以虎观代理为例,为您详细解析IP地址切换器安卓版的功能、应用以及其所…

UVA1596 Bug Hunt 找Bug 解题报告

题目链接 https://vjudge.net/problem/UVA-1596 题目大意 输入并模拟执行一段程序,输出第一个bug所在的行。每行程序有两种可能: 数组定义,格式为arr[size]。例如a[10]或者b[5],可用下标分别是0~9和0~4…

Linux压缩打包

压缩文件有时候也叫归档文件,但是归档是将多个文件捆绑成一个文件,并没有压缩,压缩才是将大小压缩的更小。 tar 压缩 tar -zcf 压缩后文件名.tar.gz 需要压缩的文件 [rootlocalhost ~]# tar -zcf ser.tar.gz services压缩多个文件 [rootloca…

克服与新一代人工智能部署相关的数据挑战

随着商界领袖逐渐了解该技术的力量和潜力,人们对 ChatGPT 等生成式人工智能工具的潜力的兴趣正在迅速上升。 这些工具能够创建以前属于人类创造力和智力领域的输出,有潜力改变许多业务流程,并成为每个人(从作家和创作者到程序员和…

题目:学习使用按位异或 ^

题目:学习使用按位异或 ^ There is no nutrition in the blog content. After reading it, you will not only suffer from malnutrition, but also impotence. The blog content is all parallel goods. Those who are worried about being cheated should leave q…

蓝桥杯加训

1.两只塔姆沃斯牛&#xff08;模拟&#xff09; 思路&#xff1a;人和牛都记录三个数据&#xff0c;当前坐标和走的方向&#xff0c;如果人和牛的坐标和方向走重复了&#xff0c;那就说明一直在绕圈圈&#xff0c;无解 #include<iostream> using namespace std; const i…

openstack-认证服务

整个OpenStack是由控制节点&#xff0c;计算节点&#xff0c;网络节点&#xff0c;存储节点四大部分组成。 openstack重要集成组件: Nova-计算服务&#xff1b;Neutron-网络服务&#xff1b;Swift-对象存储服务&#xff1b;Cinder-块存储服务&#xff1b;Glance-镜像服务Keys…

LeetCode-118. 杨辉三角【数组 动态规划】

LeetCode-118. 杨辉三角【数组 动态规划】 题目描述&#xff1a;解题思路一&#xff1a;Python 动态规划解题思路二&#xff1a;解题思路三&#xff1a;0 题目描述&#xff1a; 给定一个非负整数 numRows&#xff0c;生成「杨辉三角」的前 numRows 行。 在「杨辉三角」中&…

算法学习系列(四十五):DFS之剪枝与优化

目录 引言DFS之剪枝与优化一、小猫爬山二、木棒三、数独四、总结 引言 关于这个 D F S DFS DFS 的剪枝和优化确实难度是非常的大&#xff0c;从我这篇文章的思路和代码量上就能看出来不是一般的难度&#xff0c;而且难度不亚于 D P DP DP &#xff0c;而且这个 D F S DFS D…

Go语言支持重载吗?如何实现重写?

Go语言不支持传统意义上的函数和方法重载。在Go语言中&#xff0c;函数名或方法名不能相同但参数列表不同&#xff0c;因为这会导致编译错误。 然而&#xff0c;可以通过方法重写&#xff08;override&#xff09;来实现类似的功能。方法重写是指在子类中定义一个与父类同名的…

C语言进阶课程学习记录-第27课 - 数组的本质分析

C语言进阶课程学习记录-第27课 - 数组的本质分析 数组实验-数组元素个数的指定实验-数组地址与数组首元素地址实验-指针与数组地址的区别小结 本文学习自狄泰软件学院 唐佐林老师的 C语言进阶课程&#xff0c;图片全部来源于课程PPT&#xff0c;仅用于个人学习记录 数组 实验-数…

Hot100【十一】:编辑距离

// 定义dp[i][j]: 表示word1前i个字符转换到word2前j个字符最小操作数 // 初始化dp[m1][n1] class Solution {public int minDistance(String word1, String word2) {int m word1.length();int n word2.length();// 1. dp数组int[][] dp new int[m 1][n 1];// 2. dp数组初…

分布式系统接口限流方案

方案一、 Guava工具包 实现单机版限流 Demo的Git地址&#xff1a;https://gitee.com/deepjava/test-api-limit.git 使用Google的Guava工具包提工单 RateLimiter类 可以实现单机状态下的接口限流 RestController RequestMapping("/test") public class ApiLimitCon…

IO流:将文件从A复制到B,并实现复制过程进度条的实现

private static boolean copyFile(String strFileA, String strFileB) {// 使用try资源块 ,其中创建的流对象可以自动关闭try (FileInputStream inputStream new FileInputStream(strFileA); // 输入流FileOutputStream outputStream new FileOutputStream(strFileB) // 输…

【Linux】进程的状态(运行、阻塞、挂起)详解,揭开孤儿进程和僵尸进程的面纱,一篇文章万字讲透!!!!进程的学习②

目录 1.进程排队 时间片 时间片的分配 结构体内存对齐 偏移量补充 对齐规则 为什么会有对齐 2.操作系统学科层面对进程状态的理解 2.1进程的状态理解 ①我们说所谓的状态就是一个整型变量&#xff0c;是task_struct中的一个整型变量 ②.状态决定了接下来的动作 2.2运行状态 2.…