【问题标题】:Is it possible to define several stop messages in Akka Clustering是否可以在 Akka Clustering 中定义多个停止消息
【发布时间】:2020-05-11 14:49:33
【问题描述】:

我正在尝试为集群分片配置 Akka Actor,我不太确定的一件事是,是否可以为实体配置多个停止消息以进行正常关闭。

例如,像下面这样的实体配置将触发“onDelete”和“onExit”的正常关闭,或者它只会为“onExit”执行此操作?

sharding
   .init(
       Entity(Actor1Key) {
          context => ....
       }
   )
   .withStopMessage(Actor1.onDelete)
   .withStopMessage(Actor1.onExit)

如果你不知道我该如何实现这种行为?

谢谢解答

【问题讨论】:

    标签: akka akka-cluster akka-supervision


    【解决方案1】:

    我认为stopMessage 的用途可能有些混乱。不需要多个停止消息。

    在钝化后通过分片发送的stopMessage已经被actor请求,这是通过从分片actor本身发送Passivate来完成的。

    你可以让actor接受的任何消息触发钝化,当actor可以安全停止时,分片会发回stopMessage

    您应该钝化而不只是 Behaviors.stopped 演员的原因是,在导致它决定的消息之前,可能有消息正在发送到演员(邮箱,我认为在某些情况下可能是分片中的缓冲区)停下来,你想先处理这些。钝化允许通过包含到 shard 演员的往返来实现这一点,该演员负责将消息路由到分片演员。

    这里的文档中有更多详细信息:https://doc.akka.io/docs/akka/current/typed/cluster-sharding.html#passivation

    【讨论】:

      【解决方案2】:

      您指定的内容只会触发Actor1.onExit 的停止消息。原因是如何为实体定义停止消息:

      val stopMessage: Optional[M],
      

      所以你看到这是一个简单的可选元素,因此不可能有多个元素。也可以查看withStopMessage是如何实现的here

      def withStopMessage(newStopMessage: M): Entity[M, E] =
          copy(stopMessage = Optional.ofNullable(newStopMessage))
      

      因此,您基本上会在任何时候调用withStopMessage 时“覆盖”该消息。不幸的是,我不知道指定多个停止消息的任何其他方式(除了将多个消息组合成一个共同特征,但我认为这不是您要寻找的)。

      【讨论】:

      • 是的,这就是我所害怕的。我可以保证在我的系统中只有一条优雅的停止消息...
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-23
      • 2020-01-04
      相关资源
      最近更新 更多