0

我使用 ConsistentHashingRouter 将数据从一个参与者分发到一组其他参与者。每条消息都包含一个这样的元组(items: Set[Int], msg: String)。我编写了一个实现 ConsistentHashable 的案例类,将整数集定义为像这样的一致哈希键。

case class Message(items: Set[Int], msg: String) extends ConsistentHashable {
   def consistentHashKey = items
}

现在,当我让一些生产者参与者向路由器发送大量消息时,路由器将它们非常不均匀地分配给目标节点。

我尝试了不同数量的目标演员。在所有情况下,收到消息最多的参与者收到的消息量是收到消息最少的参与者的两倍多。

使用散列时,我希望消息在目标之间均匀分布,或者我在这里遗漏了什么?

4

1 回答 1

2

一致哈希键返回将用于计算哈希键的对象(如果您不返回字符串或字节数组,它将应用 MurMurHash 到该对象的序列化字节)。我不知道这是如何平均分配的,你应该看看你遇到的“项目”值——那些可能相当有偏见。

此外,一致性哈希不会完全均匀分布。见:http ://en.wikipedia.org/wiki/Consistent_hashing

简而言之,哈希键的区间被包裹到自身形成一个环,这个环被随机点(节点的哈希)细分为区间(桶)。这些桶的大小最终可能不相等。通常更多的节点你会拥有更多的“平等”——但这并不能保证。

于 2013-07-19T13:22:48.883 回答