《人人都是架构师:分布式系统架构落地与瓶颈突破》。书主要介绍作者遇到的一些实际场景,提供了处理一些典型场景的思路,书中介绍了许多开源软件,但代码和一些细节比较少。分布式入门书,开拓了视野。
大流量消锋/限流的常规手段
1. 扩容
使用集群技术对服务器进行扩容,可以很好的提升系统整体的并行处理能力。
2. 动静分离
静态数据可以放在CDN上来加速系统的响应速度
3. 缓存
合理使用缓存的读写操作来减轻数据库的负担
4. 服务降级
当流量太大时,可以选择牺牲部分功能的可用性来换取核心功能的正常服务。
5. 使用限流算法
令牌桶算法
每秒会有r个令牌被放入桶中,桶的容量时固定不变的,且最多允许存放b个令牌,如果桶满了,新添加的令牌会被丢弃。当一个n字节的请求包到达时,将消耗n个令牌,然后再发送该数据包。若桶中可用令牌数小于n,该数据包就会被限流。(抛弃或者被缓存)
漏桶算法
相当于一个桶缓存着外界的请求,当缓存的请求超过了桶的大小,那么请求就被限流。利用这个缓存的桶,可以实现请求按照固定的速率施加到服务上。
计数器算法
设定一个单位时间内可以被请求的次数,单位时间内超过该次数的请求将被限流。
使用堆外内存的好处
减少GC次数或者降低暂停时间
可以扩展和使用更大的内存空间
省去物理内存和heap之间的数据复制步骤
数据库的水平分表和垂直分表
水平分表是将一个数据量很大的表,按照某个属性的特征,拆分成许多小表(每张表的字段是相同没变的),用来提高数据库的并发查询和更新效率。
垂直分表是将一个存在很大字段值的表中的单独的一个很大的字段分离出来,用来提高查询和更新效率。
在分区和分表之后(很大可能数据就不在同一台物理机上),涉及到全局自增字段问题,解决方案是
单独一个数据表存储自增字段,所有的区和表的自增id由该表决定。同时可以获取的时候缓存一段sequenceID,不用每次都去访问该数据表。
利用物理机器IP,数据库、表划分自增id范围,在指定范围内生成sequence,可以保证全局唯一性。
SQL和NoSQL的业务场景
NoSQL出现的时机;
SQL无法满足海量数据、数据高并发、高可扩展性和高可用性的管理需求
现代互联网应用通常不要求严格的读写实时性,不需要严格的数据库事务,对响应速度要求更高
关系数据库
优势:以完善的关系代数理论作为基础,有严格的标准,支持事务 ACID四性,借助索引机制可以实现高效的查询。技术成熟,有专业 公司的技术支持
劣势:可扩展性较差,无法较好支持海量数据存储,数据模型过于死板、无法较好支持Web2.0应用,事务机制影响了系统的整体性能等
NoSQL数据库
优势:可以支持超大规模数据存储,灵活的数据模型可以很好地支持 Web2.0应用,具有强大的横向扩展能力
劣势:缺乏数学理论基础,复杂查询性能不高,大都不能实现事务强一致性,很难实现数据完整性。技术尚不成熟,缺乏专业团队的技术支持,维护较困难等