在重写Akka中已弃用的 persistentView 的过程中,我有一个需要对其状态进行快照的读取actor,并且到目前为止读取了日志事件偏移量 . 要停止需要序列化复合数据结构的视图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.")
  }
}

然而,这意味着如果儿童演员的确认丢失或者儿童演员在发送消息之前死亡,然后视图演员在等待来自子演员的 offsetUpdated 响应时死亡,则偏移和状态将在父actor尝试恢复时的未同步状态 .

  • 这个案例值得担心吗?如果一个当地的儿童演员只是简单地做一个简单的算术就像我的孩子演员的情况那样会随机死亡吗?

  • 如何修改设计以确保可以处理?我可能会在双方都引入一个确认,并在双方引入两阶段同步机制,但这可能是错误的 .

这是问题的完整context .

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