我正在学习Scala及其Actors(通过Akka lib)处理并发的方法。 在尝试将典型的OOP(思考 - Java风格的OOP)场景转换为基于Actor的场景时,我遇到了一些问题。

让我们考虑过度使用的电子商务示例Webstore,其中客户正在制作包含项目的订单。 如果以OOP样式进行模拟,则最终会得到适当命名的域模型类,这些类通过相互调用方法在它们之间进行交互。

如果我们想要模拟并发性,例如许多客户立刻购买物品,我们会抛出某种线程(例如通过ExecutorService)。 基本上每个Customer然后实现Runnable接口及其run()方法调用,例如shop.buy(this,item,amount)。 由于我们希望避免由可能同时修改共享数据的许多线程引起的数据损坏,因此我们必须使用同步。 所以最常见的事情是同步shop.buy()方法。

现在让我们转到基于Actor的方法。 据我所知,Shop和每个客户现在成为Actors,而不是直接在商店上调用buy()方法,向商店发送消息。 但是这里遇到了困难。

  1. 是否所有其他域模型(Order,Item)都成为Actors,并且所有域模型之间的所有通信都是消息驱动的? 换句话说,通过方法调用在域模型之间留下一些OOP样式交互是否可行是一个问题。 例如,在基于OOP的方法中,Order通常会引用List,当用户通过在buy()方法中调用add(item)来购买时,可以填充List。 这种(和类似的)交互是否必须通过消息传递进行重新构建,以充分利用基于Actor的方法? 换句话说,我们何时直接与演员的内部状态沟通,何时将内部状态提取给另一个演员?
  2. 在基于OOP的解决方案中,您将传递给类的方法实例。 我在文档中读到,在Actor模型中,我应该传递不可变的消息。 因此,如果我理解正确,您只需要发送一些数据,而不是消息传递对象本身,这样就可以识别哪些实体需要处理,例如通过消息传递ID和您想要执行的操作类型。

===============>>#1 票数:3 已采纳

回答你的问题:

2)您的域模型(包括商店,订单,买家,卖家,商品)应使用不可变的案例类进行描述。 Actor应该交换(不可变)命令,这些命令可以使用这些类,如AddItem(count: Int, i: Item) - AddItem case类表示命令并封装名为Item业务实体。

1)您的协议,例如商店,订单,卖家,买家等之间的交互,应该封装在actor内(每个协议一个actor类,每个州一个实例)。 简单地说,一个演员应该管理任何(可变的)状态,在请求之间切换,比如当前的购物篮/订单。 例如,您可以为每个购物篮配备演员,其中包含有关所选项目的信息并接收AddItemRemoveItemExecuteOrder等命令。 因此,每个业务实体都不需要actor,每个业务流程都需要actor

此外,还有一些最佳实践以及有关使用路由器管理并发性的建议。

PS最近的基于JavaEE的方法是EJB及其实体(作为案例类)和消息驱动的bean(作为actor)。

  ask by mmierins translate from so

未解决问题?本站智能推荐:

1回复

SavingsBankAccount程序中Scala演员的用例

这不是任何形式的任务。 我正在学习学习Scala和Scala并发性,最好是与Akka Actors一起学习。 我执行此操作的方法之一是提出一些简单的程序设计,然后尝试提出一个涉及将Actor /并发应用于设计的实现: 我要编写的程序是具有输入部分和输出部分的储蓄银行帐户应用程序。 X
3回复

Scala:您知道任何高级Actor文档/教程吗?

我已经与Scala合作了一段时间,并且我开始对并发进行更深入的研究。 凭借我对Java并发的了解,我已经完成了我必须要做的简单事情,但是我试图进一步挖掘Actors的世界。 问题是我找不到任何高级教程或文档,而不是这个: http://docs.scala-lang.org/ove
3回复

阻止Akka Actors中的呼叫

作为一个新手,我试图了解演员的工作方式。 而且,从文档中,我认为我理解actor是以同步模式执行的对象,并且actor执行可以包含阻塞/同步方法调用,例如db请求 但是,我不明白的是,如果你编写一个内部有一些阻塞调用的actor(比如阻塞查询执行),它会搞乱整个线程池(从某种意义上说cp
1回复

使用Akka 1.3的actor时,我需要照顾生产者/消费者比率吗?

在使用Akka 1.3时,我是否需要担心产生消息的参与者产生消息的速度比消耗消息的参与者处理消息的速度快? 没有任何机制,在长时间运行的过程中,队列大小将增加以消耗所有可用内存。 该文档说默认调度程序是ExecutorBasedEventDrivenDispatcher。 该调
1回复

Akka演员没有收到Array [Byte]吗?

我正在尝试编写一个actor,以计算收到的特定数量的消息时它接收和打印的消息的数量。 当我将消息作为字符串发送给actor时,它可以正常工作,但是当我尝试发送和Array [Bytes]时,actor不会执行它的接收功能,但是它也不会调用其他catch案件。 处理有效字符串的代码:
1回复

与Akka Actor进行可变状态的非阻塞更新

编辑:意图的澄清: 我有一个(5-10秒)scala计算,可以在给定的时间点聚合来自许多AWS S3对象的一些数据。 我想通过REST API提供此信息。 我还想每隔一分钟左右更新一次此信息,以便在此期间将新对象写入该存储桶。 摘要本身将是一个大的JSON Blob,并且如果我缓存来
1回复

如何停止所有演员并等待他们终止?

我正在为我的Akka项目实施单元测试。 为了避免InvalidActorNameException等,我希望在运行下一个单元测试之前停止在一个单元测试中创建的所有actor。 因此,对于在单元测试中创建的每个_system.stop(someActorRef) ,我在其末尾调用_system
2回复

Akka演员应该做真正的处理任务吗?

我正在编写一个应用程序来读取相对较大的文本文件,验证并转换数据(文本文件中的每一行都是一个自己的项目,大约有100M项目/文件)并创建某种输出。 已经存在一个多线程Java应用程序(在读取/处理/持久化任务之间使用BlockingQueue ),但我想实现一个同样的事情的Scala应用程序。
5回复

演员可以在特定条件下阅读消息吗?

我有这种情况: ActorA每30-40秒发送一次ActorB开始/停止消息 ActorA发送ActorB字符串进行打印(总是) ActorB必须打印他收到的字符串,但前提是ActorA只发送了一条开始消息 现在我想知道我是否可以做以下事情: Acto
2回复

Akka演员:需要一个例子来理解一些基础知识

我正在修补Akka并需要一些建议如何实现我想到的具体内容。 我想有一个演员,我可以发送DownloadFile(URI, File)消息并下载它。 由于这可以并行,我不想一个接一个地下载文件但是有并发下载限制。 什么是用Akka模拟这样的东西的预定方式? 其他想到的事情是:如果某个“