【问题标题】:Akka: correct pattern for syncing state between two actorsAkka:两个演员之间同步状态的正确模式
【发布时间】:2018-01-03 07:52:32
【问题描述】:

在重写 Akka 中已弃用的persistentView 的过程中,我有一个读取参与者需要对其状态进行快照,并且到目前为止已读取日志事件偏移量。为了停止需要序列化以下复合数据结构的视图 Actor:(状态 + 偏移量),我将快照偏移值值的责任委托给子 Actor。然后问题是在这两者之间同步偏移值。目前在阅读演员中,我有:

case RecoveryCompleted ⇒
  implicit val ec = context.dispatcher
  val lastSequenceNr = (sequenceSnapshotterRef ? GetLastSnapshottedSequenceNr).mapTo[QueryOffset]
  lastSequenceNr onComplete {
    case Success(QueryOffset(sequenceNr)) ⇒
      offsetForNextFetch = sequenceNr
      doSomethingBasedOnThecompositeData()
      ...

为了同步快照更新子actor的偏移值,我这样做:

case RequestSnapshot ⇒
  implicit val ec = context.dispatcher
  val offsetUpdated = sequenceSnapshotterRef ? 
QueryViewSequenceApi.UpdateSequenceNr(offsetForNextFetch)

  offsetUpdated map {
    _ ⇒
      saveSnapshot()
      snapshotRequested = false
  } recover{
    case _ ⇒
      self ! RequestSnapshot
      log.debug("QueryViewSequenceSnapshotter not reachable. Will try again.")
  }
}

然而,这意味着如果子actor的确认丢失或子actor在发送消息之前死亡,然后视图actor在等待子actor的offsetUpdated响应时死亡,偏移量和当父 Actor 尝试恢复时,状态将处于未同步状态。

  • 这个案子还值得担心吗?如果当地的儿童演员只是像我的儿童演员那样做简单的算术,它会随机死亡吗?
  • 如何修改设计以确保可以处理?我可能会在双方都引入确认,并在双方都引入两阶段同步机制,但这可能会出现问题。

这是问题的完整context

更新:在message delivery reliability 上阅读更多内容,我意识到这是一个更普遍的问题。我可以将此父级和参与者配置为使用at-least-once 传递机制,而我的项目的其余部分使用默认的at-most-once 传递机制吗?这仍然无法解决子actor在尝试将确认消息发送回父之前死亡的问题。

【问题讨论】:

    标签: synchronization akka persistence actor akka-persistence


    【解决方案1】:

    我建议使用 ask 来获得持久性保证,以及 Akka 的死亡守望。它仍然不是微不足道的:仍然存在很多漏洞。

    Akka 也有一次性保证,但总的来说,我所做的是:在确认完成之前发出请求。定期告诉,我在发件人中保持状态。超时由调度程序处理。

    如果孩子死了,对 Terminated 做出反应,然后继续循环。

    【讨论】:

      猜你喜欢
      • 2014-07-20
      • 2019-04-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-01-20
      • 2021-04-17
      • 1970-01-01
      相关资源
      最近更新 更多