整理了下架构设计中需要理解的概念和词汇,熟悉了这些,才能在日常的系统设计上游刃有余,还能用来装逼
集群
单机时代早已经过去了,现在一个服务部署起码都要两台机器或者以上,一方面是为了容灾,一方面单台服务器的处理能力总是有上限的,这类多台服务器对外提供一个服务的方式称为集群,集群中的每一台服务器称为节点,每个节点提供的服务是一样,同样的代码部署多台机器,从而极大提升整体服务的处理能力。
主从热备
有时候,其实你只需要一台服务器来做一些全局性的业务处理,例如定时任务、每日奖励发放(数据量小的情况)啊啊等等,部署多台服务器没有什么意义,反而还要注意幂等性、互斥等,凭空增加了复杂度。
但是,你又不得不部署多台机器,因为万一单台机器挂了呢,那任务没跑、奖励没发,肯定就是线上事故了。
一般这种,我们都会采用主从热备的部署方式,它是对于单台服务器的一种容灾手段,防止单台服务器挂掉无法提供服务。
主从热备的实现方式有双写机制、主从同步、动态选举等等,每一个概念都是非常庞大的学问。
分布式系统
分布式系统通过将业务功能拆分成独立的子系统,实现了请求的分散处理,例如登录请求路由到登录服务,关注请求路由用户关系服务等等,每个子系统通过网络来进行通信。
这种设计提高了系统的灵活性和扩展性,同时也带来了网络通信和数据一致性的挑战。
分布式集群
前面说了集群和分布式系统,其实这两个概念加起来就是分布式集群,即:分布式系统+集群=分布式集群,好像有点扯,但这是真的…
这样的好处在于针对每一个子系统你可以个性化配置它的集群数量,例如登录子系统量比较大,那就部署的服务器搞多一点,其他的子系统不是核心系统,那就搞个两台能备灾就好了。
平行扩容
集群中的每一台服务器称为节点,增加节点的方式称为平行扩容,一般来讲,业务中关键路径,例如登录、支付、用户资料等等,必须支持动态的平行扩容。
你想想,哪一天业务搞活动,登录请求暴涨,你肯定要动态扩容啊,总不能说没法扩容,或者等等,我先把服务停了才能扩容。
服务发现
问一个问题,新的服务节点加到集群中,请求是如何将流量路由到这台新节点上的?
答案就是服务发现。节点上线需要注册,告知路由/网关层面节点的IP和端口。
负载均衡
在集群中,负载均衡就是集群的各个节点以什么样的方式来尽可能的平摊所有请求。
常见的负载均衡方式有:
- 轮询
- 随机
- 加权轮询
- 哈希映射
缓存
缓存是很常见的一种技术,主要目的是:
- 降低接口耗时
- 避免过多的请求打到后面的服务或者数据库,给它们造成太大的压力
缓存能提高用户体验,但是引入缓存会增加一些复杂度,例如用户都更新昵称头像了,你这还缓存着旧的昵称头像,这就容易被投诉对吧。
缓存的策略一般有:
- 全缓存
- 多级缓存
- LRU缓存
- LFU缓存
- 分布式缓存
- 等等
一致性哈希
举个例子,在分布式缓存系统中,你肯定有多个缓存节点,每个节点存储一部分数据,整体就是全量的数据,但是呢,现在需要你增加、减少一些节点,那就设计到数据的迁移,这个过程耗时越久,造成的影响越大,中间会造成大量的缓存失效,为了避免这样的问题,需要解决数据与节点之间的映射关系。
想象一下,你有一个巨大的图书馆,里面有很多书架。每个书架都有一个编号,我们称之为“哈希值”。你的任务是将成千上万本书分配到这些书架上。每本书都有一个书名,我们需要根据书名来决定它应该放在哪个书架上。
-
简单哈希:如果我们简单地用书名的首字母来决定书架编号,比如“A”开头的书都放在编号1的书架上,这会导致编号1的书架非常拥挤,而其他书架可能很空,这就是负载不均衡。
-
一致性哈希的引入:为了解决这个问题,我们引入了一致性哈希。我们将所有的书架编号放在一个大圆环上,编号是顺序排列的。现在,我们用书名的首字母和第二个字母的组合来计算一个哈希值,这个值决定了书在圆环上的位置。
-
数据定位:每本书根据它的哈希值,会被放置在它之后的第一个书架上。如果哈希值超过了最后一个书架的编号,我们就从圆环的开始位置继续找。
-
动态调整:假设我们的图书馆需要扩展,增加了新的书架。在一致性哈希中,我们只需要调整那些新书架前后的书的位置,其他书保持不变。这样,大部分书都不需要移动,我们大大减少了工作量。
-
虚拟节点:为了使书架的负载更加均匀,我们可以为每个实际书架分配多个编号,就像是在圆环上复制了这个书架几次。这样,即使有些书架因为编号的原因可能会稍微拥挤一些,但整体上书架的负载会更加平衡。
一致性哈希就像是在图书馆里用一种特殊的方法来放置和管理书籍,即使图书馆的规模变化,我们也能保持书籍的有序存放,并且尽量减少因调整带来的工作量。
CAP理论
CAP理论是什么?
你有三个朋友,分别是C、A和P,他们分别代表CAP理论中的三个特性:
- Consistency(一致性):C代表的是一致性,意味着当你问C一个问题时,无论何时何地,他都会给你相同的答案。
- Availability(可用性):A代表的是可用性,意味着当你问A一个问题时,她总是在那里,可以立即回答你的问题。
- Partition Tolerance(分区容错性):P代表的是分区容错性,意味着即使C和A之间因为某些原因无法交流(比如电话坏了),P仍然能够独立地回答你的问题。
CAP理论的核心观点
现在,这里有一个重要的规则:C、A和P三个朋友,你不能同时和他们三个都在一起。这就是CAP理论的核心,即在任何分布式系统中,你只能选择其中的两个特性,而不能同时拥有全部三个。
为什么只能选择两个?
-
如果选择CA(一致性和可用性):你只能和C与A在一起,这意味着你放弃了P的分区容错性。在这种情况下,如果C和A之间的通信出现问题,他们将无法回答你的问题,因为他们需要彼此同步信息。
-
如果选择AP(可用性和分区容错性):你选择和A与P在一起,这意味着你放弃了C的一致性。在这种情况下,即使C和A之间的通信出现问题,A和P仍然可以独立地回答你的问题,但答案可能不一样。
-
如果选择CP(一致性和分区容错性):你选择和C与P在一起,这意味着你放弃了A的可用性。在这种情况下,C和P会确保给你一致的答案,但当他们之间的通信出现问题时,他们可能需要一些时间来同步信息,这期间你无法得到答案。
一般来讲,分区容错性是一个基本要求,只能在一致性和可用性之间做权衡。
幂等性
这个很简单,就是同样的请求,请求一次和请求多次对资源的影响是一致的。
例如,发奖失败了,再疯狂重试,没有幂等性那可能就会给用户发多次奖励。