专业的编程技术博客社区

网站首页 > 博客文章 正文

阿里一面:Dubbo是如何做系统交互的 #程序员

baijin 2024-08-12 13:33:52 博客文章 11 ℃ 0 评论

阿里一面:Dubbo的负载均衡策略。

再来看一道阿里一面的面试题,叫做double的负载均衡策略。这个题目其实面试官如果问出来应该还是对double非常熟的,因为一般不可能就会问这个问题,如果不熟的其实回答的答案非常简单。

简单到什么情况?给大家看一下现在这个问题,如果是简单的答,大家基本上都能够答出来,有轮询、随机哈希、最小活跃数。但是要知道面试官不可能就问这么简单,所以double里面的复杂就很策略,其实还是相对而言是比较复杂的。

比如八十个轮询,不是简单的轮询,不是现在有三台服务器,第一次就用第一台,第二次就用第二台,第三次就用第三台,第四台。关于这个问题的详细文字版已经整理了一份80万字的java面试大全,需要的小伙伴评论区置顶领取一下。

一台不是这种情况,它里面有轮询算法叫做平滑加权轮询算法。当然很多同学可能在回答这种负载均衡策略的时候说人群随机权重,可能认了,很多同学可能把权重理解为一种单独的负载均衡算法,这个不对。

算法的实现知道按顺序来算法,所以就是从某一台中间随便就从几台里面随便选一台。权重是什么?比如现在稍微解释一下,比如现在有三台服务器,假设第一台服务器的权重是三,第二台服务器的权重是一,第三台服务器的权重是二。

现在有一个请求过来了,给你几台?有人说二,权重最高的就给他,给他吗?第二个请求过来了给谁?还是权重最高的还是给他吗?第三个请求过来了还是权重最高的还是给他吗?不可能。所以服务器光有权重是不够的,其实基本上就是轮询、权重、随机。权重就加权随机,加权轮寻要配合和权重和轮寻权重和随机这样一起来用的。

所以具体下面有单独的一篇文章有一个资料,因为这个东西其实要讲的很详细,可能要单独的一节课,所以大家赶紧去的,到时候可以点开这个链接里面去。

针对每一种随机算法,它什么意思?我都通过一个单独的笔记,都给大家写的非常非常详细,包括还有具体的代码都有,这都在职资料里面给大家去写着了,所以到时候大家可以拿一下。

当然具体的就是double里面目前支持四种平滑加权揉圈算法,这个非常牛逼,然后加权随机算法,一致性哈希算法,最小活跃数算法,这个在我的笔记里面都详细的解释了,所以想详细了解一下的可以拿到这个资料再去看一下。

这个问题就不多说了,因为这个需要花太多的时间了。再来看一道阿里一面的面试题,叫做double是如何做系统交互的。这个问题其实问到了double的一个非常核心的知识点,因为double是一个RPC框架,当然现在double也慢慢的也会成为一个微服务框架,所以说白了,它里面的功能就不仅仅只有PC,还包括很多像网关,还包括像很多微服务里面的链路跟踪,其他的功能在弹幕里面都会加上。

所以当然,double最大的一个特点仍然是它的RPC,因为它底层RPC的性能相比较于spring,cloud目前来说还是算比较高的。

如果再回答这个面试题,可以给大家来看一下这位老师给到大家的一个答案,就是double的底层是通过RPC来完成服务和服务之间的调用,是之间的调用。

首先double有个功能是它支持很多的协议,比如默认的double协议底层是用的NT,所以这是为什么快,包括用NT,包括自己设计了一套线程模型。所以就导致了如果服务之间用day.new用的是double协议会相对而言会比较快,当然它同时也支持HTTP协议,支持Rest都支持的好。

所以它底层包括使用的技术,比如double底层用的NT也可以用mini HTTP协议底层,用的tom cat也可以用阶梯。所以这个东西可以让程序员自己去控制,自己去配置,到底是想用tomcat还是想用阶梯,想问NT还是想用MINA都可以。

大概的先形容一下底层RPC的一些特性,再给面试官去详细解释一下。说白了服务之间的调用系统交互其实就是一个应用调另外一个应用,一个服务调另外一个服务。

就有两种角色,一种就是服务消费者,然后在调用某一个服务的时候会将当前所调用的服务接口信息,就是担心消费者在消费哪个服务,因为在double里面它是面向接口的,一个接口就是一个服务。消费者现在要调的是哪个服务,调要调的是具体的是接口里面的哪个方法,执行这个方法所传入的一些入场数据,入场信息是什么?

在消费端这一边,消费者这一边就会有double框架,把这些信息组装为一个invocation对象。消费者组装好了对象之后就会把对象交给通过网络传输的方式传递给服务提供者,一旦收到了invocation对象就可以去找到当前的服务以及当前所要调用的方法,通过反射的方式去执行这个方法。只是在刚刚说的现在需要把invocation对象传输过去,就可以用到上面所说的这种协议。

这里的每一个协议其实都可以用来传输对象,只是因为每个协议的底层所使用的网络传输的技术不一样,所以不同的协议所应对的场景也不太一样。比如用double协议,就是请求量比较大,但是每个请求又比较小的情况,下面就可以用NT,就只是搞病房。

如果是经常的要用一些长链接,就可以用HTTP协议。但是通过不同的协议其实都可以去传输invocation对象,目的反正就是把它传送给服务提供者,到时候服务提供者就可以来执行这个方法,就相当于会执行这个服务。

最后得到方法的结果之后再通过网络,同样的底层不管是用double还是用hdp,其他底层都是socket,所以最后再通过网络把它写,把结果返回给服务消费者,这种情况也就基本的这是服务消费者去调用服务提供者大概的原理。

当然在调用过程中间,不管是在服务消费者端还是在服务提供者接收请求这一端或者发送响应结果这一过程中间,其实在double整个链路上面还有很多其他的设计,比如服务容错、负载均衡、服务容错。

就是当在调用一个服务的时候,假设报错了,会如何处理double也是可以做到的,可以去配置一些容错的逻辑,负载均衡。当然现在一个服务消费者要调用一个某一个服务,但是这个服务有集群,有多个服务提供者,势必在负载也就是消费者那一端就要去进行负载均衡。

还包括一些field的机制,field的机制就相当于是spring spring mcd里面的拦截器机制,可以针对,就是可以实现filter,当然double内部就会有很多的filter,比如有一些monitor failt就是去监控,监控当前服务消费者在调用这个服务的时候消耗了多少时间。

比如请求发出去的时候是几分几秒,接收到当前请求所对应的响应结果的时候是几分几秒,其实都是通过这种FIL的机制去实现的。还包括有动态路由机制,但动态路由机制和负载均衡其实非常像,只是有一点区别。

这个东西如果了解也可以跟面试官说一下,这里说的动态路由其实就相当于现在还是刚才说的服务消费者要去调用某一个服务,但这个服务如果有集群,比如现在有五台机器组成的当前服务的集群,这五台服务器,比如可能在两个机房内,一个机房内部署了两台,一个机房内部署了三台。

假设现在一个机房挂掉了,当服务消费者在调用这个服务的时候,因为这五个服务其实都会存在注册中心里面,就是服务消费者一开始从注册中心找到你,当前要调用的服务可能仍然还是五台机器,这个时候可能就需要去做一些处理,比如肯定就要从这五台里面过滤出来三台,因为现在只有这三台活着,所以这个时候就可以去配置一些路由的规则,让double到时候根据路由的规则可以从这五台中间再去选出三台,再利用副台进行策略,从这三台里面再去选择一台。

所以相当于路由机制是从M台里面去选出N台,这里N是小于M的,负载均衡就从这N台里面去选出一台,所以这是它们两个的区别。当路由机制可以用在很多的地方,比如灰度发布,还包括很多其他的一些同城的异地容灾,包括其他的方面的一些容错机制。

如何实现AOP,项目哪地方用到O?其实都可以使用路由机制来进行实现,所以这个机制也是让doulble能够处理更多的企业中间那些需求。

所以double目前其实很多大厂还是在用的,所以大家也可以好好的去了解一下,学习一下大伯。

当然我这里把相关的刚才讲的这些逻辑对应的流程图也给大家画出来了,就有这么一个图,到时候大家可以拿到这个资料好好的去看一下。

这是关于这个题目,关注私信发送资料就可以了,这样就可以拿到心仪的资料了。

Tags:

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表