分布式

234 阅读5分钟

1、为什么要使用分布式系统?为什么要拆分?

拆分成小系统有利于团队合作,每个人只需要维护自己的系统,各种代码冲突很麻烦,方便上线。

2、分布式系统如何拆分?

3、dubbo的工作原理

工作流程:

  • 1)第一步,provider向注册中心去注册

  • 2)第二步,consumer从注册中心订阅服务,注册中心会通知consumer注册好的服务

  • 3)第三步,consumer调用provider

  • 4)第四步,consumer和provider都异步的通知监控中心

4、注册中心挂了可以继续通行吗?

可以,因为刚开始初始化的时候,消费者会将提供者的地址等信息拉取到本地缓存,所以注册中心挂了可以继续通信

4、dubbo支持哪些通信协议?支持哪些序列化协议?

  • dubbo协议

dubbo://192.168.0.1:20188

默认就是走dubbo协议的,单一长连接,NIO异步通信,基于hessian作为序列化协议

适用的场景就是:传输数据量很小(每次请求在100kb以内),但是并发量很高

为了要支持高并发场景,一般是服务提供者就几台机器,但是服务消费者有上百台,可能每天调用量达到上亿次!此时用长连接是最合适的,就是跟每个服务消费者维持一个长连接就可以,可能总共就100个连接。然后后面直接基于长连接NIO异步通信,可以支撑高并发请求。

  • rmi协议

走java二进制序列化,多个短连接,适合消费者和提供者数量差不多,适用于文件的传输,一般较少用

  • hessian协议

走hessian序列化协议,多个短连接,适用于提供者数量比消费者数量还多,适用于文件的传输,一般较少用

  • http协议

走json序列化

  • webservice

走SOAP文本序列化

5、dubbo支持哪些序列化协议?

支持hessian、java二进制序列化、json、SOAP文本序列化多种序列化协议。但是hessian是其默认的序列化协议。

6、dubbo负载均衡策略

1)random loadbalance

默认情况下,dubbo是random load balance随机调用实现负载均衡,可以对provider不同实例设置不同的权重,会按照权重来负载均衡,权重越大分配流量越高,一般就用这个默认的就可以了。

2)roundrobin loadbalance

还有roundrobin loadbalance,这个的话默认就是均匀地将流量打到各个机器上去,但是如果各个机器的性能不一样,容易导致性能差的机器负载过高。所以此时需要调整权重,让性能差的机器承载权重小一些,流量少一些。

跟运维同学申请机器,有的时候,我们运气,正好公司资源比较充足,刚刚有一批热气腾腾,刚刚做好的一批虚拟机新鲜出炉,配置都比较高。8核+16g,机器,2台。过了一段时间,我感觉2台机器有点不太够,我去找运维同学,哥儿们,你能不能再给我1台机器,4核+8G的机器。我还是得要。

3)leastactive loadbalance

这个就是自动感知一下,如果某个机器性能越差,那么接收的请求越少,越不活跃,此时就会给不活跃的性能差的机器更少的请求

4)consistanthash loadbalance

一致性Hash算法,相同参数的请求一定分发到一个provider上去,provider挂掉的时候,会基于虚拟节点均匀分配剩余的流量,抖动不会太大。如果你需要的不是随机负载均衡,是要一类请求都到一个节点,那就走这个一致性hash策略。

6、dubbo集群容错策略

1)failover cluster模式

失败自动切换,自动重试其他机器,默认就是这个,常见于读操作

2)failfast cluster模式 一次调用失败就立即失败,常见于写操作

3)failsafe cluster模式

出现异常时忽略掉,常用于不重要的接口调用,比如记录日志

4)failbackc cluster模式

失败了后台自动记录请求,然后定时重发,比较适合于写消息队列这种

5)forking cluster

并行调用多个provider,只要一个成功就立即返回

6)broadcacst cluster

逐个调用所有的provider

7、dubbo动态代理策略

默认使用javassist动态字节码生成,创建代理类

但是可以通过spi扩展机制配置自己的动态代理策略

8、dubbo的spi思想是什么?

spi,简单来说,就是service provider interface,说白了是什么意思呢,比如你有个接口,现在这个接口有3个实现类,那么在系统运行的时候对这个接口到底选择哪个实现类呢?这就需要spi了,需要根据指定的配置或者是默认的配置,去找到对应的实现类加载进来,然后用这个实现类的实例对象。

9、如何基于dubbo进行服务治理、服务降级、失败重试以及超时重试?

服务治理

1、调用链路自动生成

2、服务访问压力以及时长统计

3、服务分层(避免循环依赖),调用链路失败监控和报警,服务鉴权。

服务降级

<dubbo:reference id="fooService" interface="com.test.service.FooService"  timeout="10000" check="false" mock="return null">

利用mock

失败重试和超时重试

<dubbo:reference id="xxxx" interface="xx" check="true" async="false" retries="3" timeout="2000"/>

10、分布式系统如何保证幂等性(比如不能重复扣款)

这个主要结合业务来看?所谓幂等性,就是说一个接口,多次发起同一个请求,你这个接口得保证结果是准确的,比如不能多扣款,不能多插入一条数据,不能将统计值多加了1。这就是幂等性。

利用唯一id标识结合redis

10、分布式系统如何保证接口调用顺序性