首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用Akka缓存公共资源

使用Akka缓存公共资源
EN

Stack Overflow用户
提问于 2016-09-02 03:53:59
回答 3查看 673关注 0票数 0

嘿,伙计们,我想做以下事情:

假设我有n个参与者,他们都在读取一个叫做x的公共变量,在后台,我想安排一个参与者,它会不断更新这个变量x,比如说每5-10分钟。我不想让n个角色等待这个值被更新。即使x正在更新,它们也应该获得一些值。那么,我该如何以最好的方式处理这种情况呢?

EN

回答 3

Stack Overflow用户

发布于 2016-09-04 08:34:05

与参与者模型无关,解决该问题的两种一般方法是推送(当缓存代理向客户端发送更新通知并更新其本地缓存时)或拉取(当客户端每次访问缓存代理时)。

在这两种情况下,都有一个“当前”缓存版本应该是不可变的(以防止并发问题)。在推送模型中,客户端在本地维护它,在拉取模型中,它在缓存代理中维护。在这里,您可以有许多由您的应用程序需求驱动的设计选择,这些需求会导致不同的权衡。

粗略地说,如果您想让客户端保持简单,请使用pull模型。你购买这种简单性的代价是失去对缓存新鲜度的控制,并放弃对更新通知的了解。这也导致了更复杂的沟通过程。

如果您想了解实际数据的最新情况,并知道缓存何时更新(并可能控制更新过程),请使用推送模型。我会在你的例子中使用它,因为它在actors中的实现非常简单。一种可能的伪scala实现:

代码语言:javascript
复制
class Worker extends Actor {
  var cache: String
  def receive = {
    case CacheUpdate(newValue) => cache = newValue
  } 
}

class Publisher extends Actor {
  val workers = new mutable.ListBuffer[ActorRef]()
  def receive = {
    case AddWorker(actor) => 
      workers += actor
      context.watch(actor) // this is important to keep workers list current
    case Terminated(actor) => workers -= actor
    case Update(newValue) => workers.foreach(_ ! CacheUpdate(newValue))
  }
}

您可以将AddWorker消息作为生命周期的一部分发送(在这种情况下,您需要在构造函数中传递Publisher ),也可以在外部协调它。

票数 1
EN

Stack Overflow用户

发布于 2016-09-02 22:56:23

在不同的参与者之间共享可变对象被认为是一种不好的做法,按照你解释的方式,你的变量'x‘是可变的,它是共享的。

在参与者之间共享信息的正确方式是通过不可变的消息。

可能的解决方案之一是:

  • 有一个执行元来创建您的'n‘个执行元
  • 此执行元在处理此消息时将消息安排给self
    • ,此变量将被更新
    • 在此之后,此执行元向其子对象( 'n’个执行元)发送带有变量'x'

的值的副本(从不共享可变内容)的消息

  • 您的每个'n‘角色都将收到新值作为消息,并且他们可以向您提供他们所期望的任何内容。
票数 0
EN

Stack Overflow用户

发布于 2016-09-20 22:53:56

您可以通过ConsistentHashable了解这个article ,它包含了caсhing的详细示例。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39279868

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档