首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在哪里和如何在实践中使用演员

在哪里和如何在实践中使用演员
EN

Stack Overflow用户
提问于 2017-11-21 02:49:08
回答 1查看 92关注 0票数 0

如何在复杂的后端服务中使用actors,这些服务由接收初始请求、进行一些处理、然后向其他服务发送一些请求/要做的事情、等待其中一些服务的响应以及决定如何基于响应继续等组成,直到我们计算出最终结果为止?

试图使用参与者来实现这样的服务引发了一个问题--这个工作流的哪些部分应该由参与者实现,哪些部分不应该实现?

参与者实例不会释放他们正在使用的线程,直到他们试图完成的任务完成(除非我们将它委托给一个未来),所以在我看来,它看起来就像将整个工作流写成一个层次结构,一个包含N层子层的较小的参与者组成的层次结构,一方面是基于参与者概念的理想设计,另一方面它将保持N-1线程(每个初始请求)--总是锁着什么也不做,只是等待层次结构中的底层参与者来完成。具体来说,层次结构中最顶层的参与者大部分时间都是空闲的。

这种分层设计还与error kernel模式相匹配。

但对于并发性来说,这听起来很糟糕。

即使你试图保持这种行为者的等级,但把对每个参与者的调用封装在未来(通过询问子参与者,而不是告诉),锁也就会短得多(尽管它仍然存在)--仍然与这么多具有状态的参与者一起工作,或者那些以自己不同步的方式修改系统状态的行为者(即不只是简单地修改数据库,至少简单的请求是通过数据库事务自动完成--而是修改应用程序中的某个全局变量)。

那么,应该只在工作流的较低级别使用参与者吗?

或者应该以更连续的方式重写一个主要是分层的(而且大多数是这样的)工作流,这样它就不需要那么多级别的子角色(但这是非常困难和不自然的,似乎给了实现框架太多的影响)。

这意味着您将认识到参与者是非常有限的,而容错应该主要由传统的异常处理来处理,而且无论如何,拥有一个容错应用程序的愿望不应该对应用程序的设计产生太大的影响。既然如此,为什么要找演员麻烦呢?使用一个需要阅读每个行为者的实现的框架,以便理解复杂的类似意大利面的消息结的工作流程,要比使用基于层次结构的框架容易得多,这些框架可以通过查看方法签名在任何程度上显示出来,而不一定要查看它们的实现。

如果只有一小部分应用程序是由参与者实现的,那么参与者的许多好处,例如容易扩展,似乎不那么相关或不实用。

EN

回答 1

Stack Overflow用户

发布于 2017-11-21 10:17:50

我认为你对演员“锁定”的理解是不正确的。

你写

但另一方面,它会保持N-1线程(每个初始请求)

你在这里描述的场景还不清楚。使用的线程数不是由参与者层次结构中的参与者数量或层数决定的,而是由运行参与者的调度程序决定的,请参阅https://doc.akka.io/docs/akka/2.5/dispatchers.html?language=scala

演员通常不会产生新线程,也不会在空闲时阻塞任何东西。它将处理(可配置的)多个消息,然后将控制返回给dispatcher。所以在多线程方面,Akka与你所怀疑的相反,是非常高效的。

如果你试图保持这个角色的等级,但是把对每个演员的调用包装在一个未来(通过问孩子演员,而不是告诉),那么锁定就会短得多

那一定是误会了。向另一个线程发送消息的参与者不会阻塞线程。还不清楚你指的是什么“锁定”。而且,ask使锁更短的假设显然是有缺陷的,因为没有锁定。

也许你担心的是利用演员的阻拦IO?这确实会阻塞正在执行的线程。这里的“诀窍”是将阻塞调用放在单独的调度程序上,请参阅https://doc.akka.io/docs/akka/snapshot/dispatchers.html?language=scala

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

https://stackoverflow.com/questions/47404397

复制
相关文章

相似问题

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