微服务架构陷阱与挑战

news2024/12/28 18:26:19

六大陷阱

粒度太细

服务关系复杂

在这里插入图片描述

需求分析、方案设计、测试、部署。。。难度都会增加

例如:

  1. 分布式服务如何保证数据一致性
  2. 分析设计的时候需要考虑的影响点变多

团队效率低下

在这里插入图片描述

需求分析、方案设计、测试、部署。。。工作量都会增加

例如:

  1. 接口设计数量,1次请求由2个服务器处理,接口数量1个,5个服务处理,接口数量4个,接口设计、接口联调、接口测试等工作量都会大大增加
  2. 某个业务功能上线,需要升级的系统数量会增加

问题定位困难

在这里插入图片描述

故障扩散:单个微服务的故障,会导致多个微服务异常,监控系统一片红,到处都在告警,但是不知道根本原因

系统性能下降

在这里插入图片描述

调用链越长,单次请求耗时会更长

基础设施缺乏

无法快速交付

  1. 没有自动化测试支撑,每次测试都需要测试大量接口
  2. 没有自动化部署支撑,人工部署苦不堪言
  3. 没有自动化监控,每次故障定位都需要人工查询几十台机器上百个微服务的各种状态和各种日志文件

服务管理混乱

  1. 服务路由:假设某个微服务有60个节点,部署在20台机器上,那么其他依赖的微服务如何知道这个部署情况?
  2. 服务故障隔离:假设上述例子中的60个节点有5个节点发生故障了,依赖的微服务如何处理这种情况?
  3. 服务注册和发现:同样是上述的例子,现在我们决定从60个节点扩充到80个节点,或者将60个节点缩减为40个节点,如何让依赖的服务知道新增或者减少的节点呢?

四大挑战

数据分布

分布式事务

本地事务消息

在这里插入图片描述

  1. 如果“2.事务消息”丢失,A服务会不断重试
  2. 如果“4.处理响应”丢失,A服务会不断重试
  3. B服务重复收到“2.事务消息”,然后检查消息表是否已经处理过,已经处理过就直接返回处理结果,没有处理就正常处理(幂等)

消息队列事务消息(以RocketMQ举例)

在这里插入图片描述

  1. 发送Prepared消息时,会拿到消息的地址
  2. 执行本地事务
  3. 通过1拿到的地址去修改消息状态
  4. RocketMQ会定期扫描消息集群中的事务消息,如果发现了Prepared消息,它会向消息发送者确认,RocketMQ会根据发送端设置的策略来决定是回滚还是继续发送确认消息

TCC

在这里插入图片描述

应用层面的2PC,事务协调器就是业务代码,Confirm接口和Cancel接口要实现幂等(全局ID+状态)

Try

1.服务A修改订单为“Paying”状态
2.服务B冻结库存2,剩余可用库存98

Confirm

3.服务A修改订单为“Paid”
4.服务B冻结库存为0,剩余可用库存98

Cancel

3.1服务A修改订单为“Canceled”
4.1服务B冻结库存为0,剩余可用库存100

全局幂等

在这里插入图片描述

幂等技术本质

分布式数据只能通过消息来实现最终一致性,而消息可能会丢失,因此需要重试,重试就需要保证幂等

幂等定义

幂等(idempotent、idempotence)是一个数学与计算机学概念,常见于抽象代数中。在编程中一个幂等操作的特点是其任意多次执行所产生的影响均与一次执行的影响相同

全局幂等

全局范围内的幂等,保证每个幂等操作都是全局唯一的

设计关键

  1. 全局唯一ID
  2. 状态机

设计示例

正常处理1

在这里插入图片描述

正常处理2

在这里插入图片描述

幂等处理

在这里插入图片描述

服务分布

接口兼容

问题

某个微服务的某些接口升级,依赖这些接口的微服务不一定能够全部同时升级

解决方案

  1. 接口多版本(推荐):直接拷贝一份旧接口代码,在旧接口代码上修改,接口URL加上 /v1 /v2这种标识
  2. 接口逻辑兼容(不推荐):同一份接口代码,兼容新旧逻辑,容易互相影响,且旧接口下线时又要修改代码

接口循环调用

问题

某次业务处理过程中,A调用B,B又过来调用A,A的处理又进入了之前的处理逻辑,导致循环调用,整个业务进入死循环

解决方案

几乎没有好的解决方案,尽量靠上线前的测试发现

举例

  1. 用户登录服务调用风控服务进行安全检查
  2. 风控服务又来调用登录服务获取用户登录地址信息
  3. 获取登录地信息的接口又依赖风控服务进行安全检查

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

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

相关文章

Xintell——全生命周期的模型建设+智能数据中台

在业务反欺诈、运营及数据分析上,经常会涉及到模型。模型就是基于目标群体的大规模采样数据,挖掘出某个实际问题或客观事物的现象本质及运行规律,利用抽象的概念分析存在问题或风险,计算推演出减轻、防范问题或风险的对策过程&…

怎么用手机压缩图片?教给大家三种手机压缩图片方法

如何使用手机把图片的内存进行压缩呢?大家在使用照片的时候,如果照片的内存太大,不仅会占用手机的内存,也会影响一些网站上传图片的操作,因为图片内存太大很多都是上传不了的,为了解决这一问题我们可以将图…

【设计模式】适配器模式:攻敌三分,自留七分,以超兽武装的例子来谈谈适配器模式

文章目录1 适配器模式1.1 定义1.2 结构1.3 类图1.3.1 类适配器模式1.3.2 对象适配器模式2 例子2.1 类适配器模式2.1.1 代码2.1.2 效果图2.2 对象适配器模式2.2.1 代码2.2.2 效果通3 优缺点及适用环境3.1 优点3.2 缺点3.3 适用环境1 适配器模式 1.1 定义 将一个类的接口转换成客…

【深入理解C++】RTTI、dynamic_cast、typeid()

文章目录1.RTTI2.dynamic_cast运算符3.typeid运算符4.RTTI与虚函数表1.RTTI RTTI(Run Time Type Identification),即运行时类型识别,通过 RTTI,程序能够使用基类的指针或引用来检查这些指针或引用所指的对象的实际派生类型。 RTTI 提供了两…

数据库命名规范

1、mysql 规范 1.1 表名规范 模块_功能点 示例:alllive_log alllive_category。采用26个英文字母(区分大小写)和0-9的自然数(经常不需要)加上下划线_组成,命名简洁明确,多个单词用下划线_分隔,一个项目一个数据库。全部小写命名&#xff0c…

嵌入式分享合集103

一、EEPROM和Flash 存储器分为两大类:RAM和ROM,本文主要讨论ROM。ROM最初不能编程,出厂什么内容就永远什么内容,不灵活。 后来出现了PROM,可以自己写入一次,要是写错了,只能换一片,自…

React中的生命周期函数

生命周期的三个阶段: 1.创建时(挂载阶段) ①执行时机:组件创建时(页面加载时) ②执行顺序:constructor()->render()->componentDidMount() import React, { Com…

nodejs+vue+elementui共享充电宝管理系统express

目 录 摘 要 I ABSTRACT II 目 录 II 第1章 绪论 1 1.1背景及意义 1 1.2 国内外研究概况 1 1.3 研究的内容 1 第2章 相关技术 2 前端技术:nodejsvueelementui 前端:HTML5,CSS3、JavaScript、VUE 功能介绍 管理员:…

H5基本开发2——(HTML文档基本结构)

现实生活中,任何一个文档都是具有一定的格式,不同的文档,基本格式不同,例如:请假条、调休单、剧本、年中总结、十九大报告、等等,而我们所编写等html文档也是具有一定的编写基本格式的 事实上W3C组织一直致…

[附源码]java毕业设计教学辅助系统

项目运行 环境配置: Jdk1.8 Tomcat7.0 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。 项目技术: SSM mybatis Maven Vue 等等组成,B/S模式 M…

TwoModalBERT进行角色分类

你是否遇到过数据集中有多个文本特性的情况?例如,根据消息的上下文正确地对消息进行分类,即理解前面的消息。比如说我们有下面的数据集,需要对其进行分类。 当只考虑message时,你可以看到它的情绪是积极的,因为“incr…

关于电影的HTML网页设计—— 电影小黄人6页 HTML+CSS+JavaScript

HTML实例网页代码, 本实例适合于初学HTML的同学。该实例里面有设置了css的样式设置,有div的样式格局,这个实例比较全面,有助于同学的学习,本文将介绍如何通过从头开始设计个人网站并将其转换为代码的过程来实践设计。 精彩专栏推荐&#x1f4…

【Pytorch with fastai】第 10 章 :NLP 深入探讨 RNN

🔎大家好,我是Sonhhxg_柒,希望你看完之后,能对你有所帮助,不足请指正!共同学习交流🔎 📝个人主页-Sonhhxg_柒的博客_CSDN博客 📃 🎁欢迎各位→点赞…

【JavaScript高级程序设计】重点-第五章笔记:Date、RegExp、原始值包装类、单例内置对象

文章目录基本引用类型1.Date1.1 继承的方法1.2 日期格式化方法1.3 日期/时间组件方法2.RegExp正则表达式2.1 RegExp 实例属性2.2 RegExp 实例方法2.3 RegExp 构造函数属性3.原始值包装类型3.1 Boolean3.2 Number3.3 String3.3.1 JavaScript 字符3.3.2 normalize()方法3.3.3 字符…

AI 实战篇 |十分钟学会【动物识别】,快去寻找身边的小动物试试看吧【送书】

🎬 博客主页:https://xiaoy.blog.csdn.net 🎥 本文由 呆呆敲代码的小Y 原创,首发于 CSDN🙉 🎄 学习专栏推荐:Unity系统学习专栏 🌲 游戏制作专栏推荐:游戏制作 &…

计算机毕业设计node.js+vue在线日程管理系统

项目介绍 我国经济迅速发展,人们对手机的需求越来越大,各种手机软件也都在被广泛应用,但是对于手机进行数据信息管理,对于手机的各种软件也是备受用户的喜爱,在线日程管理系统被用户普遍使用,为方便用户能够可以随时进行在线管理自己的日程的数据信息,特开发了基于在线日程管理…

【Pytorch with fastai】第 11 章 :使用 fastai 的中级 API 进行数据处理

🔎大家好,我是Sonhhxg_柒,希望你看完之后,能对你有所帮助,不足请指正!共同学习交流🔎 📝个人主页-Sonhhxg_柒的博客_CSDN博客 📃 🎁欢迎各位→点赞…

第2关:子节点创建、列出、删除

子节点创建、列出 首先,需要启动服务器,并使用zkCli.sh连接服务器,进入客户端命令行界面(如第一关所述)。 创建子节点类似于创建新的节点,子节点也具有四种类型的节点。唯一的区别是:子节点的…

redis学习4-list

基本的数据类型,列表,redis命令是不区分大小写的 在redis中,我们可以把list玩成,线,队列,阻塞队列! 所有的list命令都是用l开头的 [rootcentos7964 bin]# redis-cli -p 6379 127.0.0.1:6379> LPUSH li…

Oracle Primavera Unifier计划管理器(Planning Manager)

目录 一、前言 二、介绍 一、前言 在计划管理器中,Oracle Primavera Unifier 用户可以计划新项目/外壳和提案,并为已在 Unifier 中运行的项目/外壳创建预测。他们不能像在 Unifier 中管理真实项目/外壳那样管理计划的项目/外壳;但是,他们可…