gpt4 book ai didi

scala - 在 Akka 中暂停 Actor

转载 作者:行者123 更新时间:2023-12-03 21:17:00 28 4
gpt4 key购买 nike

我在 Akka 中有一个 Actor ,它将处理消息以创建某些实体。这些实体上的某些字段是根据创建时数据库中其他实体的状态计算的。

我想避免创建参与者处理速度快于数据库能够持久化实体的竞争条件。这可能会导致数据不一致,如下所示:

  • Actor 创建 Foo并将其发送给其他参与者进行进一步处理和保存
  • 要求 Actor 创建另一个 Foo .由于第一个还没有保存,所以根据DB的旧内容创建新的,从而创建错误Foo .

  • 现在,这种可能性非常遥远,因为 Foo 的创建s 将被手动触发。但仍然可以想象,在高负载下双击可能会出现问题。谁知道明天 Foo将自动创建。

    因此,我需要一些方法来告诉 Actor 等待,并且只有在确认 Foo 后才能恢复其操作。 s 已保存。

    Is there a way to put an actor in idle state, and tell it to resume its operations after a while?



    基本上,我想将邮箱用作消息队列,并控制队列的处理速度。

    最佳答案

    不,您不能暂停 Actor : Actor 总是尽快从他们的邮箱中提取消息。这只留下传入请求被隐藏起来以供稍后处理的可能性:

    class A(db: ActorRef) extends Actor with Stash {
    def receive = {
    case Request =>
    doWork()
    db ! Persist
    context.setReceiveTimeout(5.seconds)
    context.become({
    case Request => stash()
    case Persisted => context.unbecome(); unstashAll()
    case ReceiveTimeout => throw new TimeoutException("not persisted")
    }, discardOld = false)
    }
    }

    请注意,无法保证消息传递(或数据库可能已关闭),因此建议使用超时。

    根本问题

    这个问题主要出现在参与者模型和域模型之间没有很好对齐的情况下:参与者是一致性单位,但在您的用例中,您的一致图像需要一个最新的外部实体(数据库),以便 Actor 做正确的事。如果不了解用例的更多信息,我无法推荐解决方案,但请尝试在考虑到这一点的情况下 reshape 您的问题。

    关于scala - 在 Akka 中暂停 Actor ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14564568/

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