应用架构总结

news2024/11/27 2:18:57

架构目标

  1. 高可用性

整体系统可用性最低99.9%,目标99.99%。全年故障时间整个系统不超过500分钟,单个系统故障不超过50分钟。

  1. 高可扩展性 系统架构简单清晰,应用系统间耦合低,容易水平扩展,业务功能增改方便快捷。

  2. 低成本 增加服务的重用性,提高开发效率,降低人力成本;

  3. 最终一致性

服务设计能满足数据最终一致性,能方便、快捷的满足三方、或者对方对账需求。

  1. 质量要求

我们要求在系统设计时候要兼顾下面的各个质量要求

alt

架构总体原则

alt

DID原则解释

Design(D)设计20倍的容量;Implement(I)实施3倍的容量;Deploy(D)部署1.5倍的容量

原因:DID为产品扩展提供了经济,有效,及时的方法

要点:在早期考虑可扩展性可以帮助团队节省时间和金钱。在需求发生大约一个月前实施(写代码),在客户蜂拥而至的几天前部署。

例子:“什么时候该在可扩展性上投入”有些轻率的回答是,最好在需要的前一天投入和部署。如果你能够多做到达需要改善可扩展性方案的前一天部署,那么 这笔投资的时机最佳,而且有助于实现公司财务和股东利益的最大化。 让我们面对现实,及时投入和部署根本就不可能,即使可能,也无法确定具体的时间,而且会带来很多风险。

DID(设计-实施-部署):思考问题和设计方案,为方案构建系统和编写代码;实际安装或者部署方案。

设计(Design):DID方法的设计(D)阶段聚集在扩展到20倍和无限大之间,通过如今可扩展性大会,把领导者和工程师团队聚集在一起,共同讨论产品的扩展瓶颈,这是在DID设计阶段发现和确定需要扩展部分的一个好办法。

实施(I,Implement):我们把规模需求的范围缩小到更接近现实,例如当前规模的3~20倍。

部署(D,Deploy):在部署阶段资产的成本较高,如果是一家适度高增长的公司,也许我们可以把最大产能提高到1.5倍;如果是一家超高增长的公司,也许我们可以把最大产能提高到5倍。扩展具有弹性,它既可以扩张也可以收缩,因此灵活性是关键,因为你需要响应客户的请求,随着规模的收缩和扩张,在系统之间调整容量

架构设计原则

  1. 业务平台化
  • 业务平台化,相互独立。 如交易平台、仓储平台、物流平台、支付平台、广告平台等
  • 基础业务下沉,可复用。如用户、商品、类目、促销、订单等 (参考目前核心系统)。
  1. 核心业务、非核心业务分离

核心业务与非核心业务分离,核心业务精简(利于稳定),非核心业务多样化。

  1. 隔离不同类型的业务
  • 交易业务是签订买家和卖家之间的交易合同,需要优先保证高可用性,让用户能快速下单
  • 闪购业务对高并发要求很高,应该跟普通业务隔离
  1. 区分主流程、辅流程

分清哪些是电商的主流程。运行时,优先保证主流程的顺利完成,辅流程可以采用后台异步的方式。避免辅流程的失败导致主流程的回滚。

应用架构设计要点

  1. 稳定性原则
  • 一切以稳定为中心
  • 架构尽可能简单、清晰
  • 不过度设计
  1. 解耦、拆分
  • 稳定部分与易变部分分离
  • 核心业务与非核心业务分离
  • 主业务与辅业务分离
  • 应用与数据分离
  • 服务与实现细节分离
  1. 抽象化
  • 应用抽象化:应用只依赖服务抽象,不依赖服务实现细节、位置
  • 数据库抽象化:应用只依赖逻辑数据库,不需要关心物理库的位置和分片
  • 服务器抽象化:应用虚拟化部署,不需要关心实体机配置,动态调配资源
  1. 松耦合
  • 同步调用时,需要设置超时时间、对调用异常时候的failover处理。
  • 非核心业务尽量异步化:核心、非核心业务之间,尽量异步解耦。
  • 跨业务线(比如分期乐、桔子、鼎盛间)调用需要采用HTTP接口方式,避免底层业务逻辑耦合和依赖。
  1. 容错设计
  • 服务自治:服务能彼此独立修改、部署、发布和管理,避免一个服务发生灾害引发连锁反应(一定要对mq、rpc、db、redis的异常容错处理、异常包括超时、业务异常、系统异常等)。
  • 集群容错:应用系统集群,避免单点。
  • 多机房容灾:多机房部署,多活。

6 数据的一致性原则

  • 小规模分布或不分布的业务确保可用、数据可靠、一致,即A & C兼顾;
  • 中型分布系统需要考虑【BASE-最终一致性】,如果涉及到订单、交易、清结算等数据敏感场景,保持数据最终一致性是最基本原则;
  • 大规模分布式系统在不涉及订单、交易、清结算等数据敏感场景上可以考虑【有损服务】;。

架构分解原则

alt

架构依赖原则

  1. 依赖稳定部分
  • 稳定部分不依赖易变部分
  • 易变部分可以依赖稳定部分
  • 要求:避免循环依赖
  1. 跨域弱依赖

跨业务域调用时,尽可能异步弱依赖

  1. 基本服务依赖
  • 基本服务不能向上依赖流程服务
  • 组合服务、流程服务可以向下依赖基本服务
  • 条件:基本服务稳定
  1. 平台服务依赖
  • 平台服务不依赖上层应用
  • 上层应用可依赖平台服务
  • 条件:平台服务稳定
  1. 核心服务依赖
  • 核心服务不依赖非核心服务
  • 非核心服务可依赖核心服务
  • 条件:核心服务稳定
- END -

本文由 mdnice 多平台发布

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

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

相关文章

IOS APP universal links 申请流程

一、背景 项目框架:APP h5 需求:APP首页可以选择微信,进行授权登录。 问题:在APP跳转到微信进行授权的时候,提示“由于应用universal link校验不通过,无法完成微信登录”。 二、申请流程 1. 苹果后台管…

XML语言简介和语法介绍

XML语言简介 文章目录 XML语言简介用途各部分注解声明元素属性注释CDATA转义字符 可拓展标记语言;是SGML的子集,可以描述很复杂的数据关系 用途 用于组织和存储数据,除此之外都和XML本身无关 配置文件(例子:Tomcat的web.xml,se…

Android 消息机制

消息机制相关API Message(消息) 可理解为线程之间通讯的数据单元, 可以通过message携带需要的数据 创建对象: Message.obtain(what) 封装数据 public int what public int arg public Object obj Handler(处理器) Handler是Message的处理器, 同时也负责消息的发送和移除的…

Linux内核(十四)Input 子系统详解 IV —— 配对的input设备与input事件处理器 input_register_handle

文章目录 input_handle结构体详解配对的input设备与input事件处理器实例input核心层对驱动层和事件层之间的框架建立流程图 本文章中与input子系统相关的结构体可参考input子系统结构体解析 input函数路径:drivers/input/input.c input_handle结构体详解 input_ha…

二十六:交易详细信息

功能需求 用户在交易主页面,点击交易名称超级链接,跳转到交易明细页面,完成查看交易明细的功能。 *显示交易的基本信息 *显示交易的备注信息 *显示交易的历史信息 *显示交易的阶段图标信息 流程图 后端代码实现 1.tran TranMapper /*…

实现Fast sigmoid和Softmax

Sigmoid 函数介绍 Sigmoid 函数(Logistic 函数)是神经网络中非常常用的激活函数,它的数学表示如下: 由于 e x e^x ex幂运算是非常耗时的计算,因此尝试通过替换sigmoid中的 e x e^x ex运算,来提高运行效率,同…

Linux篇4

Shell常用命令 1. 日期时间类1.1 date:日期时间类1.1.1 查看当前日期时间1.1.2 查看非当前日期时间1.1.3 设置系统日期时间 1.2 cal:日历类 2. 用户管理命令2.0 id:查看用户是否存在2.1 useradd:添加新用户2.2 passwd:…

Linux相关问题

中英文切换 super空格切换中英文;super指键盘上的Win键; 开机自启动服务设置 可视化方式:输入setup命令进入自启动服务配置;通过上下键选中服务,通过空格选择是否自启动该服务; 开启不同的终端 CTRLALT…

Jetson nano 之 ROS入门 - - 机器人坐标变换

文章目录 前言一、空间坐标变换原理1. 位姿描述2. 欧拉角与四元数 二、ROS中python实现坐标变换1. 坐标msg消息载体2. 乌龟跟随的程序实现 总结 前言 ROS给开发者们提供了很多集成度很高的开发工具,例如rviz和gazebo。rviz是三维可视化工具,可以显示图像…

【P23】JMeter 用户参数(User Parameters)

&#xff08;1&#xff09;、测试计划右键 <<< 添加 <<< 前置处理器 <<< 用户参数 如图&#xff0c;添加两个变量&#xff0c;每个变量包含两个用户 &#xff08;2&#xff09;、测试计划右键 <<< 添加 <<< 线程&#xff08;用户…

ChatGPT的工作原理(纯干货,万字长文)

ChatGPT 能够自动生成一些读起来表面上甚至像人写的文字的东西&#xff0c;这非常了不起&#xff0c;而且出乎意料。但它是如何做到的&#xff1f;为什么它能发挥作用&#xff1f;我在这里的目的是大致介绍一下 ChatGPT 内部的情况&#xff0c;然后探讨一下为什么它能很好地生成…

Python采集二手房源数据信息并做多线程

前言 嗨喽~大家好呀&#xff0c;这里是魔王呐 ❤ ~! 目录标题 前言环境使用:模块使用:代码展示多线程 尾语 &#x1f49d; 环境使用: Python 3.8 Pycharm 模块使用: requests >>> pip install requests 数据请求模块 parsel >>> pip install parsel 数据…

详述:冒泡排序

一、接下来讲解一下c语言中比较简单的排序方法&#xff1a;冒泡排序 1.冒泡排序的核心思想&#xff1a;是两两相邻的元素进行比较 动画演示&#xff1a; 应用冒泡排序需要明确2点&#xff1a; 1.需要进行多少趟冒泡排序 2.每趟冒泡排序&#xff0c;需要比较的对数 二、代码实…

发布 Copilot Chat Sample App

我们很高兴为您介绍 Semantic Kernel 的 Copilot Chat Sample App&#xff01;借助此应用程序&#xff0c;开发人员可以使用自然语言处理、语音识别和文件上传等高级功能轻松构建自己的聊天机器人。通过利用基于 LLM 的 AI&#xff0c;您可以通过 Semantic Kernel 使用您自己的…

LayerZero有何发展潜力?空投热潮和大额融资双重加持

前言 近期Arbitrum的如愿空投再次点燃了市场「刷空投」的热情&#xff0c;除了ZK系的zkSync、Starknet及Scroll&#xff0c;也有部分用户将注意力投向了估值30亿美元的LayerZero。而 LayerZero刚刚完成的1.2亿美元B轮融资也让其市场热度持续攀升&#xff0c;在「空投热潮」及「…

【1++的Linux】之Linux常见指令(二)

&#x1f44d;作者主页&#xff1a;进击的1 &#x1f929; 专栏链接&#xff1a;【1的Linux】 文章目录 一&#xff0c;man指令二&#xff0c;cp指令三&#xff0c;mv指令四&#xff0c;cat指令五&#xff0c;more指令六&#xff0c;less指令七&#xff0c;head与tail指令八&am…

【免交互】

目录 一、免交互1.1、语法格式1.2、命令演示1、多行写入文件内容2、多行注释 二、Expect2.1、基本命令2.2、脚本操作 一、免交互 1、使用I/O重定向的方式将命令列表提供给交互式程序或命令&#xff0c;比如 ftp、cat 或 read 命令。 2、是标准输入的一种替代品可以帮助脚本开发…

从C语言到C++⑩(第四章_模板初阶+STL简介)如何学习STL

目录 1. 泛型编程 1.1 函数重载弊端 1.2 泛型编程概念 2. 函数模板 2.1 函数模板的概念 2.2 函数模板格式 2.3 函数模板原理 2.4 函数模板实例化 2.4.1 隐式实例化 2.4.2 显式实例化 2.5 模板参数的匹配原则 3. 类模板 3.1 类模板的定义 3.2 类模板实例化 4.…

David Silver Lecture 7: Policy Gradient

1 Introduction 1.1 Policy-Based Reinforcement Learning 1.2 Value-based and policy based RL 基于值的强化学习 在基于值的 RL 中&#xff0c;目标是找到一个最优的值函数&#xff0c;通常是 Q 函数或 V 函数。这些函数为给定的状态或状态-动作对分配一个值&#xff0c;表…

【JAVAEE】JUC(java.util.concurrent)的常见类

目录 1.Callable接口 1.1简介 1.2代码演示 1.3Runnable与Callable的区别 2.ReentrantLock 2.1ReentrantLock的常用方法 2.2ReentrantLock的代码演示 2.3ReentrantLock和synchronized的区别 3.Semaphore信号量 3.1概念 3.2代码演示 4.CountDownLatch 4.1概念 4.2代…