转载

dubbo-一致性hash

首先,我们要明白,我们需要的是什么数据?key和value。那具体是什么呢?key是哪个数据?value是哪个服务器节点?

key

调用的时候,调用的实际上是方法。然后,方法里有参数。最主要的参数当然是数据。但是,除了我们要处理的数据本身之外,还可能有其他参数,什么参数呢?就是用于负载均衡的参数,这是辅助参数。

//代码,接口定义如下:

方法(第一个参数 //用于负载均衡,第二个参数 //业务数据);
复制代码

注意是第一个参数。不是所有的参数,加一起。也就是说,肯定有个地方配置是哪个参数,作为key。还是默认第一个参数是key?因为没看到哪个地方配置了。答案是默认是第一个参数,作为key。

value

服务器节点

如何配置?

主要配置几个核心

1.负载均衡算法

你用的是一致性hash负载均衡算法,因为dubbo默认不是一致性hash

2.key

哪个参数作为key?也就是说,要配置哪个参数作为key,默认是第一个参数,所以不需要配置。

3.方法

哪个方法,使用一致性hash?也就是说,要配置方法名字。

配置代码

//服务提供者

<暴露服务 类>
  <哪个方法 负载均衡算法=一致性hash/>
</>
复制代码

应用场景-支付系统里的支付

方法(String orderId //一致性hash,Order order //业务数据)
复制代码

实现原理

核心有两个

1.找到哪个负载均衡算法?

2.找到哪个服务器节点?

要找到这两个数据,其实就是找到value。而找到value,需要找到key。

第一个key,是方法名字。就是配置文件里,已经指定了方法名字/负载均衡算法。系统启动的时候,加载配置文件,就已经把所有的key/value,加载到了内存的map里去了。即使没加载,如果是第一次用的时候,才加载,也是把key/value放到map里,目的是下次用的时候,直接从map里取。

第二个key,是方法的第一个参数(默认是第一个参数作为key)。

也就是说,这里用到的数据结构都是map。

参考

blog.csdn.net/Revivedsun/… //里面有源码分析,写的非常清楚

官方文档 //原理讲解的非常详细,原理看这个就够了

dubbo.apache.org/zh-cn/blog/…

dubbo.apache.org/zh-cn/docs/…

其他

blog.csdn.net/lz710117239…

zhuanlan.zhihu.com/p/50620367

bumind.com/distributed…

weicheng97.cn/2019/090642…

为什么支付服务这里要使用一致性hash呢?

总共就只有2个地方,使用了一致性hash。其他全部是默认的随机。

1.支付

生产者——》调用消费者的接口:写数据到队列。

2.Http通知

处理消息中间件的数据

为什么?

为什么其他地方都是随机,而支付这里要使用一致性hash?

首先,让我们回归本质,看一下一致性hash解决什么问题,理解了解决什么问题,就知道这里为什么使用一致性hash。

一致性hash,是因为要更好的解决负载均衡的问题。怎么叫更好?就是更加平均 均衡 公平。总之,就是这个意思。

也就是说,不同的负载均衡算法,公平性是不一样的。

公平性,是负载均衡的一个最重要的指标。

还有一个指标是,容错。就是有一个节点挂了怎么办?挂了之后,结果就是影响这个节点的请求。为了把每个节点挂掉这种情况的影响降到最小,那么就使用一致性hash。因为一致性hash,只影响相邻的两个节点,而不是所有节点的数据都打乱了。

原文  https://juejin.im/post/5dd4f2275188254e0a448fdf
正文到此结束
Loading...