由演员

时间:2016-02-14 07:05:37

标签: scala akka

我是阿卡新手为特定问题尝试的事情。我正在尝试为actor系统编写代码,该代码系统可以以事件的形式有效地处理来自多个客户端的自定义数据。通过自定义数据,我的意思是,数据的内容和结构会因来自同一客户端的事件而异(例如,我们可能已经检测到为同一客户端丢弃包含5条不同信息的5个事件),以及来自不同客户端的事件之间客户(例如,我们可能从一个客户端到另一个客户端捕获完全不同的信息集)。我想知道在这种情况下使用基于actor的处理是一种好方法。

这是我到目前为止所想的替代方案:

(A)我将编写一个actor,它将根据正在处理事件的客户端通过反射加载客户端特定的处理器类。客户端特定的处理器类将包含对应于将为该客户端接收的所有事件类型的逻辑。我将发起这个演员的'n'个实例。

context.actorOf(Props[CustomEventProcessor].withRouter(RoundRobinPool(nrOfInstances = 100)), name = "CustomProcessor")

(B)我将为每个客户编写演员,每个演员都包含对应于该客户端将收到的所有事件类型的逻辑。我会发起每个演员的'n'个实例。

context.actorOf(Props[CleintXEventProcessor].withRouter(RoundRobinPool(nrOfInstances = 50)), name = "ClientXCustomProcessor")
context.actorOf(Props[CleintYEventProcessor].withRouter(RoundRobinPool(nrOfInstances = 50)), name = "ClientYCustomProcessor")

此时,我有几个问题:

  1. 与[B]相比,[A]会慢吗?因为[A]使用反射?我假设一旦一个actor实例处理完一个特定的事件,它就会死掉,所以从同一个客户端处理事件的下一个actor实例必须从再次加载处理器类开始。这个假设是否正确?

  2. 给定一个特定的事件流模式,与[A]相比,基于[B]的系统是否会有更重的运行时内存占用,因为现在每个客户端的每个actor都可以在内存中有多个实例?

  3. 还有其他方法可以解决这个问题吗?

  4. 感谢您的任何指示。

1 个答案:

答案 0 :(得分:1)

那么,

  1. 它可能会慢一些,但我认为并不是很明显。不,你不必在事件之间杀死演员。

  2. 不,因为单个actor在内存中占用400个字节,所以你可以为每个事件创建一个actor,而不是每个客户端只有一个actor。

  3. 是的,通过Reactive Streams,我认为它比演员更清晰,但Akka Streams仍然是实验性的,并且它可能比演员更难学习。但如果需要,你可以免费获得背压。