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