gpt4 book ai didi

java - 在参与者层次结构中以原子方式传递可变对象

转载 作者:行者123 更新时间:2023-12-01 23:36:03 26 4
gpt4 key购买 nike

我已经为我的 Scala/Java 应用程序构建了一个适当的 actor 层次结构,该层次结构主要依赖于即发即忘语义。我现在面临着在参与者之间以原子方式传递唯一可变对象的需要。特别是,我有三个 Actor ,A、B 和 C:

  A
/ \
B C

B 和 C 都有自己的独特对象 map ,并且彼此不了解。在某个时间点,B 将决定需要删除对象O我正在寻找一种机制,允许将对象O添加到CMap并从B中删除映射原子

B 不决定由 C 接收对象 O:它首先所做的只是向 actor 发送处置请求A。参与者A可以允许或拒绝来自B的处置请求,并从那里将C介绍给参与者B他们自主且原子地完成交易。

编辑

我原来的问题标签不明确且困惑。在我的系统中,消息是不可变的:我在参与者之间发送 UUID,而不是对对象的引用。这些 UUID 是可变对象的私有(private)每参与者映射的键。 B 和 C 在其私有(private)映射中持有的对象的使用在任何给定时间点都是互斥的。

对我来说,更进一步确保 B 和 C 之间没有共享任何可变对象,也就是说,确保 B 映射中的键 K 和 C 映射中的键 K 指向不同的私有(private)可变对象,这对我来说是微不足道的(例如 Ob 和 Oc)具有相同的 UUID。

一个目标是避免同时对 B 中的对象 Ob 和 C 中的 Oc 进行计算。这本身并不是一个真正的问题(我不介意在从 Actor B 到 Actor C 的过渡期间偶尔浪费一些 CPU 周期),但它成为一个问题,因为 Actor B 和 C 将其模拟结果报告给 A我们可以称之为 D 的第 3 方客户端。

D 不知道 A、B 和 C 之间的关系,因此它可以从 B 和 C 接收关于同一 UUID 的结果,但无法判断应该听哪一个。由于模拟的性质,这些结果可能不同且相互矛盾。当然,参与者 B 可以停止模拟对象 Ob,并向参与者 C 发送消息,告诉它开始对对象 Oc 进行模拟。这将阻止客户端 D 接收来自 B 和 C 的有关同一对象的消息,但会存在一个时间范围,在此期间该 UUID 可能完全不存在于模拟中。也许这对我的申请来说不是很重要,但我仍然需要验证这一点。对我来说最理想的是 UUID 的 actor 同步切换。

最佳答案

Two phase commit protocol可用于进行原子更新。

B -> A tell ("initiate moving of O B->C") 

A -> B tell ("prepare remove O") //
A -> C tell ("prepare add O") // (A selects C)

C changes O to prepare-to-add state
C -> A tell ("ready to add O")

B changes O to prepared-to-remove state.
B -> A tell ("ready to remove O")

A waits for two "ready" messages and then:
A -> B, C tell ("commit")

if A receives timeout, then
A -> B, C tell ("rollback")

为了使该协议(protocol)可靠地工作,您需要在 B、C 中实现撤消/重做日志。

关于java - 在参与者层次结构中以原子方式传递可变对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18683429/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com