我使用ConsistentHashingRouter将数据从actor分发到一组其他actor。每条消息都包含一个像(items: Set[Int], msg: String)
这样的元组。我编写了一个实现ConsistentHashable的case类,将整数集定义为这样的一致散列键。
case class Message(items: Set[Int], msg: String) extends ConsistentHashable {
def consistentHashKey = items
}
现在,当我让一些制作人演员向路由器发送大量消息时,路由器将这些消息分配给目标节点。
我尝试了不同数量的目标演员。在所有情况下,收到的消息最多的参与者获得的消息数量是收到消息最少的参与者的两倍以上。
使用散列时,我希望消息在目标中均匀分布,或者我在这里遗漏了什么?
答案 0 :(得分:2)
consistentHashKey返回将用于计算散列键的对象(如果您不返回String或字节数组,它将MurMurHash应用于该对象的序列化字节)。我不知道如何分配,你应该看看"项目"你遇到的价值 - 那些可能很偏颇。
此外,一致的散列不会完全均匀分布。请参阅:http://en.wikipedia.org/wiki/Consistent_hashing
简而言之,散列键的间隔被自身包裹以形成环,并且该环被随机点(节点的散列)细分为间隔(桶)。这些铲斗最终可能会达到不相同的尺寸。通常你有更多的节点和#34;相等"他们会 - 但这不能保证。