在Akka中按标识符按需启动Actors

时间:2015-08-16 23:57:54

标签: scala akka event-bus

我目前正在实施一个从外部监控系统接收入站消息的系统。我正在将这些消息翻译成更简洁的事件,并且我正在使用这些消息来改变“管理系统”的状态。对象。 Akka Actors似乎是在并发应用程序中封装可变状态的一个很好的用例。

受管系统由名称标识(99%的时候这是主机名)。只要收到正确的事件,系统就会根据name属性将消息路由到正确的actor。起初我曾经使用actorSelection和所述演员的完整路径,但这非常难看,我看到有几个人建议不要依赖演员的完全限定名来传递信息。 所以我已经设置了一个简单的EventBus,这很棒,我现在可以做到:

eventBus.subscribe(subscriber1, "/managedSystem01")
eventBus.subscribe(subscriber2, "/managedSystem02")

eventBus.publish(MonitoringEvent("/managedSystem01", MonitoringMessage("managedSystem01", "N", "CPU_LOAD_HIGH", True)))
eventBus.publish(MonitoringEvent("/managedSystem02", MonitoringMessage("managedSystem02", "Y", "DISK_USAGE_HIGH", True)))

当然,我现在遇到的问题是,我是否应该收到涉及我尚未产生演员的管理系统的事件(这完全可能,我不可能得到一个绝对的不幸的是,托管系统列表),邮件将被路由到死信邮箱。

理想情况下,我不希望这种情况发生。当它无法解决特定的actor时,我想动态地生成一个新的。

我认为,从理论上讲,我可以订阅DeadLetter消息,但是:

  1. 这听起来有点“hacky”,因为这些消息基本上是为系统保留的
  2. 是否可以恢复发送到DeadLetter邮箱的原始邮件(在我的情况下,是MonitoringMessage)?
  3. 或者有办法检查某个"主题"是否有ZERO订阅者?

1 个答案:

答案 0 :(得分:1)

你描述的内容("通过某些标识符发送给Actor,如果它在创建之前不存在缓冲区,然后传递给新的按需创建的Actor" )在Akka中实现为Cluster Sharding

虽然它主要是为集群中的分片负载(工作)而设计的,但您也可以在本地使用它,因为您的需求本质上是它所解决的问题的缩小(到一个节点)版本。如果它们不存在于给定的标识符等,它会负责启动新的Actors,因此您只需将shard-region订阅到事件中,它就会为您创建演员。