问题标签 [actor-model]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
java - Actor 模型实现中的多个 Apache HTTP 客户端
我在这里有这个架构疑问。有多种选择,而且似乎都是有效的,但我想做最正确的事情。
我有这个应用程序大量使用带有 Akka 的演员模型。一些参与者(不多)将使用 Apache HTTP 客户端执行出站 HTTP 调用,通常始终针对同一台服务器。
现在,我了解 HTTPClient 的创建者状态,您通常会在应用程序中使用一个 HTTP 客户端实例和一个池连接管理器。虽然我完全理解他们为什么这么说,但我觉得我应该为每个参与者实例使用一个 Http 客户端和一个基本连接管理器,因为这样做如果客户端或连接管理器出现问题,就会引发异常,并且主管将重新启动actor,清除可能持续存在的任何状态。
我要疯了吗?有什么建议吗?
java - actorSelection 和 resolveActorRef 之间的 Akka 区别
我使用两种不同的方式来获得相同的结果,但是我需要指定一个回调时间,为什么?他们剂量相同吗?
上面的代码无需等待任何时间即可检索演员 Ref 为什么如果我没有得到证明者我必须指定持续时间?
scala - 进程间通信的静态类型参与者模型有什么不可行的吗?
所以我最近才在玩具容量之外遇到了akka,我不禁注意到它和OTP共享动态类型,尽管scala一般偏爱静态类型。我开始深入研究,发现这篇 Wadler 论文描述了一个基于 erlang 进程间通信的 HM 类型系统。也就是说,SO 对这个问题的回答是指 Wadler 和 Marlow 未能交付他们对流程型通信所做的草图。作为参考,我对这样的代码很失望:
我知道在实践中,dialyzer 可以提供真实类型系统的很多好处,但是为什么创建静态验证的参与者系统如此困难呢?仅仅是我们在使用类型系统时倾向于编写Future
或Observable
/Iteratee
库,或者-modeled IO 而不是 actor 系统,还是 Wadler 和 Marlow 遗漏了一个技术难题?Channel
akka.net - 我应该保留儿童演员的注册表吗?
我最近开始研究一个系统,我正在使用 Akka.NET。我仍在学习如何从演员模型的角度思考,所以我愿意接受更有经验的人的建议。
我试着先问一个更一般的问题:
如果决策必须基于分布在多个参与者类中的多个参数和复杂的业务规则,如何通过管理实体跟踪子参与者状态以决定与哪个孩子交互。
我将尝试简化我面临的问题:假设我有一个 Actor System,并且有一个 Actor,称为 Backlog。
Backlog负责创建和监督Jobs(也是 Actor)。
作业有一个生命周期,为了简单起见,它们可以是Active或Completed。它们被创建为 Active,并在收到特定消息时变为 Completed。完成并不意味着终止。那是后来的,在某个时候(所以没有死亡守望)。作业可以并最终与Resources相关联。一个Job可能与零个、一个或多个Resources相关联。
资源是不受Backlog监督的参与者。资源数量有限。
任何时候只能将一个活动作业与资源相关联。
Resource可能与Job没有关联。Resource可能不知道与Job关联。
资源有时会被传感器检测到。检测器需要知道资源的意图。Intention是Job可变状态的一部分。
Resource本身没有Intention,只有在与Job关联时才具有Intention ,但在被询问时需要声明Intention,因此需要确保有关联的Job。(因为检测器检测的是资源,而不是作业。)
在我的设计中,Resource需要向Backlog询问Job,如果它在被检测到时没有。
现在,Backlog可能有也可能没有此资源的Job。如果没有,它应该创建一个(假设它知道如何)。为了做到这一点,它需要知道它的哪些作业是活动的,以及这些作业是否已经与请求的资源相关联。
还在我这儿?
那么我应该如何让Backlog找出它是否有Resource R的Job呢?我是否应该向所有 Job 参与者广播一条消息并询问他们是否处于活动状态?如果他们不小心处理R?我如何确保所有作业都确实处理了它,以及我应该等待他们多长时间来处理它(特别是因为 0 毫秒似乎是此类简单任务的唯一可接受的性能)。
或者我应该保留按资源标识符保存作业参与者引用的字典?以及参与此决定的(最后已知的)州?那么我应该如何维护这些字典呢?寻找域事件?或者为Jobs引入更多消息,通过 at-least-once 保证告诉Backlog他们的状态变化?
老实说,我喜欢使用 Actor 模型的思维方式和好处,但是这里需要大量代码来实现类似于传统 OO 中的单行 LINQ 查询的功能,这让我担心其余部分的意愿的团队将处理此代码。
总结
我有一个演员Backlog负责创建和监督Jobs,其他演员代表领域中的一个概念。在某些情况下,它需要根据一些涉及子 Actor 的可变状态的标准来准确选择这些 Job 之一,或者确定当前是否没有可用的 Job。(有多个合适的工作表明存在问题,应该被检测到。)
问题:除了向所有工作广播一些消息、包含标准并等待每个工作应用此标准以自己响应正面或负面答案之外,我是否还有其他选择?
elixir - 在事件源发票有界上下文中进行分区
在以战术域驱动设计为模型的事件源系统中,我无法处理以下情况:
- 项目被选择在发票上。
- 要么所有选定的项目形成发票,或者如果任何选定的项目无法分配,则不分配任何项目并且发票不存在。
- 不变性:一个项目不得出现在多张发票上。
- 一旦包含项目的发票存在,项目应转换为价格。
我的计划是
- 发票聚合类型,因此发票有一个标识来分组项目并存储计算的价格。
- 我会有一个 Item 聚合类型,它通过为每个聚合实例存储对一张发票的单个引用来跟踪不变量。
我想我需要针对新的 Invoice 聚合触发命令,其中包含要分配给新发票的现有项目 ID 的列表。这将发出一个关于发票创建的事件。
然后一些东西会监听这个事件并将它翻译成一个命令列表,这些命令将每个选定的项目分配给新发票。
我看到这可能会失败:例如,在发出命令后,其中一个选定的项目可能已分配给另一张发票。因此,我会以某种方式需要回滚所有未失败的分配并声明发票不再存在。
另一方面,要计算发票上的价格,我需要知道最初选择的所有项目何时实际分配给发票,以确保发票留在这里。
目前我正在使用 Elixir 中的 Commanded CQRS/Event Sourcing 框架,该框架基于 Erlang Actor 模型。
我的天真的想法来自于使用非分布式关系数据库的悠久历史,将整个情况放入一个同步事务中,该事务分布在两个聚合上。但是该框架似乎不支持这一点,它也或多或少地破坏了异步分布式聚合实现最终一致性的想法。
因此,我正在为我的问题寻找合适的解决方案。任何帮助,将不胜感激。
akka - 即时通讯应用的演员模型?
我有使用诸如RabbitMQ
和其他消息传递技术的企业分布式系统的背景,尽管我对Actor Model
.
话虽如此,我想知道使用Actor Model
框架(例如AKKA
或AKKA.NET
类似的应用程序)是否是个好主意Whatsapp
?考虑到此类应用程序的要求(高可用性、低延迟等)。
我的另一个问题是,Erlang 的内置演员模型是大公司将它用于他们的消息传递应用程序的原因还是我不知道的其他东西?
高度赞赏技术解释。提前致谢。
azure-service-fabric - 处理多种参与者类型的 Service Fabric 参与者模型
我使用 Service Fabric 作为我的微服务框架。我正在使用无状态服务,因为我们使用的是外部数据库。我有两种类型的用户:一种是 CSR(客户代表),另一种是用户本身。如何安排我的 Actor 服务来解决这个问题?
CSR 的功能很少。但客户是整个难题的重要组成部分。假设 CustomerActor 需要更新它自己的地址。CSRActor 也可以完成相同的操作。
是否建议创建 2 个不同的 Actor,CSRActor 和 CustomerActor,然后 CSRActor 对客户 Actor 进行任何操作。或者 Customer 可以是一个单独的服务,两种类型的参与者都调用 CustomerService。还有其他想法吗?
erlang - Actor 模型:我们可以通过 Actor 模型获得共享锁的语义吗?
参与者一次处理一条消息并封装它不共享的状态这一事实足以提供同步语义。所以互斥(写锁)被照顾。然而,我们如何实现一个读写锁语义,其中多个读取器可以并行工作,但读取器和写入器是互斥的?例如:并发 HashMap。
java - Akka:在询问时丢失了`child.path.name`的参考
我正在尝试实现Manning 的“Akka in Action”一书中的“Up and Running”示例的 Java 版本。它是一个基于 Actor Model 的简单 Http 服务器,用于保存(仅在内存中)和检索一些事件。我保存事件没有问题。但是在向我的演员系统查询事件(所有事件)时,我确实遇到了问题。
这是相关的(我放了三个点而不是我认为与我的问题无关的代码)代码BoxOffice
- 所有 s 的父参与者TicketSeller
(稍后负责管理每个事件的状态)。
基本上发生的事情是,receiveMsgGetEvents
我正在发送一条消息,self
其中包含一条包含子名称的消息child.path.name
。但是,当我收到该消息(分别在 中receiveMsgGetEvent
)时,无法通过该名称找到子演员:
另外值得注意的GetEvent
是,发送和接收同一演员之间需要很长时间(如秒,但我感觉不到 20)。
问题可能是由于我的CompletableFutures
操作,但我试图重现 scala 等效代码。
上面的信息日志以及此消息:
在配置超时(20 秒)后打印的堆栈跟踪之后打印: