gpt4 book ai didi

scala - Akka actor 与 Futures 的工作交接

转载 作者:行者123 更新时间:2023-12-02 18:20:27 29 4
gpt4 key购买 nike

我正在尝试在 akka actor 之间建立一个消息传递过程,以代表 master 为 worker 提供工作,并密切关注它。我的问题是

  1. 我在下面提出的建议是合理的方法吗?
  2. 即使是不,我想知道如何通过组合正确完成它 future ,为了我的 future 教育。

我想要的过程是这样的

1) Master 通过ask 将工作发送给 Worker。它期望在 5 秒内得到答复,否则它认为 worker 已经失去了机会,并且必须再次参与投标。

import context.dispatcher
implicit val timeout = Timeout(5 seconds)
val workCompletedFuture = (worker ? WorkTicket(work)).mapTo[Future[WorkCompleted]]

2a) 如果工作人员在 5 秒内没有响应,我希望主人向自己发送一条消息,要求重新分配工作。

self ! WorkAllocationFailed(work, worker)

2b) 如果工作人员确实做出了响应,那么它会给我们一个 Future[WorkCompleted]。我愿意等待该 future 完成,例如 2 分钟。

3a) 如果 Future[WorkCompleted] 未能在超时内完成,则重新分配工作

self ! WorkFailed(work, worker)

3b) 如果 Future[WorkCompleted] 成功,则收集结果

我尝试过创建这个逻辑,但是嵌套的 onComplete 搞得一团糟,而且我不知道如何在 Future[WorkCompleted] 上实现超时。我尝试阅读 Akka 2.10 Futures docs ,但无法找到解决方案。

最佳答案

我同意 Endre 的回答 - 都是非常好的观点。

这个怎么样:

1) 为自己安排一条超时消息(使用system.scheduler.scheduleOnce)

2) 使用常规 tell 向工作人员发送工作消息

3a) 如果已完成的工作在超时消息之前返回,则取消计划的作业并使用步骤 1 和 2 重新分配工作

3b) 如果已完成的工作在超时消息后返回,则忽略它或取消重新分配的工作。

Future 可以提供帮助的一个地方是对 worker ,特别是当工作需要很长时间或阻塞时。工作人员可以使用 future 来完成工作,并保持可用状态来处理更多传入消息,例如取消工作。

关于scala - Akka actor 与 Futures 的工作交接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14316407/

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