为Akka演员池分类共享邮箱或公共汽车?

时间:2013-06-05 14:44:41

标签: algorithm scala sorting concurrency akka

我正在尝试同时学习Scala和Akka并且它很棒但有时候也有点混乱,我很抱歉我的问题碎片化。

我理解演员模特。有演员,他们发送和接收消息,他们有一个邮箱来存储收到的消息,邮箱可以优先处理消息,然后一切都变得混乱。

我一直在阅读很多,而且我读的越多,我就越困惑,所以我希望有人可以提供一些帮助,将混乱程度降低到可接受的最低限度。指针是受欢迎的,但我可能需要一些小胶水解释将所有内容放在一起,基本上对RTFM有所帮助。

问题是:

  1. 如何在收件箱中对邮件进行排序?我读过关于“implicits”(在有序的邮箱中),但这听起来像魔术。我认为已排序的邮箱只接受实现Comparable接口的类型,但在这里Scala使用函数范例并接受ordering函数,如果我没有弄错,它返回Ordering[T]。但是,排序功能(处理T?)可能仅限于可比较的对象,因此,返回Comparable
  2. 是否有可能共享邮箱?
  3. 这里应该使用一些总线的实现吗?可以对公交车进行分类吗?
  4. 什么是implicit abstract def?它看起来像应该实现的方法(abstract),但不需要实现(implicit),这听起来像是一个矛盾。 (这是SortedSet
  5. 中的定义
  6. 我应该定义Dispatcher吗?我无法弄清楚它在整个架构中是如何匹配的。但我一直在寻找游泳池,而是寻找调度员。
  7. 我应该阅读有关Future的内容吗?我正在尝试通过一个小的实现来逐步掌握概念,在一个循环的阅读和编程中。很抱歉这么多问题。
  8. 我到目前为止所考虑的解决方案包括:

    1. 让一个Actor作为沟通的中心节点。
    2. 这个中央Actor保留一个SortedSet,将要分派给演员池的消息排入队列
    3. 这个中心演员还有一个免费的演员Set
    4. 当一个Actor是免费的(在处理任何消息之后),免费演员向中央演员发送一条消息,要求做一些工作。
    5. 中央演员处理消息:
      1. 如果有待处理的工作,则会将需要处理的消息出列。
      2. 如果没有工作要做,就会存储对自由球员的提及给他一些工作。
    6. 中心角色类似地处理带有工作任务的消息。
      1. 如果有自由演员,则该作业将被发送给自由演员。
      2. 如果没有免费演员,则该作业将添加到SortedSet
    7. 只需创建演员池并将所有引用发送给中央管理员即可创建演员池。
    8. 我已经想到了这个解决方案,因为我对Scala和Akka都不是很了解。但我不想永远坚持这种解决方案。基本上演员可以做任何事情,但我想正确使用它们并正确使用所有其他元素作为邮箱,公共汽车,游泳池,调度员,期货等。

      非常感谢。

1 个答案:

答案 0 :(得分:2)

  • 1& 2& 5:Akka关于调度员的文档很好地解释了调度程序是什么以及如何定义和使用调度程序。它还记录邮箱,如何定义自己的,可能优先级的邮箱以及多个角色如何共享单个邮箱: http://doc.akka.io/docs/akka/2.1.4/java/dispatchers.html

  • 3:AFAIK,Akka中的默认EventBus,不允许对邮件进行排序

  • 4:implicit abstract def定义了abstract方法,该方法也是implicit。隐含和抽象成员是正交概念,因此这里没有矛盾。也许你想定义一个隐式转换并将它的实现委托给一个子类。

  • 6:是的,期货是一个重要的部分,不仅仅是在Akka,而是一般的Scala并发。

关于您的特定设计问题,可能更简单的解决方案是使用路由器。路由器是特殊的角色,根据策略将传入的消息发送到其注册的路由器。

http://doc.akka.io/docs/akka/2.1.4/scala/routing.html

在您的情况下,您将用路由器替换您的中央演员。如果您的邮件需要优先排序,则可以为该路由器配置优先邮箱。

接近您所描述的行为的路由器将是SmallestMailboxRouter

如果你确定需要使用积累信息的中央演员,那么在监督这个演员时要特别小心。默认情况下,失败的actor会重新启动,因此您最终可能会丢失保存邮件的SortedSet。这是使用自定义邮箱的另一个原因:您将actor状态与消息排序语义分离。