喜欢和单身演员

Akka and singleton actors

我最近开始研究 akka 的 actors 和 http 模块。然而,我偶然发现了一个相当烦人的小怪癖,即创建单一演员。

这里有两个例子:

1)

我有一个内存缓存,我的服务很小(它是一个应用程序)所以我真的很喜欢这个内存模型。我可以在地图中保存与用户相关的大部分信息(好吧,列表地图,但仍然很容易推理结构)并且我没有得到 redis、geode 或 aerospike 的开销和复杂性。

唯一的问题是这个内存中的 chache 可以被多个源修改,并且所说的修改必须是同步的。我没有为这个结构同步所有 3 个访问方法(例如通过构建消息队列或实现锁)我想我只是将结构及其访问方法包装到一个参与者中,构建消息队列,简单的接收 - >发送逻辑和如果事情扩大规模,将很容易用 DA actors 代替专用的内存数据库。

2) 我有一个 "Service" 层应该用于为各种作业调度 actor(访问数据库,访问内存缓存,使用数据进行计算并将结果传递给用户...等)。

将此服务层理解为某种 "singleton",对某些功能的闭包,因为它不做任何阻塞或 cpu/memory 密集的事情,它只是分配任务更进一步(例如决定应该创建多少 actors/thread/w.e 以及请求应该去哪里)

然而,这件事需要:

a) 制作两个对象单例演员或

b) 使两个对象成为实际对象"objects"(如在 Scala 对象符号中指定单个命名的单例,其函数在其范围内具有闭包)

b) 有很多问题,即服务层要么必须获得一个 actor 系统 "passed"(我不确定这是最佳实践)以便创建actors,而不是创建自己的 "childrens" 它将使用全局 actors 系统创建儿童,并且消息传递和监控逻辑将更加笨拙和不直观。此外,内存缓存将没有内置消息队列的优势(我并不是说它很难实现,但这似乎是其中一种情况 "Oh, jolly, its good that I have actors and I don't have to spend time implementing and testing this code")

a) 似乎有问题,一般来说,akka 文档中的文档记录不充分且未经建议。我的意思是:

http://doc.akka.io/docs/akka/2.4/scala/cluster-singleton.html

看看这个狗屎,一半的文档都警告不要使用它,它是它自己的依赖项,坦率地说,对于像我这样没有涉足函数式和并发编程象牙的可怜的草皮来说,很难阅读塔.

所以,嗯。你们中的任何人都可以向我解释为什么使用单身演员不好吗?如果他们不能成为演员,你如何设计单身人士?有什么方法可以设计出不会造成大量损害的单例 actors 吗?整个 "service" 模型是否具有被调用而不是实例化的 "global" 服务 "un akka like"?

只是为了澄清文档,他们并没有警告不要使用它。他们警告说,在某些情况下使用单例会导致问题,这些问题在特定情况下是意料之中的。他们提到了以下情况:

  • 如果单例是性能瓶颈。这是有道理的。如果一切都依赖于一个运行缓慢的对象,那么一切都会很慢。
  • 如果 actor 需要不间断可用,那么如果单例发生故障,您将 运行 遇到问题,因为这些消息不能仅由另一个实例处理。在恢复工作之前重新启动单例需要一些时间。
  • 如果你打开了自动关闭功能,最大的问题就会出现。自动关闭是一种策略,通过该策略假定无法访问的节点已关闭并从网络中删除。如果你这样做,但节点实际上并没有关闭,而只是由于网络分区而无法访问,分区的双方将决定它们是幸存的节点并创建自己的单例。所以现在你有两个单身人士。当然,这不是你想要的单身人士。但是无论如何你都不应该在测试之外使用自动关闭功能。这是一个糟糕的恢复策略,包含在测试中是为了完整性和方便性。

所以我不认为这是反对使用它的建议。如果您确实使用它,请根据结构的性质明确预期的陷阱。