您是否知道在Akka / Scala中添加/删除路由到Broadcaster路由器的好方法?
我一直在看Resizer - 但是不能满足我的需求(我看不清楚如何明确要求调整器调整大小(添加路由)并删除它似乎你需要向演员发送一个Poison Pill然后被删除)。
到目前为止,我有一个带有ActorRef列表的路由器,我发送了AddRoutee和RemoveRoutee消息......
我的业务案例:我有一个演员从网络(通过代理)获取数据,并且需要将这些数据分发给独立的演员以便并行处理。由于收件人的图形性质(DAG),图表可以在运行时发展,顶点/边缘被修改,因此需要添加和删除路由
必须有一种更清洁的方法来做到这一点。
感谢指点。
我希望Akka处理的代码示例:
class MDActor extends Actor {
@volatile var routees = Set[ActorRef]()
def receive = {
case ar: AddRoutee => routees = routees + ar.actorRef
case rr: RemoveRoutee => routees = routees - rr.actorRef
case msg => routees.foreach(r => r forward msg)
}
}
答案 0 :(得分:2)
每当你发现自己在路由器中缺少一个功能时,现在是开始思考另一个方向的好时机:你提出的演员代码出了什么问题?除非您需要每秒路由超过几百万条消息(这不太可能是您的描述),这样的演员才是正确的解决方案。路由器是一种非常专业的结构,不应该用作替代品;只有在完全符合你的要求时才使用它们,并且你已经确定了普通演员不够的基准。
答案 1 :(得分:1)
不确定是否有更好的方法比保持路由的状态并在每次更改时构建新的路由器或不使用路由器并使用普通的actor。我最近也看了这个。
支持不变性 - 因此,最受欢迎的解决方案可能是抛弃旧的路由器和/或集合并构建一个新的路由器(路由器或演员/地图集)。
你可以跟踪你的演员而不是完全使用路由器 - 这是一个很好的解决方案,并在akka文档中推荐作为路由器的简单替代品。路由器应该比一个成熟的演员具有性能优势。
您可以使用此处演示的演员列表构建路由器。 每次有变化时都这样做。 (来源:akka文档 - http://doc.akka.io/docs/akka/snapshot/scala/routing.html)
val actor1 = system.actorOf(Props[ExampleActor1])
val actor2 = system.actorOf(Props[ExampleActor1])
val actor3 = system.actorOf(Props[ExampleActor1])
val routees = Vector[ActorRef](actor1, actor2, actor3)
val router2 = system.actorOf(Props().withRouter(
RoundRobinRouter(routees = routees)))
这里显示了RoundRobin路由器,但这与使用广播路由器没什么不同。
重新创建它会更有用。