文章目录
一、架构设计与非功能质量
架构设计:软件架构方法论中一般将架构设计分为三个阶段
需求分析和整理:
- 梳理所有用例和场景,并抽象出系统面向的用户和对象,梳理对于每个用户和角色应该提供的功能需求、非功能需求和限制。
- 非功能需求包括:高可用性、高性能、可伸缩、可扩展等
- 然后对功能性需求和非功能性需求进行整理,识别核心需求和特色需求
- 最后以核心需求和特色需求为根本来展开架构设计。
概要设计
- 对整个系统进行模块划分,并定义良好的模块之间的关系和交互。
详细设计
- 通常会使用多视图的方法来描述系统的架构,多视图包括:数据视图、逻辑视图、开发视图、进程视图、物理视图、性能视图、安全视图等。
互联网架构权衡分析方法(Architecture Tradeoff Analysis Method,ATAM)是评价软件架构的一种综合且全面的方法,不仅可以揭示架构满足特定质量目标的情况,而且可以使我们更清楚地认识到质量与目标之间的制约和权衡。能够在项目开始实施之前评估架构是否能够满足这些非功能质量的方法论。
二、全面的非功能质量需求
概述:
核心非功能质量指标
- 高性能:运行效率高、性价比高
- 可用性:持续可用性,缩短宕机时间、出错恢复、可靠性
- 可伸缩性:垂直伸缩、水平伸缩
- 可扩展性:可插拔、组件重用
- 安全性:数据安全、加密、熔断、防攻击
其他非功能质量指标
- 可监控性:快速发现、定位和解决
- 可测试性:可灰度、可预览、可Mock、可拆解
- 鲁棒性:容错性、可恢复性
- 可维护性:易于维护、监控、运营和扩展
- 可重用性: 可移植性、解耦
- 易用性:可操作性
具体指标
应用服务器
- 部署结构指标:负载均衡策略、高可用策略、IO模型(NIO/BIO)、线程池模型、线程数量、业务混合部署
- 容量和性能指标:请求量/天 、各接口的访问峰值、平均的请求响应时间、最大的请求响应时间、在线的用户量、请求的大小、网卡的I/O流量、磁盘的I/O负载、内存的使用情况、CPU的使用情况
- 其他相关指标:请求的内容是否包含大对象、GC收集器的选型和配置
数据库
- 部署结构指标:复制策略、失效转移、容灾策略、归档策略、读写分离策略、分库分表(分片)策略、静态数据和半静态数据是否使用缓存、有没有考虑缓存穿透并压垮数据库的情况、缓存失效和缓存数据预热策略
- 容量和性能指标:当前的数据容量、每天的数据增量(预估容量)、每秒的读峰值、每秒的写峰值、每秒的事务量峰值
- 其他相关指标:查询是否走索引、有没有大数据量的查询和范围查询、有没有多表关联,关联是否用到索引、有没有使用悲观锁,是否可以改造成乐观锁,是否可以利用数据库内置行级锁、事务和一致性级别、使用的JDBC数据源类型及连接数等配置、是否开启JDBC诊断日志、有没有存储过程、伸缩策略(分区表、自然时间分表、水平分库分表)、水平分库分表实现方法(客户端、代理、NoSQL)
缓存
- 部署结构指标:复制模型、失效转移、持久策略、淘汰策略、线程模型、预热方法、哈希分片策略
- 容量和性能指标:缓存内容的大小、数量、过期时间、缓存的数据结构、每秒的读峰值、每秒的写峰值
- 其他相关指标:冷热数据比例、是否有可能发生缓存穿透、是否有大对象、是否使用缓存实现分布式锁、是否使用缓存支持的脚本(LUA)、是否避免了Race Condition、缓存分片方法(客户端、代理、集群)
消息队列
- 部署结构指标:复制模型、失效转移、持久策略
- 容量和性能指标:每天平均的数据增量、消息持久的过期时间、每秒的读峰值、每秒的写峰值、每条消息的大小、平均延迟、最大延迟
- 其他相关指标:消费者线程池模型、哈希分片策略、消息的可靠投递、消费者的处理流程和持久机制
三、典型的技术评审提纲
现状
- 业务背景:项目名称、业务描述
- 技术背景:架构描述、当前的系统容量、当前系统调用量的峰值,最大和最小的请求响应时间
###需求 - 业务需求:要改造的内容、要实现的新需求
- 性能需求:预估系统容量、预估系统调用量的峰值,最大和最小的请求响应时间、其他非功能质量(安全性、可伸缩性等)
方案描述
- 概述:一句话概括方案的亮点,例如:双写、迁移、主从分离、分库分表、扩容、归档、接口改造等
详细说明:中间件架构、逻辑架构、数据架构、异常处理、容灾策略、灰度发布、上线方案、回滚方案等
性能评估:单机并发量、单机容量、单机吞吐量的峰值、预估资源数量、伸缩方式、要使用的资源数量
方案的优缺点:列出方案的优缺点,优缺点要具有确定性,要量化和有明确的目标和结果
方案对比
- 选择倾向的方案,并给出选择这种方案的理由
风险评估
- 标识所选方案的风险,提出此风险发生时的应对策略,例如上线失败时的回滚策略
工作量评估
- 描述使用所选方案时需要做的具体工作,并评估开发、测试等细化任务需要的时间,形成可实施的任务计划表,计划表一般从项目计划和人员分配两个角度来管理项目,推荐采用简单的Excel表,以减少工具使用和学习的曲线及成本。
四、性能和容量评估
量级评估标准:
通用标准
- 容量:按照峰值5倍进行冗余计算
- 用户的常用地址容量:按照30年计算
- 数据物流订单的容量:时效性较强,按照3年计算
- 第三方物流查询接口:吞吐量为5000/s
MySQL:
- 单端口读:1000/s
- 单端口写:1000/s
- 单表容量:5000万条
Redis:
- 单端口读:40000/s
- 单端口写:40000/s
- 单端口内存容量:32GB
Kafka:
单机读:30000/s
单机写:5000/s
应用服务器:请求量的峰值:5000/s
五、性能评估参考标准
常用的应用层性能指标参考标准(使用PC X86桌面机器的经验值)
通用标准:
- 容量按照峰值的5倍冗余计算
- 分库分表后的容量一般可存储30年的数据
- 第三方查询接口吞吐量为5000/s
- 单条数据库记录占用大约1KB的空间
MySQL
- 单端口读:1000/s
- 单端口写:1000/s
- 单表容量:5000万条
Redis
- 单端口读:40000/s
- 单端口写:40000/s
- 单端口内存容量:32GB
Kafka
- 单机读:30000/s
- 单机写:5000/s
DB2
- 单机读峰值:20000/s
- 单机写峰值:20000/s
- 单表容量:1亿条数据
常用的系统性能指标参考标准
寄存器和内存
- 寄存器、L2、L3、内存、分支预测失败、互斥量加锁和解锁等耗时为纳秒级别
- 内存随机读取可达30万次/s,顺序读取可达500万次/s
- 内存每秒可以读取GB级别的数据
- 读取内存中1MB的数据为250ns,为亚毫秒级
硬盘I/O
- 普通的SATA机械硬盘IOPS能达到120次/s
六 性能测试方案的设计与实践
略
七、有用的压测工具
- ab:针对HTTP实现的服务进行性能压测的工具,可以用来测试一切通用的HTTP服务器的性能
- jmeter:apache 基于java的性能压力测试工具,用于对java开发的软件做压力测试,可以用来测试静态和动态资源;可以用于对服务器、网络或对象模拟巨大的负载,在不同类别的压力下测试其强度并分析整体性能,还可以对应用程序做功能测试和回归测试,允许使用正则表达式创建建言
- mysqlslap:是MySQL自带的一款性能压测工具,通过模拟多个并发客户端访问MySQL来执行压力测试,同时提供了详细的数据性能报告。此工具可以自动生成测试表和数据,并且可以模拟读、写、混合读写、查询等不同的使用场景,也能够很好地对比多个存储引擎在相同环境的并发压力下的性能差异 。
- sysbench:是一款开源的多线程性能测试工具,可以执行CPU/内存/线程/IO/数据库等方面的性能测试。
- dd:可以用于测试磁盘顺序I/O的存取速度。在应用场景中,打印日志通常表现为顺序I/O的写操作,二数据库查询多为磁盘的随机I/O。
- LoadRunner:是惠普的一款商业化性能测试工具,通过模拟成千上万的用户同时对目标系统实施高并发负载,并实时检测系统资源的使用情况及表现的性能指标等方式来发现和定位问题,是一款专业的性能和负载压力测试工具,适用与测试任何类型的应用程序,并且具有简单易用、功能齐全且支持交互UI的测试等优点。
- hprof:JDk自带的分析内存堆和CPU使用情况的命令行工具,实际上,hprof并不是一个可执行的命令,而是一个JVM执行时动态加载的本地代理库,加载后运行在JVM进程中,通过在JVM启动时配置不同的选项,可以让hprof监控不同的性能指标,包括堆、CPU使用情况、栈和线程等。hprof会生成二进制或者文本格式的输出文件,对二进制格式的输出可以借助命令行工具HAT进行分析,开发者可以通过分析输出文件来找到性能瓶颈。
来源:CSDN
作者:嗨,人
链接:https://blog.csdn.net/qq_33670157/article/details/104569059