1-交易系统设计的一些原则

高并发原则

无状态

如果设计的应用是无状态的,那么应用比较容易进行水平扩展。实际生产环境可能是这样的:应用无状态,配置文件有状态。比如,不同的机房需要读取不同的数据源,此时,就需要通过配置文件或配置中心指定。

拆分

做一个大而全的系统还是按功能模块拆分系统,这个需要根据环境进行权衡。

京东秒杀系统,访问量是非常大的,而且投入的资源还是蛮充足的,在这种情况下,就可以考虑按功能拆分系统。

拆分主要有如下几种情况:

  • 系统维度
  • 读写维度
  • AOP维度
  • 模块维度

消息队列

消息队列是用来解耦一些不需要同步调用的服务或者订阅一些自己系统关心的变化。

使用消息队列可以实现服务解耦(一对多消费)、异步处理、流量削峰/缓冲等。

大流量缓冲

电商搞大促时,系统流量会高于正常流量的几倍甚至几十倍,此时就要进行一些特殊的设计来保证系统平稳度过这段时期。

扣减库存
在这里插入图片描述
交易订单系统
在这里插入图片描述

数据异构

订单分库分表一般按照订单ID进行分,如果要查询某个用户的订单列表,则需要聚合多个表的数据后才能返回,这样会导致订单表的读性能很低。此时需要对订单表进行异构,异构一套用户订单表,按照用户ID进行分库分表。另外,还需要考虑对历史订单数据进行归档处理,以提升服务的性能和稳定性。

数据来源太多,影响服务稳定性的因素就非常多了。因此,最好的办法是把使用到的数据进行异构存储,形成数据闭环,基本步骤如下:

  • 数据异构:通过如MQ机制接收数据变更,然后原子化存储到合适的存储引擎,如Redis或持久化KV存储。
  • 数据聚合:这步是可选的,数据异构的目的是把数据从多个数据源拿过来,数据聚合的目的是把这些数据做个聚合,这样前端就可以一个调用拿到所有数据,此步骤一般存储到KV存储中。
  • 前端展示:前端通过一次或少量几次调用拿到所需要的数据。

缓存银弹

在这里插入图片描述

并发化

在这里插入图片描述
如果串行获取,那么需要60ms。

在这里插入图片描述
如果并发化获取,则需要30ms,能提升一倍的性能。

高可用原则

降级

高可用服务,很重要的一个设计就是降级开关,在设计降级开关时,主要依据如下思路:

  • 开关集中化管理:通过推送机制把开关推送到各个应用
    在这里插入图片描述
  • 可降级的多级读服务:比如服务调用降级为只读本地缓存、只读分布式缓存、只读默认降级数据
    在这里插入图片描述
  • 开关前置化:如架构是Nginx→Tomcat,可以将开关前置到Nginx接入层
    在这里插入图片描述
  • 业务降级
    当高并发流量来袭,在电商系统大促设计时保障用户能下单、能支付是核心要求,并保障数据最终一致性即可。这样就可以把一些同步调用改成异步调用,优先处理高优先级数据或特殊特征的数据,合理分配进入系统的流量,以保障系统可用

限流

限流的目的是防止恶意请求流量、恶意攻击,或者防止流量超出系统峰值。
可以考虑如下思路:

  • 恶意请求流量只访问到cache。
  • 对于穿透到后端应用的流量可以考虑使用Nginx的limit模块处理。
  • 对于恶意IP可以使用nginx deny进行屏蔽。

原则是限制流量穿透到后端薄弱的应用层。

切流量

切流量是非常重要的,比如多机房环境下某个机房挂了,或者某个机架挂了,或者某台服务器挂了,都需要切流量。

  • DNS:切换机房入口。
  • HttpDNS:主要APP场景下,在客户端分配好流量入口,绕过运营商LocalDNS并实现更精准流量调度。
  • LVS/HaProxy:切换故障的Nginx接入层。
  • Nginx:切换故障的应用层。

可回滚

版本化的目的是实现可审计可追溯,并且可回滚。当程序或数据出错时,如果有版本化机制,那么就可以通过回滚恢复到最近一个正确的版本,比如事务回滚、代码库回滚、部署版本回滚、数据版本回滚、静态资源版本回滚等。通过回滚机制可保证系统某些场景下的高可用。

业务设计原则

防重设计

结算页需要考虑重复提交,还有如下单扣减库存时需要防止重复扣减库存。解决方案可以考虑防重key、防重表。而有些场景如重复支付,是因为有的电商网站同时支持微信支付、京东支付,渠道不一样是无法防止重复支付的。但是,在系统设计时,需要将支付的每笔情况记录下来。

幂等设计

在交易系统中,经常会用到消息,而现有消息中间件基本不保证不发生重复消息的消费。因此,需要业务系统在重复消息消费时进行幂等处理。还有在使用第三方支付时,第三方支付会进行异步回调,也要考虑做好回调的幂等处理。

流程可定义

如果接触过保险业务,就会发现不同保险的理赔服务是不一样的。我们在系统设计时就设计了一套理赔流程服务。而承保流程和理赔流程是分离的,在需要时进行关联,从而可以复用一些理赔流程,并提供个性化的理赔流程。

状态与状态机

在设计交易订单系统时,会存在正向状态(待付款、待发货、已发货、完成)和逆向状态(取消、退款)等,正向状态和逆向状态应该根据系统的特征来决定要不要分离存储。状态设计时应有状态轨迹,方便用户跟踪当前订单的轨迹并记录相关日志,万一出问题时可回溯问题。

另外,还有订单状态的变迁,比如待支付、已支付待发货、待收货、完成的迁移。要考虑要不要使用状态机来驱动状态的变更和后续流程节点操作,尤其当状态很多的时候使用状态机能更好地控制状态迁移。

后台系统操作可反馈

很多场景都需要反馈,比如,修改了某些内容后想预览看看最终效果,即想得到一些反馈;

还有一些是在规则系统中,希望看到这些规则在系统数据下的反馈。

因此,在设计后台系统时,需考虑效果的可预览、可反馈。

后台系统审批化

对于有些重要的后台功能需要设计审批流,比如调整价格,并对操作进行日志记录,从而保证操作可追溯、可审计。

文档和注释

一些系统是完全没有文档、代码没有注释的,完全是人传人。这将导致后来人接手很痛苦,而且对有些代码是完全不敢改动的,比如,有些代码完全是因为业务的一些特殊情况而写的,可以说没有注释是完全不懂为什么那么做的。

因此,在一个系统发展的一开始就应该有文档库(设计架构、设计思想、数据字典/业务流程、现有问题),业务代码和特殊需求都要有注释。

可以使用TOGAF企业架构设计。

备份

包括代码和人员。

代码主要提交到代码仓库进行管理和备份,代码仓库应该至少具备多版本的功能。

人员备份指的是一个系统至少应该有两名开发人员是了解的,即使其中一名离职了也不会出现新人接手之后手忙脚乱事故频发的状况。

还有一些是“核心人员”,写着系统的核心代码,被认为是“不可替代的”,这种情况也是尽可能地让他带一名兄弟一起开发核心代码(业务系统),即使离职也还是可以努力一下克服困难。

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

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

相关文章

Python(四十九)——requests和httpx

Python(四十九)——requests和httpx Python——requests和httpx获取cookie Python(四十九)——requests和httpx 1. 获取cookies1.1 requests获取cookies1.1.1 直接获取cookies1.1.2 session 获取cookies 1.2 httpx获取cookie1.3 获取Set-Cookie1.4 cookie 失效1.5 获取cookie的…

CEC2013(python):五种算法(GA、WOA、GWO、DBO、HHO)求解CEC2013(python代码)

一、五种算法简介 1、遗传算法算法GA 2、鲸鱼优化算法WOA 3、灰狼优化算法GWO 4、蜣螂优化算法DBO 5、哈里斯鹰优化算法HHO 二、5种算法求解CEC2013 (1)CEC2013简介 参考文献: [1] Liang J J , Qu B Y , Suganthan P N , et al. Prob…

3D模型如何制作透明玻璃材质

在线工具推荐: 3D数字孪生场景编辑器 - GLTF/GLB材质纹理编辑器 - 3D模型在线转换 - Three.js AI自动纹理开发包 - YOLO 虚幻合成数据生成器 - 三维模型预览图生成器 - 3D模型语义搜索引擎 1、什么是玻璃材质 在3D建模和渲染中,玻璃是一种非常常见…

Keras使用sklearn中的交叉验证和网格搜索

Keras是Python在深度学习领域非常受欢迎的第三方库,但Keras的侧重点是深度学习,而不是所以的机器学习。事实上,Keras力求极简主义,只专注于快速、简单地定义和构建深度学习模型所需要的内容。Python中的scikit-learn是非常受欢迎的…

【单调栈】LeetCode2030:含特定字母的最小子序列

作者推荐 map|动态规划|单调栈|LeetCode975:奇偶跳 涉及知识点 单调栈 题目 给你一个字符串 s ,一个整数 k ,一个字母 letter 以及另一个整数 repetition 。 返回 s 中长度为 k 且 字典序最小 的子序列,该子序列同时应满足字母 letter 出…

SpringMVC01

SpringMVC 1. 学习⽬标2. 什么叫MVC?3. SpringMVC 框架概念与特点4. SpringMVC 请求流程5. Spring MVC 环境搭建6. URL 地址映射配置7. 参数绑定8. JSON 数据开发JSON普通数组步骤1:pom.xml添加依赖步骤2: 修改配置⽂件步骤3. 注解使⽤ 1. 学习⽬标 2. 什…

【介质】DWPD 每日整盘写入次数 衡量SSD固态硬盘寿命

SSD DWPD什么意思? 经常看到厂商发布的SSD产品有DWPD这个指标,DWPD是什么意思? DWPD DWPD,(Diskful Writes Per Day),每日整盘写入次数,指在预期寿命内可每日完整写入SSD固态硬盘所有容量的次数。 也有…

树莓派,opencv,Picamera2利用舵机云台追踪特定颜色对象(PID控制)

一、需要准备的硬件 Raspiberry 4b两个SG90 180度舵机(注意舵机的角度,最好是180度且带限位的,切勿选360度舵机)二自由度舵机云台(如下图)Raspiberry CSI 摄像头 组装后的效果: 二、项目目标…

Python 中如何编写类型提示

哈喽大家好,我是咸鱼 我们知道 Python 是一门具有动态特性的语言,在编写 Python 代码的时候不需要显式地指定变量的类型 这样做虽然方便,但是降低了代码的可阅读性,在后期 review 代码的时候容易对变量的类型产生混淆&#xff0…

解决文件导出过大->java压缩zip文件--封装工具类

阿丹: 在业务逻辑中的数据存在一部分业务场景,在导出文件或者视频的时候需要将文件暂存在服务器上再上传到oss对象存储或者fastdfs中让用户来下载使用。但是出现的问题就是如果目标文件过大,文件的上传云端和下载本地就会时间拉长&#xff0c…

使用python读取EXCEL放假日历并制作订阅文件

前言 不想升级IOS,苦于找不到新的日历订阅url,小菜鸡百度来百度去发现ics这东西可以自己做一个,惊喜于看到了这篇文章--使用python获取日历信息并制作订阅文件_https: //github.com/lk-itween/calendar-CSDN博客 感谢作者大大。就想自己写一…

滑动窗口双指针

力扣 209 找出该数组中满足其总和大于等于 target 的长度最小的 连续子数组 [numsl, numsl1, ..., numsr-1, numsr] ,并返回其长度。如果不存在符合条件的子数组,返回 0 。 类似窗口滑动 j代表的是窗口的结束位置 i表示开始位置 在while循环中是寻找最…

服务器数据恢复-昆腾存储StorNext文件系统下raid5数据恢复案例

服务器数据恢复环境: 昆腾某型号存储,StorNext文件存储系统。 共有9个分别配置了24块磁盘的磁盘柜,其中8个磁盘柜存放普通数据,1个磁盘柜存放元数据。 存放元数据的磁盘柜中的24块磁盘组建了8组RAID1阵列和1组4盘RAID10阵列&#…

NCV8460ADR2G在汽车和工业应用中高压侧驱动如何破?

NCV8460ADR2G是一款完全保护的高压侧驱动器,可用于开关各种负载,如灯泡、电磁阀和其他致动器。该器件可以通过有源电流限制和高温关断针对过载情况进行内部保护。 诊断状态输出引脚提供了高温以及开关状态开路负载情况的数字故障指示。 特性:…

Nginx的location路径与proxy_pass匹配规则

location路径与proxy_pass匹配规则 路径替换总结当访问地址是 http://127.0.0.1/api/user/list注意:location后斜杆与proxy_pass后斜杆"/"问题,最好要么两者都加斜杆,要么都不加 路径替换 配置proxy_pass时,可以实现URL路径的部分…

22 Vue3中使用v-for遍历对象

概述 使用v-for遍历对象在真实的开发中比较少见,了解即可。 对象我更喜欢统一称之为字典,假如你哪天发现我在某个前端的教程中把对象叫做字典,请你知道这两个是同一个玩意儿。 所谓字典,就是一种key-value类型的结构的统称。 …

队列(C语言版)

一.队列的概念及结构 队列:只允许在一端进行插入数据操作,在另一端进行删除数据操作的特殊线性表,队列具有 先进先出 FIFO(First In First Out) 入队列:进行插入操作的一端称为 队尾 出队列:进行删除操作的一端称为…

网络安全之Linux环境配置及Linux基础知识讲解<三>

目录 一.下载安装Vmware二.下载安装Kali三.Linux目录结构四.Linux文件属性五.文件目录管理六.vim编辑器 一.下载安装Vmware Vmware官网:https://www.vmware.com 二.下载安装Kali Kali包含数百种工具,可用于各种信息安全任务,例如渗透测试、…

vue中判断应该import 哪个js或css

import Vue from vue import App from ./App.vueif (window.myFlag true) {import(./jsFile1.js).then((module) > {// 执行导入的jsFile1.js模块的代码module.default.init()}) } else {import(./jsFile2.js).then((module) > {// 执行导入的jsFile2.js模块的代码modul…

vue导出element表格,xlsx和xlsx-style生成xlsx文件并修改样式

1.下载依赖 npm install xlsx --save npm install file-saver --save npm install xlsx-style --save2.先修改xlsx-style的源码,一旦引入xlsx-style则会报错 xlsx-style使用中常见问题及解决办法: xlsx-style使用中常见问题及解决办法-CSDN博客 在\n…