浅谈高并发分布式架构演进路径

news2024/11/25 13:01:36

前言

一直很想写一篇能覆盖分布式方面的文章,但当写的时候发现分布式技术发展到现在阶段,有太多的最佳实践和方法论,网上的文章也特别多,根本无从下手。思来想去,发现很多最佳实践都是有一定的理论支撑,我尝试“通过现象看本质”的写法,写写试试。

在写这边博客之前,需要先拉起一些相关概念,此篇博客不会特别深入阐述某些理论和详细设计方案,希望通过几个案例,让大家了解在分布式时需要具备的思想或思考方向,起到抛砖引玉的作用。

文章我准备分三部分写,此博客会写第一部分:

  • 第一篇主要以应用分布式视角,讲述从有状态单体服务-->无状态服务-->解耦的进化过程;

  • 第二篇主要说一说分布式系统容器化,聊聊容器云给系统带来不可变基础设施、自动扩散容等变化;

  • 第三篇主要以Paas平台支撑分布式应用视角,聊聊数据一致性所需要的CAP理论、Raft算法、一致性哈希算法等理论,及其在底层支撑发挥的作用。

无状态服务,开启分布式第一步

以一个简单的商城系统购买商品场景为例,用户登录商城,系统一般会在本机以Session ID的形式保持会话状态,这样该用户每次预览、购买商品的时候,都是保持登录后的状态。用户在购买商品时在系统逻辑中会完成库存数量查询,如果有库存,可以继续购买,如果没有,返回告知用户物品卖完,后面是扣减库存和支付,每一步出现问题都可以通过事务进行自动回退,不会出现多扣库存或超卖等现象。

随着用户越来越多,访问流量愈来愈大,单个节点服务已经无法支撑。为了快速支撑目前的并发量一般会做如下优化:

  1. 将Session ID等有状态的参数,放到Redis进行统一存储,如登录状态;

  2. 将频繁查询的数据放入到Redis中,减轻数据库压力,如查询库存信息。

在目前场景下,使用Redis的时候,需要注意两点:

  1. 添加信息时,主要设置key的过期时间;

  2. 需要解决Redis与数据库数据的一致性,简单点的解决方式是“先更新数据库,再更新缓存”。

通过这波操作,一般能解决大部分小公司的流量问题,如果觉得还是不够,也可以使用开发语言的线程池队列,对瞬时的流量进行削峰。

解耦,“天下大势,分久必合,合久必分”

随着公司业务越来越复杂,单体应用也会有一些问题,如

  1. 单体应用模块间代码互相影响,简单的代码修改需要整体打包,整体测试,效率低下;

  2. 无法做到单一模块的扩展,每次扩展都需要整体应用扩展,造成资源浪费;

  3. 单体应用决定了应用内部必须采用同样的技术栈进行开发,内部应用无法自己决定采用最合适的技术。

微服务特点

有一个叫Martin Fowler的老外提出了微服务的概念。

微服务架构是一种架构模式,它提倡将单一应用程序划分成一组小的服务,每个服务运行在其独立的进程中,服务间采用轻量级的通信机制互相沟通(通常是基于HTTP协议的RESTful API). 每个服务都围绕着具体业务进行构建,并且能够被独立的部署到生产环境、类生产环境等。

从而实现了:

  1. 开发人员通过编译并重新部署单个子服务的方式来验证自己的更改不再需要重新编译整个应用;

  2. 由于每个子服务是独立的,因此各个服务内部可以自行决定最为合适的实现技术,使得这些子服务的开发变得更为容易;

  3. 系统的容量不够,只需要找到成为系统瓶颈的子服务,并扩展该子服务的容量即可。

微服务优缺点

微服务平台落地实践

可以参考我之前写的博客《正式线上环境下微服务平台落地实践》,主要是运行时支撑组件和可观测性组件的建设。运行时支撑组件实现服务注册发现、负载均衡、配置、认证等功能,可观测性组件则是完成日志、指标和链路等监控的建设,实现事前留痕、事中告警、事后问题快速定位的全生命周期可观测能力。

微服务拆分原则

微服务架构的核心思想是将一个大型的应用系统拆分成多个小型的、自治的服务单元,以便于开发、部署和维护。微服务拆分的原则可以帮助你合理划分服务边界,下面是一些常见的微服务拆分原则:

  1. 单一职责原则 (Single Responsibility Principle, SRP):每个微服务应该专注于一个明确的业务领域或功能。避免将多个不相关的功能混合在同一个微服务中。

  2. 界限上下文 (Bounded Context):根据领域驱动设计(Domain-Driven Design)原则,将微服务划分为不同的界限上下文。每个界限上下文表示一个业务领域的边界,确保在一个上下文内的模型和语言保持一致。

  3. 松耦合 (Loose Coupling):微服务之间应该尽量减少相互依赖,以便于独立开发、部署和扩展。使用清晰的接口和协议定义,避免直接数据库访问和紧密耦合的集成。

  4. 高内聚 (High Cohesion):每个微服务内部的组件应该紧密相关,具有高内聚性。这有助于减少微服务内部的复杂度,并使其更易于维护。

  5. 自治性 (Autonomy):每个微服务应该是自治的,能够独立开发、部署和运行。避免过度共享代码和数据,以减少对其他微服务的依赖。

  6. 可替代性 (Replaceability):设计微服务时考虑到未来可能需要替换某个微服务。确保微服务之间的依赖关系不会过于复杂,以便于在需要时进行更换。

  7. 按业务功能拆分 (Business Capability):将微服务按照业务功能进行拆分,每个微服务负责一个独立的业务功能。这有助于更好地理解系统的业务流程。

  8. 按照团队组织拆分 (Team Organization):根据团队的结构和能力,将微服务进行划分。每个团队负责一个或多个微服务,以促进快速开发和迭代。

  9. 可扩展性 (Scalability):将可能需要独立扩展的功能划分为独立的微服务,以便按需扩展系统的各个部分。

  10. 性能优化 (Performance Optimization):将潜在的性能瓶颈或高负载功能划分为微服务,以便进行独立的性能优化。

  11. 最小可行性 (Minimum Viable):初始阶段,将系统划分为最小可行的微服务集,以便快速推出原型并根据反馈进行调整。

  12. 数据管理 (Data Management):根据数据访问模式和数据所有权,将微服务划分为适当的数据管理单元,以确保数据一致性和合理的数据隔离。

  13. 界面定义 (Interface Definition):定义清晰的接口和协议,确保微服务之间的通信和集成是稳定和可靠的。

微服务拆分方式

对于拆分,业绩一般有三种拆分形式:一次性拆分、迭代拆分和外围扩展

  1. 一次性拆分:顾名思义就是将一个大系统直接彻底的拆分,比如将一个商场系统,拆成商品、订单、支付和库存等系统;

  2. 迭代拆分:根据需要和相应的业务场景,迭代慢慢进行拆分;

  3. 外围扩展:不拆分现有系统,当需要添加新功能的时候,不会在原有系统中添加功能代码,可以通过RPC调用的方式开发新的系统。

“一次性拆分”会拆的比较彻底,大多是在重大转型或重大架构变化时出现,一般需要最高层介入,多部门协作,设计范围广、人员多、工期长,声势搞的特别大,容易出政绩。但是由于工程太大,沟通成本和资源成本消耗巨大,很容易出现“拔出萝卜带出泥”,各种细节考虑不周等问题,会有很长的震荡周期。

大部分公司会选择“迭代拆分”+“外围扩展”来解耦系统,新增的系统如果跟当前的系统耦合不大,可以在外围通过RPC框架进行交互,内部解耦可以现将一些耦合性比较低的代码进行拆分,拆一两个看看效果,拆分力度可以由大到小进行解耦,然后通过实际调用、线上运行和对业务需求支撑等情况,综合考虑迭代拆分,可以边走边看,边总结经验培养团队,慢慢达到适合自身组织结构的解耦。

总结

微服务的拆分原则是灵活的,取决于具体的业务需求、组织结构和技术栈。合理的微服务拆分可以使系统更易于管理、扩展和维护,但需要平衡各种因素以达到最佳效果。

参考

  • Redis数据一致性

  • How to Design Microservices for Agile Architecture

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

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

相关文章

图书管理系统 毕业设计

图书管理系统 毕业设计 摘 要 摘要:二十一世纪是信息的世纪,随着社会经济的发展,社会信息化程度也越来越高,学校作为教育与科技的先行者,优秀的技术往往会被所率先学校采用。优秀的学校管理决策者一定会毫不犹豫地选…

vue中获取农历时间

1.下载依赖 npm i chinese-lunar-calendar 2.局部使用 import { getLunar } from chinese-lunar-calendar; 3.使用 getLunar(new Date().getFullYear(), new Date().getMonth() 1, new Date().getDate()) 结果

【Java】高效利用异常处理技巧

文章目录 前言Java异常体系Error和ExceptionThrowable 常见的错误和异常编译时异常运行时异常Error 异常的处理捕获异常声明抛出异常类型 手动抛出异常对象:throw语法格式注意事项 自定义异常为什么需要自定义异常类 小结 前言 在使用计算机语言进行项目开发的过程…

C++ 学习之深拷贝 和 浅拷贝

前言 在C中,浅拷贝和深拷贝是涉及对象复制的两种不同方式,它们之间的关键区别在于拷贝对象时是否复制对象所指向的数据。 正文 浅拷贝(Shallow Copy): 浅拷贝只复制对象本身,而不复制对象所指向的数据。…

redis(1)-hiredis-Windows下的编译

1.linux编译说明文档 GitHub - sewenew/redis-plus-plus: Redis client written in C 2.hiredis 编译 2.1 hiredis下载 https://github.com/redis/hiredis.git 2.2 hiredis cmake编译 2.2.1 配置生成:ConfigeGenerateOpen Project 配置源目录:…

【收藏】2023年成人高考题型分析、考试技巧

答题技巧 考试过程中,会做的题目按照自己的方法做,会做的务必一定要拿到分;不会做的,多得一分是一分。 1.字迹一定要工整,切勿潦草,减少涂改,尤其是语文,主观题和作文是没有标准答…

ubuntu下安装vscode代码编辑器

1、安装gcc(安装前准备工作) ubuntu下安装gcc报错: sudo apt get install gcc 正在等待缓存锁:无法获得锁 /var/lib/dpkg/lock-frontend。锁正由进程 6809(unattended-upgr)持有 方式1:没有…

【漏洞库】Fastjson_1.2.47_rce

文章目录 漏洞描述漏洞编号漏洞评级影响版本漏洞复现- 利用工具- 漏洞环境- 漏洞扫描- 漏洞验证- 深度利用- GetShell- EXP 编写 漏洞挖掘- 寻找入口点- 指纹信息 修复建议- 漏洞修复 漏洞原理 漏洞描述 Fastjson是阿里巴巴公司开源的一款json解析器,其性能优越&am…

Python多进程爬取电影信息

观察翻页时详情页面url地址变化规律 import json from os import makedirs from os.path import exists import requests import logging import re from urllib.parse import urljoin import multiprocessing# 定义了下日志输出级别和输出格式 logging.basicConfig(levellog…

Java——》synchronized编译

推荐链接: 总结——》【Java】 总结——》【Mysql】 总结——》【Redis】 总结——》【Kafka】 总结——》【Spring】 总结——》【SpringBoot】 总结——》【MyBatis、MyBatis-Plus】 总结——》【Linux】 总结——》【MongoD…

python+selenium自动化测试项目实战

说明:本项目采用流程控制思想,未引用unittest&pytest等单元测试框架 一.项目介绍 目的 测试某官方网站登录功能模块可以正常使用 用例 1.输入格式正确的用户名和正确的密码,验证是否登录成功; 2.输入格式正确的用户名和不…

想做交传翻译,如何成为一名专业的交传译员?

据了解,交传翻译指的是在会议进行过程中,译员快速地记录演讲者发言内容,在主讲者发言间隙,将上一段演讲内容翻译成目标语言并演讲个观众听。那么,如何成为一名专业的交传译员? 交传译员必须具备的能力有哪…

阿里云ubuntu服务器搭建ftp服务器

阿里云ubuntu服务器搭建ftp服务器 服务器环境安装步骤一.创建用户二.安装 vsftp三 配置vsftp四.配置阿里云安全组 服务器环境 阿里云上的云服务器,操作系统为 ubuntu20.04。 安装步骤 一.创建用户 为什么需要创建用户? 这里的用户,指的是…

Spring MVC入门必读:实现增删改查

目录 引言 一、前期准备 1.1.搭建Maven环境 1.2.导入pom.xml依赖 1.3.导入配置文件 ①jdbc.properties ②generatorConfig.xml ③log4j2.xml ④spring-mybatis.xml ⑤spring-context.xml ⑥spring-mvc.xml ⑦修改web.xml文件 二、逆向生成增删改查 2.1.导入相关u…

Visual Studio 2022 同步代码报错:Authentication failed...

1.使用其他git GUI工具,例如:TortoiseGit 能够正常拉取和推送项目, 但如果使用Visual Studio 2022 里面的git 代码管理工具拉取项目时,报错弹窗如下。 打开输出窗口,查看报错详细:点击Visual Studio 2022顶部菜单栏里…

win11和虚拟机上的ubuntu系统共享文件夹

出发点:有时候需要在虚拟机内和win11系统之间进行文件拷贝操作,但是虚拟机内的Vmware Tools不好用 解决方式 开启虚拟机共享文件夹 在虚拟机的Ubuntu系统内的终端命令行输入以下命令 sudo /usr/bin/vmhgfs-fuse .host:/SVMware /mnt/win -o subtype…

selenium 自动化测试:如何搭建自动化测试环境,搭建环境过程应该注意的问题

最近也有很多人私下问我,selenium学习难吗,基础入门的学习内容很多是3以前的版本资料,对于有基础的人来说,3到4的差别虽然有,但是不足以影响自己,但是对于没有学过的人来说,通过资料再到自己写的…

2024年天津农学院专升本增加水文与水资源专业更名报考范围的通知

天津农学院2024年关于增加高职升本科“水文与水资源工程” 报考专业范围的通知 各位考生: 根据教育部《职业教育专业目录(2021年)》(教职成〔2021〕2号)相关内容要求,天津农学院专升本“水文与水资源工程”…

代码随想录算法训练营第45天 | ● 70. 爬楼梯 (进阶)● 322. 零钱兑换 ● 279.完全平方数11

文章目录 前言一、70. 爬楼梯 (进阶)二、322. 零钱兑换三、279.完全平方数总结 前言 完全背包; 一、70. 爬楼梯 (进阶) 第44天的blog里面有提到这个题目,本质上还是完全背包;另外,例…

spring-secrity的Filter顺序+自定义过滤器

Filter顺序 Spring Security的官方文档向我们提供了filter的顺序,实际应用中无论用到了哪些,整体的顺序是保持不变的: ChannelProcessingFilter,重定向到其他协议的过滤器。也就是说如果你访问的channel错了,那首先就会在channel…