嘿,伙计们,我想做以下事情:
假设我有n个参与者,他们都在读取一个叫做x的公共变量,在后台,我想安排一个参与者,它会不断更新这个变量x,比如说每5-10分钟。我不想让n个角色等待这个值被更新。即使x正在更新,它们也应该获得一些值。那么,我该如何以最好的方式处理这种情况呢?
发布于 2016-09-04 08:34:05
与参与者模型无关,解决该问题的两种一般方法是推送(当缓存代理向客户端发送更新通知并更新其本地缓存时)或拉取(当客户端每次访问缓存代理时)。
在这两种情况下,都有一个“当前”缓存版本应该是不可变的(以防止并发问题)。在推送模型中,客户端在本地维护它,在拉取模型中,它在缓存代理中维护。在这里,您可以有许多由您的应用程序需求驱动的设计选择,这些需求会导致不同的权衡。
粗略地说,如果您想让客户端保持简单,请使用pull模型。你购买这种简单性的代价是失去对缓存新鲜度的控制,并放弃对更新通知的了解。这也导致了更复杂的沟通过程。
如果您想了解实际数据的最新情况,并知道缓存何时更新(并可能控制更新过程),请使用推送模型。我会在你的例子中使用它,因为它在actors中的实现非常简单。一种可能的伪scala实现:
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 ),也可以在外部协调它。
发布于 2016-09-02 22:56:23
在不同的参与者之间共享可变对象被认为是一种不好的做法,按照你解释的方式,你的变量'x‘是可变的,它是共享的。
在参与者之间共享信息的正确方式是通过不可变的消息。
可能的解决方案之一是:
的值的副本(从不共享可变内容)的消息
发布于 2016-09-20 22:53:56
您可以通过ConsistentHashable了解这个article ,它包含了caсhing的详细示例。
https://stackoverflow.com/questions/39279868
复制相似问题