微服务拆分:打造高性能、高扩展的未来架构

目录

一、微服务介绍

二、主链路规划

        2.1 业务完整性

        2.2 转化率重因子

        2.3 流量端占比

        2.4 现金水库

三、如何识别主链路

        3.1 导流端

        3.2 转化端

        3.3 漏斗中部:订单转化

        3.4 漏斗底部:下单

四、总结        


一、微服务介绍

        单体应用将所有的功能都维护在一个巨无霸的服务中,然后打包成一个 war 包扔到 Tomcat中运行,对外提供服务。单体应用存在很多问题,比如开发中互相干扰、沟通成本高、无法快速迭代、无法单独回滚等。

        由于单体服务存在很多问题,计算机中的分治思想就产生了作用,将单体应用拆分成比较小的服务,分开维护。

        微服务拆分后每个服务可以单独部署、单独测试、单独发布回滚,并借助Docker和CI/CD(持续集成)完成快速上线。

        微服务拆分的合理性很大程度上决定了整个业务链路的可用性。在微服务拆分的过程中,首要的任务是识别出核心服务,那么核心服务为何如此重要。

        如果能精准识别核心服务场景,将这些核心服务拆分成独立的微服务模块,就可以在核心服务链路上构建核心服务与边缘服务之间的隔离带,在极端洪峰流量场景下保证核心业务的高可用。

        如何识别核心服务场景呢?采用:主链路规划,帮我们识别出核心服务。

二、主链路规划

        所谓主链路,就是“保证业务可用性的核心链路”,那什么样的业务场景才能入围核心链路呢?如果拿出一个复杂的业务系统,把其中所有的业务场景铺开,让你选出哪些是“核心链路”,在按重要程度排个序,还真不知道如何下手。

        是否有一套简单易用的理论模型,帮我们在复杂的业务场景中识别其中的主链路?这个可以有,在长期的实践中总结了主链路的几个特征。

  • 业务完整性
  • 转化率重因子
  • 流量端占比
  • 现金水库

        2.1 业务完整性

        入围主链路的一个最重要的评选条件就是要具备“业务完整性”,用网购下订单为例来理解一下“业务完整性”的意思。

        一个商品下单的业务流程,首先需要去搜索商品,然后在商品列表页点击心仪商品进入到详情页,在详情页里有商品介绍、图片、买家评论等等,最后你要通过一键下单完成这笔订单。这个场景的业务目标是“完成订单”,为了达到这个目标,用户必须经过商品搜索、查看详情和一键下单这三个步骤,任意一个步骤出现故障都无法保证下单链路的“业务完整性”。

        如果某个关键链路是保证业务完整性的必要环节,那么它当之无愧被选为核心主链路中的一员。在下单场景中,查看商品评论是一个辅助功能,即便出现了故障,也并不会对业务完整性造成明显的影响,也就被排除在了主链路之外。

        2.2 转化率重因子

        有一些业务场景,它们并非是保证业务完整性的必要条件,看似无关紧要,但是对业务转化率有重大影响,这类场景其实也是主链路规划中的常客。用一个购物的例子解释一下“转化率重因子”的重要性。

        人们在淘宝买东西的时候通常会先看一下商品长什么样子再决定是否下单,商品图片都加载自“淘宝图片空间”,如果图片空间发生了故障,一定会大幅降低订单转化率。试想如果连图片都看不到,等同于开盲盒,没有人敢贸然下单吧?

        因此,我们在做主链路规划的时候,也要把这类对业务转化率有重要影响的关键链路包含进去。

        2.3 流量端占比

        如果完成最终业务目标的途径有很多种,那么这所有的途径都是核心主链路吗?答案当然是 否,能否入围主链路,还要看有多少用户流量通过这条路径完成了业务目标。如果两条路都能完成任务,那么哪条是主链路?自然是用户流量占比居多的链路。

        在主链路规划中我们要参考各个链路和导流端的用户流量分布,将流量占比高的链路划分为主链路的一环。

        2.4 现金水库

        利润是公司业务的正向现金流,我们把这些提供正向现金流的业务叫做“现金水库”。现金水库是公司业务运转的源动力,尤其在电商行业更是如此,正向现金业务的故障通常会被定级为重大资损事件。因此,我们在做主链路规划的过程中,需要将现金水库类业务划归到主链路,保护现金流不受影响。

三、如何识别主链路

        接下来基于一个真实的新零售业务的电商全链路场景,希望你可以举一反三,通过这个案例将主链路的知识点应用在自家公司的业务场景中。在开始之前,先学习一个用来分析业务场景的万金油模型 - 漏斗模型。我们通过漏斗模型将整个电商场景沙盘推演开来。

        这是一个漏斗模型图,它用来描述用户从业务流入口到业务流终点的整个过程。我们把这个模型套用在电商的下单场景中,漏斗的上方部分是主搜、导购、商品详情页之类的场景,这是用户开始业务流的入口,承载着最多的用户访问流量;漏斗中间部分是订单转化的关键环节,购物车模块;漏斗最下方的部分是下单前的临门一脚,订单和支付模块。电商行业运营侧的漏斗模型相对会复杂很多,通常划分为用户获取、激活、留存、收益和传播等阶段,不过我这里把这个过程做了简化,我们只关注几个关键的环节就好了。

        漏斗模型有三个特点:

  • QPS 递减:用户流量从漏斗上方到漏斗下方呈逐渐递减的趋势,对后台应用的 QPS(Query per second)也遵循同样的规律;
  • 流量质量递增:业务转化率由上到下依次增加,漏斗底部的业务转化率最高;
  • 主链路比例递增:越靠近漏斗底部,主链路服务的占比就越高。

        3.1 导流端

        漏斗顶部承载着用户导流和转化的双重任务,导流端主要负责将用户流量导入到商品详情页做进一步转化,常见的业务场景有站内主搜、站外短链、口令服务、类目渠道、直播转化等,这些场景都做了同一件事,那就是导流和获取用户。如果完成业务目标的途径有很多种,那么自然是流量占比越高的场景链路优先级越高。横向比对来看,在这个环节的主链路是站内主搜,它是流量占比最高的业务场景。

        3.2 转化端

        转化端的主要责任落在了商品详情页这里,回想以往的购物经验,详情页的主要功能有商品元数据的展示、SKU 模块、库存信息、用户评论、商品营销优惠信息、主图和视频空间、富文本 TFS 详情,以及一些锦上添花的小功能如用户画像推荐、热搜排行等。

        作为转化端的重头戏,商品详情页的信息可谓是纷繁复杂。不过在双 11 大促之类的场景中,很多挂在详情页的边缘功能都会被主动降级,腾出服务器资源供到主链路服务中。

        3.3 漏斗中部:订单转化

        漏斗中部是购物车模块,承担着订单转化的重要环节,主链路模块所占的比例也随之提高。

        从详情页到下单,在购物车场景中有这几类核心场景:添加 / 删除购物车商品、购物车商品列表、订单营销优惠信息、地址模块、导购模组(热卖、最近浏览、拼单立减等等)。

        从转化率重因子的角度来看,有一个具备争议的功能点也被化为了主链路的一环,就是购物车内的营销优惠计算,它是营销优惠业务最后的导流环节,必须 0 故障显示出当前车内商品可以应用的优惠条件和扣减情况,否则极易让用户放弃下单。

        为什么购物车内的营销优惠计算模块是主链路,而在转化端的商品详情页却不是呢?

        这就涉及到一个“前端柔性”的话题了。商品详情页历来是 QPS 数一数二的业务场景,我们以淘系的 UMP 营销计算服务为例,每个商品详情页请求都需要调用 UMP 服务计算单品优惠信息,即便在双 11 这种堆缓存抗压的方式下,营销计算服务仍然面临很大的压力。当服务发生故障,优惠信息无法透传到详情页的时候,我们可以在页面显示一段类似“请到购物车查看最终优惠金额”的文字,引导用户添加购物车,继续向下走购物流程,这样一来,详情页上优惠计算服务的故障对业务转化率的影响就被降到了最低。这种方式就是“前端柔性方案”(也叫用户端柔性)。

        3.4 漏斗底部:下单

        漏斗底部是庄严肃穆的下单环节,根据漏斗模型的理论,越靠近底部,主链路的占比也就越高,所以下单链路中的几乎所有场景都是主链路的一环。

        下单链路中的场景中,如创建 / 查询订单、订单页商品列表、订单快照功能、营销优惠信息透传、支付模块对接。相信你已经看出,除了商品快照服务以外,其他场景都是完成订单必不可少的一环,因此也是核心主链路的一部分。

四、总结        

        通过合理的微服务拆分,企业可以获得更高的系统弹性、更快的开发迭代速度和更好的团队协作效率,同时也能够更容易地应对市场和技术的变化。但是,微服务架构并非银弹,拆分过程中也需要权衡复杂性和收益,避免过度设计。

往期经典推荐

MongoDB 索引全攻略-CSDN博客

深入浅出 TiDB MVCC:揭秘分布式数据库中的多版本并发控制-CSDN博客

探析Drools规则引擎的工作原理_drools引擎执行过程?-CSDN博客

Redis使用规范的最佳实践:打造高性能与稳定性的关键法则-CSDN博客

决胜微服务架构:OpenFeign轻量级REST客户端的魅力解析_feign配置loadbalancer-CSDN博客

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

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

相关文章

微服务架构与Dubbo

一、微服务架构 微服务架构是一种架构概念,旨在通过将功能分解到各个离散的服务中以实现对解决方案的解耦。 分布式系统式若干独立系统的集合,但是用户使用起来好像是在使用一套系统。 和微服务对应的是单体式开发,即所有的功能打包在一个WAR…

搭建Zookeeper完全分布式集群(CentOS 9 )

ZooKeeper是一个开源的分布式协调服务,它为分布式应用提供了高效且可靠的分布式协调服务,并且是分布式应用保证数据一致性的解决方案。该项目由雅虎公司创建,是Google Chubby的开源实现。 分布式应用可以基于ZooKeeper实现诸如数据发布/订阅…

Vue的生命周期的详解

Vue的生命周期是每个使用Vue框架的前端人员都需要掌握的知识,以此作为记录。 Vue的生命周期就是vue实例从创建到销毁的全过程,也就是new Vue() 开始就是vue生命周期的开始。Vue 实例有⼀个完整的⽣命周期,也就是从开始创建、初始化数据、编译…

算法|最大堆、最小堆和堆排序的实现(JavaScript)

一些概念 堆&#xff1a;特殊的完全二叉树&#xff0c;具有特定性质的完全二叉树。大根堆&#xff1a;父节点 > 子节点小根堆&#xff1a;父节点 < 子节点 二叉堆也属于完全二叉树&#xff0c;所以可以用数组表示。 若下标从1开始&#xff0c;左节点为 2*i &#xff0…

树莓派4B+Debian(Raspbian)+开机自启动Python文件

非系统全面的教程&#xff0c;只是记录操作过程中的问题和解决方案。 说明1&#xff1a;树莓派的不同版本&#xff0c;要查看CPU的位数、内存大小&#xff1b;从而确定安装的raspbian的对应版本 若是对应64位的OS&#xff0c;安装成了32位的OS&#xff0c;可能会对系统中安装…

5、JVM-G1详解

G1收集器 -XX:UseG1GC G1 (Garbage-First)是一款面向服务器的垃圾收集器,主要针对配备多颗处理器及大容量内存的机器. 以极高概率满足GC停顿时间要求的同时,还具备高吞吐量性能特征. G1将Java堆划分为多个大小相等的独立区域&#xff08;Region&#xff09;&#xff0c;JVM目标…

代码学习记录25---单调栈

随想录日记part45 t i m e &#xff1a; time&#xff1a; time&#xff1a; 2024.04.17 主要内容&#xff1a;今天开始要学习单调栈的相关知识了&#xff0c;今天的内容主要涉及&#xff1a;每日温度 &#xff1b;下一个更大元素 I 739. 每日温度 496.下一个更大元素 I Topic…

书生·浦语大模型全链路开源体系-第4课

书生浦语大模型全链路开源体系-第4课 书生浦语大模型全链路开源体系-第4课相关资源XTuner 微调 LLMXTuner 微调小助手认知环境安装前期准备启动微调模型格式转换模型合并微调结果验证 将认知助手上传至OpenXLab将认知助手应用部署到OpenXLab使用XTuner微调多模态LLM前期准备启动…

Mac电脑上有什么好玩的格斗游戏 《真人快打1》可以在苹果电脑上玩吗

你是不是喜欢玩格斗游戏&#xff1f;你是不是想在你的Mac电脑上体验一些刺激和激烈的对战&#xff1f;在这篇文章中&#xff0c;我们将介绍Mac电脑上有什么好玩的格斗游戏&#xff0c;以及《真人快打1》可以在苹果电脑上玩吗。 一、Mac电脑上有什么好玩的格斗游戏 格斗游戏是…

命令模式

命令模式&#xff1a;将一个请求封装为一个对象&#xff0c;从而使你可用不同的请求对客户进行参数化&#xff1b;对请求排队或记录请求日志&#xff0c;以及支持可撤销的操作。 命令模式的好处&#xff1a; 1、它能较容易地设计一个命令队列&#xff1b; 2、在需要的情况下&a…

gpt-6有望成为通用工具

OpenAI CEO山姆奥特曼&#xff08;Sam Altman&#xff09;在最新的博客访谈中&#xff0c;提到gpt-6有望成为通用工具。 奥特曼还认为&#xff0c;目前的模型不够聪明&#xff0c;“使用GPT-2进行科学研究曾被认为是不切实际的想法。而如今&#xff0c;虽然人们使用GPT-4进行科…

获取公募基金净值【数据分析系列博文】

摘要 从指定网址获取公募基金净值数据&#xff0c;快速解析并存储数据。 &#xff08;该博文针对自由学习者获取数据&#xff1b;而在投顾、基金、证券等公司&#xff0c;通常有Wind、聚源、通联等厂商采购的数据&#xff09; 导入所需的库&#xff1a;代码导入了一些常用的库…

OpenCV从入门到精通实战(八)——基于dlib的人脸关键点定位

本文使用Python库dlib和OpenCV来实现面部特征点的检测和标注。 下面是代码的主要步骤和相关的代码片段&#xff1a; 步骤一&#xff1a;导入必要的库和设置参数 首先&#xff0c;代码导入了必要的Python库&#xff0c;并通过argparse设置了输入图像和面部标记预测器的参数。…

ns3.36以后的版本中_ns3命令的原理_CMAKE的使用以及一些例子

本文主要来自于ns3的官方文档&#xff1a;4.3. Working with CMake — Manual&#xff0c;不过只包含以下部分&#xff1a; 4.3. 使用CMake 4.3.1. 配置项目 4.3.1.1. 使用ns3配置项目 4.3.1.2. 使用CMake配置项目 4.3.2. 手动刷新CMake缓存 4.3.3. 建设项目 4.3.3.1. 使用ns3…

生活中的洪特规则

不知道你还记不记得高中物理所学的一个奇特的物理规则&#xff1a;洪特规则。 洪特规则是德国人弗里德里希洪特&#xff08;F.Hund&#xff09;根据大量光谱实验数据总结出的一个规律&#xff0c;它指出电子分布到能量简并的原子轨道时&#xff0c;优先以自旋相同的方式分别占…

企业网站制作如何被百度收录

1、网站在百度中的整体评分 说俗点就是网站的权重&#xff0c;在优化过程中我们会见到很多网站出现秒收的情况&#xff0c;发布的文章几分钟就可以收录&#xff0c;这个通过SITE语法都可以去查询&#xff0c;那么这跟自己的网站权重以及内容更新习惯是有非常重要的关联。 我们…

【函数式接口使用✈️✈️】通过具体的例子实现函数结合策略模式的使用

目录 前言 一、核心函数式接口 1. Consumer 2. Supplier 3. Function,> 二、场景模拟 1.面向对象设计 2. 策略接口实现&#xff08;以 Function 接口作为策略&#xff09; 三、对比 前言 在 Java 8 中引入了Stream API 新特性&#xff0c;这使得函数式编程风格进…

【IoTDB 线上小课 02】开源增益的大厂研发岗面经

还有友友不知道我们的【IoTDB 视频小课】系列吗&#xff1f; 关于 IoTDB&#xff0c;关于物联网&#xff0c;关于时序数据库&#xff0c;关于开源...给我们 5 分钟&#xff0c;持续学习&#xff0c;干货满满~ 5分钟学会 大厂研发岗面试 之前的第一期小课&#xff0c;我们听了 I…

1.总结串口的发送和接收功能使用到的函数2.总结DMA的作用,和DMA+空闲中断的使用方式3.使用PWM+ADC光敏电阻完成光控灯的实验

1.总结串口的发送和接收功能使用到的函数 串口发送函数&#xff1a;HAL_StatusTypeDef HAL_UART_Transmit(UART_HandleTypeDef *huart, const uint8_t *pData, uint16_t Size, uint32_t Timeout) UART_HandleTypeDef *huart&#xff1a;指定要使用的串口 const uint8_t *pData&…

爬虫入门——Request请求

目录 前言 一、Requests是什么&#xff1f; 二、使用步骤 1.引入库 2.请求 3.响应 三.总结 前言 上一篇爬虫我们已经提及到了urllib库的使用&#xff0c;为了方便大家的使用过程&#xff0c;这里为大家介绍新的库来实现请求获取响应的库。 一、Requests是什么&#xff1…