注册中心与CAP理论
Consistency一致性
Availability可用性
Partition tolerance 分区容错性
分区容错性:遇到某节点或网络分区出现故障时,仍然能够对外提供满足一致性和可用性的服务
,例如X和Y节点出现故障,但仍然可以很好的对外提供服务。
CAP的取舍
满足CA,舍弃P这就意味着系统不是分布式,因为分布式就是把功能分开部署到不同的服务器
满足CP舍弃A,意味着系统可能在一段时间内访问失效,不会出现数据不一致的情况
满足AP舍弃C,意味着系统在并发访问的时候可能会出现数据不一致的情况。放弃一致性并不是完全不需要数据一致性,而是放弃数据的强一致性,而保留数据的最终一致性,能够承诺的是,经过一个时间窗口,数据最终会达到一个一致性的状态.
事实证明,分布式系统,为了避免单点故障,只能从CP和AP中根据业务场景选择一种。
Eureka :AP,无主备节点之分,一个节点挂了会自动切换到其他节点,实现去中心化,优先保证可用性。
consul:CP原则,Consul的Raft协议要求必须过半数的节点都写入成功才能认为注册成功,在Leader挂掉后, 重新选取Leader之前,服务不可用。
zookeeper:CP,搭建集群的时候,如果某个节点失效,会进行leader选举,或者半数以上节点不可用则无法提供服务。因此可用性无法满足,zk使用paxos算法保证数据一致性
容错与隔离
进程隔离
进程是操作系统中重要的隔离机制,每个进程都有独立的地址空间,提供操作系统级别的保护区,一个进程的出错不会影响到别的进程,一个应用出错也不会对其他应用产生负作用。
微服务的最佳载体是容器,容器的本质就是一个进程。
线程隔离
进程之间虽然有较好的隔离性,但进程之间交互需要跨进程边界,进程在数据共享方面存在数据传输的开销。
多线程并发编程模式可以最大限度提高系统并行度,线程是操作系统最小的调度单元,可以更好的利用多处理器的优势。
线程隔离主要指线程池的隔离,在应用系统内部,将不同请求分类给不同的线程池,当某个服务出现故障,可以根据预先设定的熔断策略阻断线程池的运行。
雪崩效应
基础服务故障导致级联故障的现象称为雪崩效应。雪崩效应描述的是服务生产者不可用导致消费者不可用,并把不可用逐渐放大的过程。
例如一个电商平台的下单场景,会经过如下链路 APP客户端-Api网关-账单服务-支付服务-库存服务,但是在错综复杂的网络中各式各样的问题都会造成系统异常,难免有些请求会失败,雪崩效应就此产生。
服务降级和服务熔断
降级和熔断的最终效果都是为了保护系统,防止系统整体崩溃,
服务降级一般指服务器压力剧增时,根据业务场景使用情况和流量,对一些服务和页面有策略的不处理或用一种简单的方式处理,从而释放服务器资源保证核心业务的正常运行。
服务熔断是应对雪崩效应的微服务链路保护机制,当调用链路的某个微服务不可用,或者响应时间太长时,会进行服务熔断,不再有该节点微服务的调用,快速返回错误的响应信息。当检测到该节点微服务恢复正常后,恢复调用链路。
两者之间还是有明确的区别
- 触发条件区别
熔断是自动触发的,降级除了自动触发,还可以根据系统预先设置的代码逻辑进行降级。 - 分级的差别
熔断通常依赖系统整体框架处理逻辑,每个微服务都需要无差别的具备熔断的特性,降级需要针对业务的优先级和重要性进行分级。对于核心业务,优先级别较高,对于核心系统下游的非核心业务,如果是弱依赖关系,级别可以相对降低。但是如果他们具有强依赖关系,那么非核心业务也会升级为核心业务。