CSDN|高并发,你真的理解透彻了吗?( 二 )

CSDN|高并发,你真的理解透彻了吗?
本文插图
这3个目标是需要通盘考虑的 , 因为它们互相关联、甚至也会相互影响 。 比如说:考虑系统的扩展能力 , 你会将服务设计成无状态的 , 这种集群设计保证了高扩展性 , 其实也间接提升了系统的性能和可用性 。 再比如说:为了保证可用性 , 通常会对服务接口进行超时设置 , 以防大量线程阻塞在慢请求上造成系统雪崩 , 那超时时间设置成多少合理呢?一般 , 我们会参考依赖服务的性能表现进行设置 。 2.2 微观目标再从微观角度来看 , 高性能、高可用和高扩展又有哪些具体的指标来衡量?为什么会选择这些指标呢?? 性能指标通过性能指标可以度量目前存在的性能问题 , 同时作为性能优化的评估依据 。 一般来说 , 会采用一段时间内的接口响应时间作为指标 。 1、平均响应时间:最常用 , 但是缺陷很明显 , 对于慢请求不敏感 。 比如1万次请求 , 其中9900次是1ms , 100次是100ms , 则平均响应时间为1.99ms , 虽然平均耗时仅增加了0.99ms , 但是1%请求的响应时间已经增加了100倍 。 2、TP90、TP99等分位值:将响应时间按照从小到大排序 , TP90表示排在第90分位的响应时间 ,分位值越大 , 对慢请求越敏感 。 CSDN|高并发,你真的理解透彻了吗?
本文插图
3、吞吐量:和响应时间呈反比 , 比如响应时间是1ms , 则吞吐量为每秒1000次 。 通常 , 设定性能目标时会兼顾吞吐量和响应时间 , 比如这样表述:在每秒1万次请求下 , AVG控制在50ms以下 , TP99控制在100ms以下 。 对于高并发系统 , AVG和TP分位值必须同时要考虑 。 另外 , 从用户体验角度来看 , 200毫秒被认为是第一个分界点 , 用户感觉不到延迟 , 1秒是第二个分界点 , 用户能感受到延迟 , 但是可以接受 。 因此 , 对于一个健康的高并发系统 , TP99应该控制在200毫秒以内 , TP999或者TP9999应该控制在1秒以内 。 ?可用性指标高可用性是指系统具有较高的无故障运行能力 , 可用性 = 平均故障时间 / 系统总运行时间 , 一般使用几个9来描述系统的可用性 。 CSDN|高并发,你真的理解透彻了吗?
本文插图
对于高并发系统来说 , 最基本的要求是:保证3个9或者4个9 。 原因很简单 , 如果你只能做到2个9 , 意味着有1%的故障时间 , 像一些大公司每年动辄千亿以上的GMV或者收入 , 1%就是10亿级别的业务影响 。 ? 可扩展性指标面对突发流量 , 不可能临时改造架构 , 最快的方式就是增加机器来线性提高系统的处理能力 。 对于业务集群或者基础组件来说 , 扩展性 = 性能提升比例 / 机器增加比例 , 理想的扩展能力是:资源增加几倍 , 性能提升几倍 。 通常来说 , 扩展能力要维持在70%以上 。 但是从高并发系统的整体架构角度来看 , 扩展的目标不仅仅是把服务设计成无状态就行了 , 因为当流量增加10倍 , 业务服务可以快速扩容10倍 , 但是数据库可能就成为了新的瓶颈 。 像MySQL这种有状态的存储服务通常是扩展的技术难点 , 如果架构上没提前做好规划(垂直和水平拆分) , 就会涉及到大量数据的迁移 。 因此 , 高扩展性需要考虑:服务集群、数据库、缓存和消息队列等中间件、负载均衡、带宽、依赖的第三方等 , 当并发达到某一个量级后 , 上述每个因素都可能成为扩展的瓶颈点 。
高并发的实践方案有哪些?了解了高并发设计的3大目标后 , 再系统性总结下高并发的设计方案 , 会从以下两部分展开:先总结下通用的设计方法 , 然后再围绕高性能、高可用、高扩展分别给出具体的实践方案 。 3.1 通用的设计方法通用的设计方法主要是从「纵向」和「横向」两个维度出发 , 俗称高并发处理的两板斧:纵向扩展和横向扩展 。 ? 纵向扩展(scale-up)它的目标是提升单机的处理能力 , 方案又包括:1、提升单机的硬件性能:通过增加内存、CPU核数、存储容量、或者将磁盘升级成SSD等堆硬件的方式来提升 。 2、提升单机的软件性能:使用缓存减少IO次数 , 使用并发或者异步的方式增加吞吐量 。 ? 横向扩展(scale-out)因为单机性能总会存在极限 , 所以最终还需要引入横向扩展 , 通过集群部署以进一步提高并发处理能力 , 又包括以下2个方向:1、做好分层架构:这是横向扩展的提前 , 因为高并发系统往往业务复杂 , 通过分层处理可以简化复杂问题 , 更容易做到横向扩展 。


推荐阅读