我正在使用Akka的群集分片:
val deviceOperations = ClusterSharding(system).start(
typeName = DeviceOperations.shardName,
entryProps = Some(DeviceOperations.props(notification, profile, dataDecoders)),
idExtractor = DeviceOperations.idExtractor,
shardResolver = DeviceOperations.shardResolver)
设置idExtractor和shardResolver以从消息中提取ID并将消息路由到具有匹配ID的集群中的actor。
val idExtractor: ShardRegion.IdExtractor = {
case ParentDeviceRegister(deviceId, registerProps) ⇒ (deviceId.toString, DeviceRegister(registerProps))
...
}
val shardResolver: ShardRegion.ShardResolver = {
case ParentDeviceRegister(deviceId, _) ⇒ s"${deviceId.hashCode() % 10}"
...
}
这应该将具有相同ID的所有传入消息路由到群集中的同一个actor。不幸的是,源自设备的一半消息使用一个唯一ID,其余消息使用不同的唯一ID。两个唯一ID都属于同一个设备,我想将这两组消息路由到同一个actor。将这些消息路由到集群中相同的相应actor的最佳方法是什么?
我已经考虑过某种类型的键值存储,用于从两个独立的ID中查找公共唯一ID,但我宁愿不引入单点故障。还必须为每条消息进行查找,这似乎不太理想。
能够为群集中的每个角色分配多个身份以便协调员可以处理它将会很棒。
我想我有一个计划......
我要选择其中一个ID作为主要ID。我将使用辅助actor系统将包含辅助ID的消息转发给主要actor系统。辅助角色将存储设备的主要ID,并使用主要ID将消息转发给主要角色系统。
次要参与者最初不会知道主ID,但它可以在收到第一条消息时直接从设备请求主ID。然后,辅助参与者将使用存储的主ID存储主ID并将未来消息路由到主设备参与者系统。
包含主ID的其他消息将直接发送到主要参与者系统,而无需通过辅助角色系统进行路由。