【问题标题】:Is there a name for this asyncronous actor initialization idiom?这个异步actor初始化习语有名字吗?
【发布时间】:2017-07-03 20:58:09
【问题描述】:

每当我创建一个需要一些异步获取的数据来初始化自身的演员时,我发现自己使用了这样的成语。它有名字吗? (这是最好的方法吗?)

class AsyncInitActor(db: Database, someId: UUID) extends Actor with ActorStash {
    case class Initialize(something: Something)

    override def preStart() = {
        db.getSomething(someId) onSuccess { something =>
            self ! Initialize(something)
        }
    }

    def receive = {
        case Initialize(something) =>
            context become initialized(something)
            unstashAll()

        case _ => stash()
    }

    def initialized(something): Receive = {
        case whatever =>
    }
}

对于通过集群分片创建的actors,异步请求发生在receive而不是preStart

明确地说,我不是在寻找 GoF 模式。

【问题讨论】:

    标签: asynchronous design-patterns initialization akka actor


    【解决方案1】:

    我从未为此使用过 stash。如果我真的需要初始化,我更有可能使用 FSM 来确保我的 actor 处于就绪状态。

    http://doc.akka.io/docs/akka/current/scala/fsm.html

    我想你可以结合这两种方法。

    【讨论】:

    • 你能举个例子吗?如果您不存储它们,您会如何处理以启动状态到达的消息?
    • 我认为 stash 正是为了这个目的。 stackoverflow.com/questions/28005231/…当然也可以存储在actor状态。坦率地说,我通常会使用 FSM 拒绝其他消息,然后再将行为更改为“成为”到某个 READY 状态。在演员准备好之前,我不需要接受消息。 github.com/SalmaKhater/Learning-Akka/blob/master/… 是另一个例子。
    【解决方案2】:

    每当我创建一个需要异步获取的actor 数据来初始化自身...

    我会说,您基本上描述了工厂模式。如果您的参与者是 DDD 概念,那么它将在 DDD 存储库的上下文中。换句话说,您正在处理一个复杂的实体创建及其验证 - need 部分。 DDD 存储库的职责之一是生成有效 聚合根。

    我的两分钱。

    谢尔盖

    【讨论】:

    • 不,这不是工厂模式。我正在为这种特殊的异步模式寻找一个名称。也许它会更好地称为成语。
    • 我不太清楚你的意图。操作的异步性不会改变意图。意图定义了模式。根据定义,模式解决了重复出现的问题。您将其更改为成语这一事实并没有消除它的本质。在您的情况下,这是一个有效参与者的多步骤创建。
    • 我的目的是找出这个演员的异步初始化的特定习语是否有名字。调用工厂并不能表明正在发生的事情。
    【解决方案3】:

    我想到的最接近的设计模式是代理。

    根据文档here

    设计一个代理或代理对象:在客户端第一次请求代理时实例化真实对象,记住这个真实对象的身份,并将发起请求转发给这个真实对象。然后所有后续请求都简单地直接转发到封装的真实对象。

    在您的情况下,您可以认为演员被代理包裹。一旦从数据库初始化了actor,代理就会将所有请求转发给它,即realactor。在此之前,代理会返回 null、default 演员或其他内容。

    【讨论】:

    • 不,它不是代理。 Actor 不会将请求转发给另一个 Actor,它只是将它自己处理的请求延迟到初始化之后。
    • 可以这样设计,包装器等待初始化并相应地转发
    猜你喜欢
    • 2014-10-09
    • 2011-03-19
    • 1970-01-01
    • 1970-01-01
    • 2017-11-02
    • 1970-01-01
    • 1970-01-01
    • 2022-06-13
    • 2017-07-19
    相关资源
    最近更新 更多