如何在java中实现ketama算法?
我们正在使用nginx作为负载平衡器,并基于url的第一部分使用consistent hash来分配负载。这个很好用。对/abc/的请求总是发送到同一个节点
在我的节点上,我也想实现这个算法。(需要让一些作业在这些节点上运行,并使用一些预加载的缓存元素)
所以我需要nginx ketama算法的Java实现
我发现了一些:
- https://github.com/RJ/ketama
- https://gist.github.com/linux-china/7817485
- https://github.com/jinoos/ketama-java
这些算法都不能产生与nginx相同的结果。这可能是因为nginx文档中描述了一些ketama点,或者散列算法中存在一些差异
我在这里找到了nginx哈希算法: https://github.com/nginx/nginx/blob/53d655f89407af017cd193fd4d8d82118c9c2c80/src/stream/ngx_stream_upstream_hash_module.c#L279
当我比较两者时,我发现java使用的是md5,nginx使用的是crc32,还有很多其他的区别
java中有兼容的实现吗?或者是否有关于ketama算法的明确文件
# 1 楼答案
这个代码对我有用。它不是防弹的,因为它不考虑重量或其他因素,如删除节点。如果您喜欢使用它,代码是公共域