演员模型 (akka) 是否适合我的应用程序?
Is the actor-model (akka) the right fit for my application?
我一直在阅读博客、收听播客和阅读 Akka 文档有一段时间了,但我仍然不能说我真的理解演员模型是否适合我要解决的问题。
让我们以构建一个应用程序为例,该应用程序告诉您什么狗最适合一个人(不是我正在做的,但有助于描述我想做的)。
我每秒收到 很多 条消息,人们想知道要买什么狗,系统应该根据我掌握的关于这个人的信息来决定他们应该买什么狗。
事件:
A 想要一只狗
我的订阅者:
好的,A 想要一只狗,让我们检查一下要得到什么狗 -> 让我的应用程序解决这个问题
申请:
- 获取请求
- 从其他系统收集有关此人的更多数据(他们住在哪里,space他们有,时间,他们的运动程度等等)
- 要求threads/actors/whatnot使用一组规则来检查他们应该养哪种狗
示例:
- 此人是否居住在这些区域中的任何一个(检查适合大狗的区域的缓存)(大多数检查将在列表中查找内容)
- 这个人有比x大还是小的房子
- 此人是否长时间工作
- 等等
所有这些检查 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 集群是另一个问题,肯定需要更多信息才能做出决定,例如用户群有多大。
我一直在阅读博客、收听播客和阅读 Akka 文档有一段时间了,但我仍然不能说我真的理解演员模型是否适合我要解决的问题。
让我们以构建一个应用程序为例,该应用程序告诉您什么狗最适合一个人(不是我正在做的,但有助于描述我想做的)。 我每秒收到 很多 条消息,人们想知道要买什么狗,系统应该根据我掌握的关于这个人的信息来决定他们应该买什么狗。
事件: A 想要一只狗
我的订阅者: 好的,A 想要一只狗,让我们检查一下要得到什么狗 -> 让我的应用程序解决这个问题
申请:
- 获取请求
- 从其他系统收集有关此人的更多数据(他们住在哪里,space他们有,时间,他们的运动程度等等)
- 要求threads/actors/whatnot使用一组规则来检查他们应该养哪种狗
示例:
- 此人是否居住在这些区域中的任何一个(检查适合大狗的区域的缓存)(大多数检查将在列表中查找内容)
- 这个人有比x大还是小的房子
- 此人是否长时间工作
- 等等
所有这些检查 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 集群是另一个问题,肯定需要更多信息才能做出决定,例如用户群有多大。