性能指标
响应时间、并发用户数、吞吐量、QPS (每秒查询率)
- 吞吐量的计算公式:
业务角度看,吞吐量可以用:请求数/秒、页面数/秒、人数/天、处理业务数/小时 等单位来衡量
网络角度看,吞吐量可以用:字节/秒 来衡量
- QPS = 日PV /(60*60*24),侧重于衡量查询操作的频率
峰值QPS = (日PV*80%)/(60*60*24*20%)
如何提升系统抗并发的能力
方向 | 方法 | 具体措施 |
---|---|---|
垂直扩展:提升单机处理能力 | 增强单机硬件性能 | 增加CPU核数如32核,升级更好的网卡如万兆,升级更好的硬盘如SSD,扩充硬盘容量如2T,扩充系统内存如128G; |
提升单机架构性能 | 使用Cache来减少IO次数,使用异步来增加单服务吞吐量,使用无锁数据结构来减少响应时间; | |
水平扩展:线性扩充系统性能 | 反向代理层水平扩展 | 反向代理层可以通过“DNS轮询”的方式来进行水平扩展; |
站点层的水平扩展 | 站点层可以通过nginx来进行水平扩展; | |
服务层的水平扩展 | 服务层可以通过服务连接池来进行水平扩展; | |
数据层的水平扩展 | 数据库可以按照数据哈希的方式来进行水平扩展; |
高并发时如何保证幂等性
幂等性是指接口可重复调用,多次调用情况下,得到的结果是一致的。
幂等性虽然复杂化了业务实现且降低了执行效率,但为了保证系统的正确性,是非常必要的。
分层 | 方法 | 具体措施 |
---|---|---|
应用层 | token | |
分布式锁 | 要点:要求不能并发执行,可以在流程执行之前根据某个标志获取分布式锁,其他进程执行时获取锁就会失败,即同一时间该流程只能有一个执行成功,执行完成后,释放分布式锁。 | |
状态机 | 单据或任务会涉及到状态机,就是业务单据的状态在不同情况下会发生变更,如果状态机已处于下一个状态,此时来了上一状态的变更,是不能够变更的,这样就保证了有限状态机的幂等。 | |
synchronized | 同步执行,高并发有性能要求时勿用。 | |
数据层 | 唯一索引 | 防止新增脏数据。要点:唯一索引或唯一组合索引来防止新增数据存在脏数据。 |
乐观锁 | 乐观锁只是在更新数据那一刻锁表,其他时间不锁表,所以相对于悲观锁,效率更高。乐观锁的实现方式多种多样可以通过version或者其他状态条件。 | |
悲观锁 | 获取数据的时候加锁获取。select * from table_xxx where id='xxx' for update; 注意:id字段一定是主键或者唯一索引,不然是锁表,会死人的悲观锁使用时一般伴随事务一起使用,数据锁定时间可能会很长,根据实际情况选用; | |
select+insert | 简单的处理方法是,先查询关键数据,判断是否已经执行过,再进行业务处理。注意:高并发流程不要用这种方法。 |
高可用思维导图
-
失效自动转移
事先做好备份和冗余,当事故来临时,系统能自动转移请求到可用的服务上的一种机制。
- 限流自动降级
限流是提前设置好请求的QPS阀值,当请求量超过阀值时,则拒绝处理及后续资源请求,直接返回或按预设处理。
降级是在服务器压力剧增的情况下,把与核心业务无关的外围服务做降级处理,节省系统资源占用,保证核心业务的性能和稳定。降级策略包括超时降级、失败次数降级、故障降级。
- 熔断自动隔离
当系统链路中某个微服务出现不可用或者响应时间太长时,系统会自动熔断该节点微服务的调用,快速返回错误信息。当检测到该节点微服务调用响应正常后,系统可自动恢复该微服务的调用。
-
备好应急预案
上线前做好应急预案,可以避免上线后,出现问题时的手足无措。
-
监控预警到位
全方位的立体化监控和预警机制,可以帮助我们快速地定位问题,监控系统运行状况。
-
结构清晰,易于维护
层次分明且结构清晰的程序架构,也一定会助力系统稳定性,方便开发人员快速定位和修复问题。