问题标签 [akka-actor]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
3405 浏览

scala - Akka 和单身演员

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

这里有两个例子:

1)

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

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

2)我有一个“服务”层,应该用于为各种作业分派演员(访问数据库,访问内存缓存,使用数据进行计算并将结果传递给用户......等等)。

将这个服务层理解为某种“单例”,对某些功能的闭包是有意义的,因为它没有以任何方式阻塞或 CPU/内存密集型,它只是简单地分配任务(例如,决定有多少演员/线程/我们应该被创建以及请求应该去哪里)

但是,这需要:

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

b)使两个对象都成为实际的“对象”(如在 scala 对象表示法中,它指定一个命名的单例,其函数在其范围内具有闭包)

b) 有很多问题,即服务层要么必须将参与者系统“传递”给它(我不确定这是最佳实践)才能创建参与者,而不是创建自己的参与者“儿童”将使用全球参与者系统创建儿童,并且消息传递和监控逻辑将更加尴尬和不直观。此外,内存缓存不会具有内置消息队列的优势(我并不是说它很难实现,但这似乎是一种情况,即“哦,快乐,这很好我有演员,我不必花时间实现和测试这段代码”)

a) 似乎有一个问题,一般来说,akka 文档中的文档记录很差,并且没有得到建议。我是说:

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

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

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

0 投票
2 回答
319 浏览

scala - AKKA-如果演员的名字在集群中不是唯一的,如何阻止演员的创建

我试图阻止系统中存在共享相同名称的参与者的可能性(它们位于不同的路径上,因此InvalidActorNameException不会被抛出)

应用程序.conf:

主要的:

演员:

如果您使用 6405 端口运行应用程序一次,然后使用 6406 端口运行应用程序,那么应用程序将工作,但我希望它注意到系统已经包含一个名为“someActor”的参与者并阻止该调用。

我不介意将名称添加为角色或其他配置,如果它能够阻止它,但我不能拥有像包含现有名称的地图的状态(或包含带有消息传递的地图的演员) 或进行长时间运行的操作(无论如何,如果从多个地方并行调用actorSelection它们将不安全)。actorOf

0 投票
1 回答
114 浏览

scala - Akka - 路由器主管策略 - 如何在事件中向路由器发送消息

嗨,我想实现一个路由器策略,在某些事件上会向路由器发送一条消息,但我不知道如何在策略实现中获取对路由器的引用。

这就是我想要做的:

其中 self 应该是路由器ActorRef,但在这种情况下无法识别 self 。

0 投票
0 回答
331 浏览

parallel-processing - 并行运行 Akka Streams 阶段会显着增加内存压力

我正在尝试实现一个 Akka Stream,它从视频文件中读取帧并应用 SVM 分类器以检测每个帧上的对象。检测可以并行运行,因为视频帧的顺序无关紧要。我的想法是创建一个遵循 Akka Streams Cookbook(将工作平衡到固定的工人池)的图表,其中两个检测阶段标记为.async.

它在一定程度上按预期工作,但我注意到我的系统的内存压力(只有 8 GB 可用)急剧增加,并且超出图表显着降低了系统速度。将其与使用.mapAsyncAkka Docs)将三个演员集成到执行对象检测的流中的不同方法进行比较,内存压力显着降低。

我错过了什么?为什么并行运行两个阶段会增加内存压力,而三个并行运行的 Actor 似乎工作正常?

附加说明:我正在使用 OpenCV 读取视频文件。由于 4K 分辨率,每个类型Mat的视频帧约为 26.5 MB。

并行运行两个阶段,.async显着增加内存压力

.mapAsync在不增加内存压力的情况下集成演员

0 投票
1 回答
480 浏览

scala - Akka 演员消息聚合

收到分子和分母后,以下参与者执行除法,

是否有更可扩展的方式来聚合所有消息?

0 投票
2 回答
720 浏览

scala - mapMaterializedValue 对 Source.actorRef 什么都不做

我正在尝试使用 Source.actorRef 向演员 bindet 发送消息,但这部分代码:

只打印这样的东西:

映射前 Source(SourceShape(ActorRefSource.out), ActorRefSource(0, Fail) [5564f412])
映射后 Source(SourceShape(ActorRefSource.out), ActorRefSource(0, Fail) [5564f412])

所以。不知何故mapMaterializedValue不做任何事情。肯定没有消息发送给演员。是ref - None出于某种原因吗?

此外,我发布了所有代码。它是 websockets 上的简单信使(一对一消息)之类的情节。我现在只是研究 Akka 流,所以这段代码真的不完美。我准备好听取任何批评或建议。

主服务器对象:

常用包:

构建.sbt

谢谢大家!

0 投票
2 回答
299 浏览

scala - 如何从 sbt shell 向actor发送消息

我用远程演员创建了一个简单的应用程序(示例来自这里):

是否可以从 sbt shell 向它发送消息?

0 投票
1 回答
545 浏览

java - 使用 Actor Supervised ,如果发生故障,如何以定义的时间间隔重试同一消息定义的次数

我正在关注来自 akka.io 容错的代码http://doc.akka.io/docs/akka/current/java/fault-tolerance.html.我已将此代码作为参考。我的要求如下:假设演员在一条消息上崩溃并由他的主管重新启动。然后他开始处理他邮箱中的下一条消息。导致崩溃的消息被“丢弃”。但我想在特定时间(假设 3 次)内处理相同的操作,并且它们之间有定义的间隔(假设 1 秒)。如何使用 akka 监督来执行此操作。实际上通过演员我正在尝试检查特定服务api是否正在工作(即给出一些异常)。因此,如果特定尝试有任何异常(假设未找到404),请将消息重新发送给失败的工作人员,直到maxNrOfRetries 由 supervisorStrategy 指定。如果工人失败了“maxNrOfRetries”次,那么就记录下来“

我的主管班:

儿童班:

创建演员:

对于 service_url,如果发生故障,我想重复该过程。但它没有发生。如果在 creatng actor 中写入下一行,child.tell("serVice_url_2", ActorRef.noSender());则此行将被排除,但我想在特定时间(假设 3 次)内处理相同的操作(发生故障),并在它们之间定义间隔。请指导我实现这一目标。

0 投票
1 回答
335 浏览

playframework - 调用启动模块时默认 Ebean 服务器为空 [Play Framework]

我正在使用带有 sbt-play-ebean 3.0.0 的 Play Framework 2.5.10。

我的问题
我需要在应用程序启动时为我的一个模型中的每个对象设置 Akka 演员。唯一的官方方法是注册一个启动模块。但有时调用启动模块时默认的 Ebean 服务器尚未初始化。

我丑陋的解决方案

启动模块:

MainActor 类的构造函数:

在初始化 Ebean 服务器之前,有没有更好的方法来做到这一点而无需暴力尝试?

0 投票
0 回答
58 浏览

scala - Akka- 在子角色之间重定向日志文件

我目前正在使用 log4j 属性RollingFileAppender将日志重定向到文件,并且日志文件名由进程参数定义:

log4j.properties:

使用 args 调用进程:-Dfilename=childActor1

演员定义为:class MyActor extends Actor with ActorLogging

这适用于远程演员,但现在我想创建本地子演员并将日志文件重定向到具有演员名称的文件。我读过我可以用来RoutingAppender在线程之间切换日志,但我不确定它是如何与 Akka 集成的。

我觉得应该有某种简单的解决方案来做到这一点,但我找不到它,而且用于日志记录的 Akka 文档真的很差。