斯卡拉 – 阿卡调度模式
考虑经典的“字数”计划.它计算某些目录中所有文件中的单词数. Master接收一些目录并在Worker actor之间拆分作业(每个worker使用一个文件).这是伪代码:
class WordCountWorker extends Actor { def receive = { case FileToCount(fileName:String) => val count = countWords(fileName) sender ! WordCount(fileName,count) } } class WordCountMaster extends Actor { def receive = { case StartCounting(docRoot) => // sending each file to worker val workers = createWorkers() fileNames = scanFiles(docRoot) sendToWorkers(fileNames,workers) case WordCount(fileName,count) => // aggregating results ... } } 但我希望按计划运行此字数统计程序(例如每1分钟),提供不同的扫描目录. 而Akka为调度消息传递提供了很好的方法: system.scheduler.schedule(0.seconds,1.minute,wordCountMaster,StartCounting(directoryName)) 但是上述调度程序的问题在调度程序通过tick发送新消息时启动,但之前的消息尚未处理(例如我发送消息扫描一些大目录,1秒后我发送另一条消息来扫描另一个目录,因此操作第一个目录的处理尚未完成).因此,我的WordCountMaster将从处理不同目录的工作人员收到WordCount消息. 作为一种解决方法而不是安排消息发送,我可以安排执行某些代码块,每次创建新的WordCountMaster时都会创建.即一个目录=一个WordCountMaster.但我认为它效率低下,而且我还需要关心为WordCountMaster提供唯一的名称以避免InvalidActorNameException. 所以我的问题是:我是否应该像上面提到的那样为每个刻度创建新的WordCountMaster?或者有一些更好的想法/模式如何重新设计该程序以支持调度? 一些更新: >命名演员的问题
和
我可以克服这个问题而不提供演员姓名.但在这种情况下,我的演员会收到自动生成的名字,比如$a,$b等.这对我来说并不好. >配置问题: 我想将我的路由器的配置排除在application.conf之外.即我想为每个WordCountWorker路由器提供相同的配置.但由于我不控制演员姓名,所以我不能使用下面的配置,因为我不知道演员姓名: /wordCountWorker{ router = smallest-mailbox-pool nr-of-instances = 5 dispatcher = word-counter-dispatcher } 解决方法
我不是Akka专家,但我认为每个聚合有一个演员的方法效率不高.您需要以某种方式保持并发聚合的分离.你可以给每个聚合一个id,所以让它们在一个唯一的主演员中用id分隔,或者你可以使用Akka actor命名和实时循环逻辑,并将每个计数轮的每个聚合委托给一个活着的演员只是为了那个聚合逻辑.
对我来说,每个聚合使用一个演员似乎更优雅. 另请注意,Akka具有here所述的聚合模式的实现 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- 运用CXF开发webService接口服务端和客户端
- Activiti webService task演示实例
- angularjs – 更好的设计,将数据传递到其他ng-view,并在控制
- ServiceMix做内部服务器发布WebService(附带案例源码)
- docker – 如何设置Kubernetes发布的容器的workdir
- plone – 在几个UNIX用户之间共享buildout-cache / eggs
- twitter-bootstrap – 一页上有几个容器
- Linux入侵检查思路及其命令
- scala – 无法使用sbt运行简单的akka??示例
- webservice之实现一个基于JWS的webservice项目