面试漫谈(十三)- 分布式集群篇

Posted by YiBo on December 20, 2020

前记

今天申通二面,竟然问我分布式,微服务的概念,我答的非常不好

什么是分布式,什么是微服务

项目架构的演变

  1. 单体架构:易于开发,部署,测试 成本低、模块耦合严重,容易互相影响
  2. 垂直架构:根据业务把项目垂直切割成多个项目 流量分担,解决了并发问题,可以针对不同系统进行优化,水平扩展方便,负载均衡,系统相互独立,互不影响。 服务之间调用硬编码,负载均衡比较复杂,监控不到位
  3. 分布式架构(SOA:Service Oriented Architecture)面向服务的架构,在垂直划分的基础上,将每个项目拆分出多个具备松耦合的服务,为了解决垂直架构的缺陷,引入dubbo:面向接口远程调用,只能容错和负载均衡,已经服务自动注册和发现。分为业务层,基础业务层,基础服务层,存储层。架构更加清晰,每个业务模块职责单一,服务应用无状态化。但是调用链路长,服务质量不可变化,下游抖动会影响上游业务
  4. 微服务架构 : 在SOA上做升华,粒度更加细致、服务注册和发现,负载均衡,熔断,链路追踪,API网关

Spring Cloud是什么

将各家公司开发的比较成熟的服务框架组合起来,通过springboot风格进行再封装,屏蔽掉了复杂的配置和实现原理

Dubbo:负载均衡 服务调用

熔断器: sentinel

网关:Spring cloud Gateway

配置中心: Nocos

为什么选择用dubbo而不是其他

目前市面上选择比较多的就是 dubbo 和 Feign

dubbo支持多种传输协议,默认是Netty Tcp,长连接,异步。负载均衡可以精确到某个服务的某个方法。自带容错机制

feign基于HTTP传输协议,短连接,不适合高并发。负载均衡是client级别的。利用熔断机制来实现容错

分布式环境下解决事务问题

image-20210104124837918

如果A系统事务提交成功了,但是B系统在提交的时候网络波动或者其他原因失败了,就会有问题

第一个阶段协调者会等待所有参与者相应才会进行下一步操作,当然第一阶段的协调者有超时机制

2pc是一种尽量保证强一致性的分布式事务,是同步阻塞的,总体效率低

  • 3PC

image-20210104130539511

引入参与者超时机制。通过预提交阶段可以减少故障恢复时候的复杂性。只做了解即可

  • TCC

    try - confirm - cancel

image-20210104131046674 对业务的侵入较大和业务紧耦合,撤销和确认操作的执行可能需要重试,因此要保证幂等

  • 消息事务
    1. 先给broker发送事务消息及半消息,对消费者不可见,然后发送成功后发送方再执行本地事务
    2. 再根据本地事务的结果broker发送commit或者rollback命令
    3. 发送方提供一个反查询接口,如果一段时间内没有收到任何操作请求,那么broker会通过反查接口判断

image-20210104124931366

可以保证:

  • 业务主动方本地事务提交失败,业务被动方不会受到消息的投递
  • 只要业务主动方本地事务执行成功,那么消息服务一定会投递消息给下游的业务被动放,并且保证业务方一定能成功消费该消息(消费成功或者失败,即最终一定会有一个最终态)