演员模型 (akka) 是否适合我的应用程序?

Is the actor-model (akka) the right fit for my application?

我一直在阅读博客、收听播客和阅读 Akka 文档有一段时间了,但我仍然不能说我真的理解演员模型是否适合我要解决的问题。

让我们以构建一个应用程序为例,该应用程序告诉您什么狗最适合一个人(不是我正在做的,但有助于描述我想做的)。 我每秒收到 很多 条消息,人们想知道要买什么狗,系统应该根据我掌握的关于这个人的信息来决定他们应该买什么狗。

  1. 事件: A 想要一只狗

  2. 我的订阅者: 好的,A 想要一只狗,让我们检查一下要得到什么狗 -> 让我的应用程序解决这个问题

  3. 申请:

示例:

所有这些检查 return 应用程序的结果,应用程序收集所有答案,直到一切都完成,然后将根据此决定结果。

现在请记住,一直会有很多消息,我想 运行 同时进行这些检查,以便能够尽快回复。该应用程序将 运行 在 Kubernetes 集群的一个容器中运行,我希望能够在出现峰值负载或未来消息量增加时扩展该应用程序。

到目前为止我的看法

actor-model 似乎适合我应用程序的第一部分(请求为一个人找到合适的狗),因为它有自己的状态,它根据从 child-actors/threads/whatever.

但是: 实际进行检查的工作人员不需要内部状态,因为他们只是检查有关此人的某些信息是否在列表 XYZ 中或者此人的房子比X大。(所以演员不好用)

因此:actor-model 对我的应用程序来说是不是太过分了?我应该用什么代替?只是期货?如果我确实使用 actor-model,我应该使用 Akka Clustering 吗? Akka 流是替代方案吗?

我很困惑!

akka actors 非常适合在应用程序中管理状态。在您的用例中,状态可以缓存这些请求的结果:

... data about this person from other systems (where do they live, space they have, time, how sporty are they, etc etc)

如果您想尽快执行这些请求,将这些数据缓存在应用程序内存中并为这些 in-memory 数据使用 actors 听起来是个不错的选择。

要执行检查,akka streams 和 graph DSL 是您不错的选择。

val ask1 = Flow[Req].mapAsync(1) { req =>
  someActorRef ? req
}
val ask2 = ...

val bcast = b.add(Broadcast[Req](N))
val zip = b.add(Zip(...))
bcast.out(0) ~> ask1 ~> zip.in0
bcast.out(1) ~> ask2 ~> zip.in1
...

欢迎阅读 https://doc.akka.io/docs/akka/current/stream/stream-graphs.html 以了解更多关于 akka 流的信息。它可以很容易地与akka actors和akka http集成。

是否使用 Akka 集群是另一个问题,肯定需要更多信息才能做出决定,例如用户群有多大。