阿卡和单身演员

时间:2017-01-02 17:32:17

标签: scala akka actor akka-http akka-actor

我最近开始搞乱akka的演员和http模块。然而,我偶然发现了一个相当恼人的小怪癖,即创造了辛格尔顿演员。

以下是两个例子:

1)

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

唯一的问题是这个内存中的chache可以被多个源修改,并且所述修改必须是同步的。而不是为这个结构同步所有3个访问方法(例如通过构建消息队列或实现锁),我认为我只是将结构及其访问方法包装成一个actor,构建在消息队列中,轻松接收 - >发送逻辑,如果事情扩大,将很容易通过专用的内存数据库替换DA演员。

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

将这个服务层理解为" singleton"对于某些函数的封闭,因为它不会以任何方式阻塞或cpu /内存密集,它只是简单地分配任务(例如,决定应该创建多少个actor / thread /我们)请求应该去哪里)

但是,这件事要么:

a)制作对象单身演员或

b)使两个对象都是实际的"对象"(如在scala对象表示法中指定一个名为singleton的函数,该函数在其作用域上有闭包)

b)存在很多问题,即服务层要么必须得到一个演员系统,要么通过"为了创造演员,而不是创造自己的儿童"它将使用全局actor系统创建子级,并且消息传递和监视逻辑将更加笨拙和不直观。此外,内存缓存不具有内置消息队列的优势(我并不是说它很难实现,但这似乎就是其中一种情况之一"哦,很高兴,我有演员的好处,我不必花时间实施和测试这些代码")

a)似乎在akka文档中普遍存在文档记录欠佳和未经修改的问题。我的意思是:

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

看看这个狗屎,有一半的医生警告不要使用它,这是它自己的依赖,坦率地说,很难读到像我这样没有涉足功能和并发的可怜的草皮编程象牙塔。

所以,啊。你们中的任何人都可以向我解释为什么使用单身演员不好吗?如果他们不能成为演员,你如何设计单身人士?有没有办法设计单身演员不会造成很大的伤害?整个"服务"有"全球"的模型被调用而不是实例化的服务" un akka like" ?

1 个答案:

答案 0 :(得分:1)

为了澄清文档,他们并没有警告不要使用它。他们警告说,在某些情况下,使用单身人士会导致问题,而这些问题是根据情况预期的。他们提到了以下情况:

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

因此,我不会将其视为推荐使用它。根据结构的性质,如果你使用它,只要清楚预期的陷阱。