《大型网站技术架构:核心原理与案例分析》笔记
高可用性
什么是可用性?
可用性(Availablility)是指服务可被有效访问的特性,不是指有用性(Usability)。
能够保证服务永远可用吗?
保证服务永远可用几乎是一件不可能完成的任务。
实现高可用的手段
- 由集群提供服务,通过负载均衡手段将请求分发到具体节点上,在节点不可用时,从服务注册列表中清楚。
- 分级管理。高优先级的服务拥有更好和更多的资源。
- 超时设置。控制访问的超时,防止大量的请求即占用资源,又无法获得响应。
- 服务降级。对一些请求直接失败,防止机器负载过高导致机器崩溃,结果导致整个服务崩溃。
预发布和线上发布的区别
预发布和线上发布的唯一不同是没有配置在负载均衡服务中,所以外部无法访问预发环境的机器。
保证服务可用性的意义
工程师对应用做出性能的优化、代码的重构,但是未必能让人直观感受到,也许你的领导都不知道你做这件事情的意义何在。但是,如果你的产品出现了重大故障,那么CEO都会知道你的名字。
伸缩性
什么是伸缩性
指系统能够通过增加(减少)自身资源规模的方式增强(减少)自己计算处理事务的能力。
什么是一致性Hash
在缓存服务中,会根据用户的key将数据缓存至某个缓存节点,选择节点的过程需要用到hash值。
传统算法:将key的hash值模缓存节点数目,获得index,则该index对应的节点就是数据要缓存入的节点。这种方法的缺点是动态的添加、下线缓存节点时,会导致大量的缓存无法命中和缓存迁移。
一致性hash:构建一个长度为$2^{32}$的环,所有的缓存节点会散布到环中的某些位置上,需要缓存的数据根据key计算hash值后会映射到环中的某个位置,然后找到不小于该位置且最近的缓存节点,作为其数据存放的节点。在动态的添加缓存节点时,只有和它相邻的缓存节点中的数据受到影响。该方法的问题是,当添加节点时,会导致环上的缓存节点疏密不均,从而使得每个缓存节点上的缓存数量不均匀。
一致性hash+虚拟节点。上述问题的解决方案是在一致性hash算法的基础上,每个缓存节点会被当做多个虚拟节点分散到环中。所以在添加一个新的缓存节点时,会当做多个虚拟节点添加到环中,这样就防止环中缓存节点疏密不均的问题。
扩展性
什么是扩展性
指对现有系统影响最小的情况下,系统功能可持续扩展或提升的能力。
SOA是实现服务扩展性的一种方式
SOA(面向服务的设计架构)是将不同的业务模块划分为不同的服务,这些服务具有高内聚和低耦合的特点,通过服务发现机制,可以方便的发布新的服务以提供新的功能。
NoSQL是实现数据库扩展性的一种方式
修改关系型数据库的schema是困难的,并且对于稀疏性的数据而言,关系型数据库会浪费存储空间。而NoSQL可以提供列族来灵活的增减列属性,并且不要求每个数据都具有所有的属性。
不断上新产品是互联网公司的生存本能
互联网公司不停上新产品是其生存的本能,谁能更快更好地推出更多的新产品,谁就活得更滋润,那么工程师就要做好准备应付这种局面。
网络安全
加密技术
- 单向散列加密。对明文进行加密,加密算法固定,但是无法通过密文解密为明文。通常用于对用户密码进行加密,加密后存入数据库。即使数据库被别人获取,也无法获得用户的明文密码,也无法通过密文密码登陆用户账户。采用加盐来防止对密文的破解。如,MD5,SHA。
- 对称加密。明文的加密和密文的解密采用的都是同一个秘钥。如,DES,RC。
- 非对称加密。明文通过公钥加密,密文通过私钥解密。私钥也可以对明文加密,用公钥解密,起到数字签名的作用。如,RSA算法。
布隆过滤器
在需要过滤大量黑名单的场景中,如果采用Hash表来存储黑名单,则需要耗费很大的存储空间。布隆过滤器则可以在较小的存储空间中实现过滤功能。布隆过滤器首先申请一个固定大小的存储空间,该空间共有n个bit,初始为0,需要加入黑名单的名字通过8个函数,映射到n个bit中的8个bit中,将这些bit置为1。如果一个名字通过上述8个函数映射到的位置都被置为1,则该名字在黑名单中。使用布隆过滤器,一个名字最多只需要占用一个字节。布隆过滤器可能会误杀,因为存在名字不在黑名单中,但是由于其它黑名单中的名字,导致其映射的位置都被置为1。
架构师
什么是好的架构师
所以最好的软件项目管理不是制订计划,组织资源,跟踪修正项目进展,对成员进行激励和惩罚,而是发掘项目组每个成员的优秀潜能,让大家理解并热爱软件产品最终的蓝图和愿景。每个人都是为实现自我价值而努力,不是为了领工资而工作。
事成就了人
有些企业喜欢挖优秀的人,而不是去把自己打造成一个培养优秀人才的地方。殊不知:是事情成就了人,而不是人成就了事。指望优秀的人来帮自己成事,不如做成一件事让自己和参与的人都变得优秀。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。