Akka.Net 个工作队列

Akka.Net work queues

我有一个基于 MassTransit 和 RabbitMQ 构建的现有分布式计算框架。本质上有一个经理根据请求响应工作。每个工人将根据物理机器规格获取一定数量的物品。然后工作人员在完成后发送完成消息。它运行良好并且似乎具有高度可扩展性,因为唯一的 link 是服务总线。

我最近评估了 Akka.Net 以查看这是否是实现相同模式的更简单的系统。看完之后,我对它的确切用途有些困惑。看来如果我想做类似的事情,经理必须提前了解每个工人并直接发送工作。

我认为我遗漏了一些东西,因为该模型似乎无法很好地扩展。

像 MassTransit 这样的服务总线被构建为可靠的消息传递服务。确保消息传递是那里的首要问题。

A​​ctor 框架也使用消息,但这是唯一的相似之处。消息传递只是实现目标的一种手段,它不像服务总线那样可靠。它们更倾向于构建高性能、易于分布式的系统拓扑,以参与者为主要工作单元。从概念上讲,actor 接近于 Active Record 模式(但这是一个很好的简化)。它们也非常轻便。执行机器的内存中可以有数百万个。

在性能方面,Akka.NET 能够在单个 VM 上发送超过 3000 万 messages/sec(在 8 个内核上测试)——比任何服务总线都多很多,但特性也相差很大。

在 JVM 上,我们现在 akka 集群可能会增加到 2400 machines。不幸的是,我们无法测试 .NET 实施限制是什么。

您必须决定您真正需要什么:消息库、actor 框架或两者的组合。

我同意@Horusiath 的回答。另外,我想说的是,在大多数情况下,您可以将服务总线替换为像 akka 这样的 actor 模型的消息系统,但它们不在同一个 class 中。

消息传递只是 Akka 提供的一种功能,虽然它是一项很棒的功能,但我不会说它是主要功能。将其作为替代方案进行分析时,您必须首先查看模型本身的优势,然后查看消息传递功能是否足以满足您的用例。例如,您仍然可以使用专用的外部服务总线在不同的集群之间分发消息,并保持 akka.net 在集群内交换消息。

但关键是,如果您决定使用 Akka.net,您将不会仅将其用于消息传递。