2016-08-24 37 views
4

我有一个聚合了一些信息并处理它的演员。目前,它看起来像这样:如果我有一个演员,该怎么办应该有很大的节奏?

class MessageTracerActor extends Actor{ 

    override def receive: Receive = { 
     case MyActor.TracableMessage(msg) => //send processed msg to another place 
     case v: Any => //corner-case, has special handler 
    } 
} 

演员应该要发送的延长TracableMessage消息的痕迹。但TracableMessages是从相当多的演员发送和主机MessageTracerActor在一台机器上不是很好。

我看着cluster shrading,但这似乎并非如此。他们说,当你比有一个适合机器 很多演员状态 一起消耗更多的资源(例如内存)

集群分片通常使用。如果你只有几状态的演员,可能更容易 一个集群辛格尔顿节点上运行它们。

但是,Cluster Singleton严格地托管在一个不可伸缩的节点上。

也许有与我可以指定线程用于处理由演员收到的邮件数量(甚至节点)的一些配置选项?

+3

我是一个新手,阿卡,但不会是有意义的使用阿卡路由器/ routees增加吞吐量,而不是只用一个演员。 – Samar

+0

@Samar有趣的是,我读了这篇文章。在他们的例子中,他们自己创造了演员。在群集的情况下,我将不得不手动部署演员到特定的节点。也许分片更好,因为它本身可以跨节点传播分片。 –

+0

路由器可以将消息发送到分布式系统中其他节点上的路由。这是一个解释路由器/ routee策略以增加吞吐量的链接。 https://www.packtpub.com/books/content/dispatchers-and-routers – Samar

回答

4

有几个选项可以将消息处理扩展到单个参与者之外。

在单个节点

如果跟踪消息处理是无状态的传播的消息处理,您可以分发使用routing跟踪消息处理者的多个实例之间的工作。路由器是一个建立处理角色池的角色,并将处理角色之间的每个传入消息进行分配。

// create a round robin style router for actors 
val router: ActorRef = context.actorOf(RoundRobinPool(5).props(Props[MessageTracerActor]), "tracer-router") 

在上面的例子中,循环式路由器用于均匀分配消息在跟踪者之间。这意味着您将失去发送给路由器的消息之间的订购保证:稍后排入队列的消息可能在之前入队的消息之前处理。由于每个消息处理器只能看到传入消息的任意子集,因此聚合等有状态处理也不能一致地完成。

为了使顺序一致,你要想想什么样的信息需要在顺序。如果所有的tracable消息都需要按照它们进入路由器的顺序进行处理,那么路由器不会为你提供很多帮助。但是,某些可跟踪消息可能需要按照与某些消息相关的顺序进行处理,而不是其他消息。例如,您的可跟踪消息可能包含消息来源,并且只能在来自同一来源的消息之间保证排序。

识别信息之间的次序可以让你以一致的方式发布消息处理器之间的消息。 Akka使用consistent hashing pools为此提供了功能。在一致性散列池中,路由器根据散列键机制将传入消息分发给消息处理器。具有相同路由哈希键的消息将被路由到同一个消息处理器,这意味着您可以始终如一地对传入消息进行聚合,以处理一部分可跟踪消息。

跨多个节点

如果一个节点阿卡是不够的处理tracable信息传播的消息处理,您可以缩放消息用阿卡的clustering features处理。在集群中,您有多个Akka节点相互连接,通过在集群中分发工作而不是在单个节点中处理所有内容来一起工作。

在集群中,您有分布式版本的前述工具可用。对于消息的无状态和有状态路由,您可以使用a cluster aware router。群集感知路由器在群集成员节点上创建消息处理器池,而不是在单个节点中创建它们。

除了集群感知路由器,您还可以使用cluster sharding。就像在一致的哈希池中一样,您需要为集群分片指定一个哈希键,以便将消息一致地路由到正确的参与者。群集感知路由器和分片之间的区别在于分片会为每个密钥自动创建一个actor,因此消息处理器actor不需要分别处理来自不同密钥的消息。

如果所有的tracable消息都需要在相同的状态下进行聚合,您的最终选择是考虑Akka的distributed data功能。在此功能中,聚合工作分布在多个节点上,并在稍后阶段加入。请注意,分布式数据API在Akka 2.4中仍处于试验阶段。

其他领域寻找到

分布在多个节点的消息处理装置,有个人消息处理器滴的风险较高(例如网络连接失败,节点崩溃)。为了保持状态在节点之间持久和可转移,您可能需要查看Akka的persistence功能。

相关问题