加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

scala – 在Akka中暂停演员

发布时间:2020-12-16 09:15:32 所属栏目:安全 来源:网络整理
导读:我有一个Akka的演员,将处理消息以创建某些实体.这些实体上的某些字段是根据创建时数据库中其他实体的状态计算的. 我想避免创建竞争条件,其中演员处理比数据库能够持久化实体的速度更快.这可能导致数据不一致,如: 演员创建一个Foo并将其发送给其他演员进行进
我有一个Akka的演员,将处理消息以创建某些实体.这些实体上的某些字段是根据创建时数据库中其他实体的状态计算的.

我想避免创建竞争条件,其中演员处理比数据库能够持久化实体的速度更快.这可能导致数据不一致,如:

>演员创建一个Foo并将其发送给其他演员进行进一步的处理和保存
>演员被要求创建另一个Foo.由于第一个还没有保存,所以基于DB的旧内容创建新的,从而创建一个错误的Foo.

现在,这种可能性是相当遥远的,因为Foos的创建将被手动触发.但是,双击可能会导致高负载下的问题.谁知道明天是否会自动创建Foo.

因此,我需要的是一些告诉演员等待的方式,只有在确认了Foos已被保存之后才恢复运作.

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

基本上,我想使用邮箱作为消息队列,并且可以控制队列的处理速度.

解决方法

不,你不能挂起一个演员:演员总是尽快从他们的邮箱中拉出信息.这只会使传入的请求被隐藏掉,以便稍后处理:

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)
  }
}

请注意,消息传递不保证(或数据库可能会关闭),因此超时是推荐的做法.

潜在的问题

这个问题主要表现在那些在演员模型和领域模型之间并不完全一致的情况:演员是一致性的单位,但是在你的用例中,一致的形象需要最新的外部实体(数据库),使演员做正确的事情.我不能推荐一个解决方案,而不了解更多关于用例,但是尝试重新构建您的问题,考虑到这一点.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读