高可用设计是互联网系统架构的基础之一,以天猫双十二交易数据为例,支付宝峰值支付次数超过 8 万笔。你们设想一下,若是这个时候系统出现不可用的状况,那后果将不可想象。
而解决这个问题的根本就是服务层的高可用。缓存
众所周知,服务层主要用来处理网站业务逻辑的,是大型业务网站的核心。好比下面三个业务系统就是典型的服务层,提供基础服务功能的聚合安全
业务发展初期主要以业务为导向,通常采用 「ALL IN ONE」的架构方式来开发产品,这个阶段用一句话归纳就是 「糙猛快」。当发展起来以后就会遇到下面这些问题服务器
遇到这些问题,主要仍是经过「拆」来解决微信
具体拆的方式,主要根据业务领域划分单元,进行垂直拆分。拆分开来的好处很明显,主要有如下这些:网络
对于业务逻辑服务层,通常会设计成无状态化的服务,无状态化也就是服务模块只处理业务逻辑,而无需关心业务请求的上下文信息。因此无状态化的服务器之间是相互平等且独立的。架构
只有服务变为无状态的时候,故障转移才会变的很轻松。一般故障转移就是在某一个应用服务器不能服务用户请求的时候,经过负责均衡的方式,转移用户请求到其余应用服务器上来进行业务逻辑处理并发
通常网站服务都会有主调服务和被调服务之分。超时设置就是主调服务在调用被调服务的时候,设置一个超时等待时间 Timeout。主调服务发现超时后,就进入超时处理流程。运维
超时设置的好处在于当某个服务不可用时,不至于整个系统发生雪崩反应。异步
通常请求调用分为同步与异步两种。同步请求就像打电话,须要实时响应,而异步请求就像发送邮件同样,不须要立刻回复。分布式
这两种调用各有优劣,主要看面对哪一种业务场景。好比在面对并发性能要求比较高的场景,异步调用就比同步调用有比较大的优点,这就比如一我的不能同时打多个电话,可是能够发送不少邮件。
那咱们何时该采用异步调用?
其实主要看业务场景,若是业务容许延迟处理,那就采用异步的方式处理
那咱们该怎么实现异步调用呢?
一般采用队列的方式来实现业务上的延迟处理,好比像订单中心调用配送中心,这种场景下面,业务是能接受延迟处理的。
那消息队列主要有哪些功能呢?
那到底有多少种队列呢?其实主要看处理业务的范围大小
同时,技术上来说,消息队列通常分为两种模型:Pull VS Push
其中 Pull 模式能够控制消费速度,没必要担忧本身处理不了消息,只须要维护队列中偏移量 Offset。因此对于消费量有限而且推送到队列的生产者不均匀的状况下,采用 Pull 模式比较合适。
Push 比较适合实时性要求比较高的状况,只要生产者消息发送到消息队列中,队列就会主动 Push 消息到消费者,不过这种模式对消费者的能力要求就提升不少,若是出现队列给消费者推送一些不能处理的消息,消费者出现 Exception 状况下,就会再次入队列,形成消费堵塞的状况。
不过互联网业界比较成熟的队列主要以采用 Pull 模式为主,像 Kafka、RabbitMQ(两种方式都支持)、RocketMQ 等
什么是幂等设计呢?
其实很简单,就是一次请求和多个请求的做用是同样的。用数学上的术语,便是 f(x) = f(f(x))。
那咱们为何要作幂等性的设计呢?主要是由于如今的系统都是采用分布式的方式设计系统,在分布式系统中调用通常分为 3 个状态:成功、失败、超时。
若是调用是成功或者失败都没关系,由于状态是明确和清晰,可是若是出现超时的状况,就不知道请求是成功仍是失败的。
若是出现这种状况,咱们该怎么办呢?通常采起重试的操做,从新请求对应接口。若是请求接口是 Get 操做的话,那到还好,由于请求屡次的效果是同样的。可是若是是 Post 、Put 操做的话,就会形成数据不一致,甚至数据覆盖等问题。
举个例子:在支付收银台页面进行支付的时候,由于网络超时的问题致使支付失败,这个时候咱们都会再进行一次支付操做,可是当支付成功后,发现你的帐户余额被减了 2 次,这个时候内心确定很不爽,内心都要开始骂娘了...
形成这个问题的关键是:网络超时后,不知道支付是什么状态?成功仍是失败呢?因此说幂等性设计是必须的,尤为在电商、金融、银行等对数据要求比较高的行业中。
通常在这种场景下咱们该怎么解决呢?
服务降级主要解决资源不足和访问量过大的问题,好比电商平台在双11、618 等高峰时候采用部分服务不提供访问,减小对系统的影响。
那降级的方式有哪些呢?
刚刚说了降级的方式,那咱们操做降级的时候有哪些注意点呢?
总结一下今天分享的主要内容
全部好的架构设计首要的原则并非追求先进,而是合理性,要与公司的业务规模和发展趋势相匹配,任何一个公司,哪怕是如今看来规模很是大的公司,好比 BAT 之类,在一开始,其系统架构也应简单和清晰的。
但随着业务范围不断扩充,业务规模不断扩大,系统渐进复杂和庞大,让全部系统都遇到高可用的问题。那咱们该如何避免相似的问题,构建高可用系统呢?
为此我特地写了一个专栏《带你玩转高可用》,将多年来在百度和沪江的架构设计实战经验,集结成这个专栏。
本专栏总共包含 15 篇文章,分红三大模块详细解释高可用架构的相关知识:
专栏每周都会更新,持续 64 天。在这将近 2 个月内,我会带着你们去全面了解高可用架构的方方面面,同时会将遇到的这些问题和对应的解决方案抛出来,但愿你们不要重复我遇到过的坑。同时也期待你们提出有意思的问题。
专栏地址:带你玩转高可用