我正在尝试同时学习Scala和Akka并且它很棒但有时候也有点混乱,我很抱歉我的问题碎片化。
我理解演员模特。有演员,他们发送和接收消息,他们有一个邮箱来存储收到的消息,邮箱可以优先处理消息,然后一切都变得混乱。
我一直在阅读很多,而且我读的越多,我就越困惑,所以我希望有人可以提供一些帮助,将混乱程度降低到可接受的最低限度。指针是受欢迎的,但我可能需要一些小胶水解释将所有内容放在一起,基本上对RTFM有所帮助。
问题是:
Comparable
接口的类型,但在这里Scala使用函数范例并接受ordering
函数,如果我没有弄错,它返回Ordering[T]
。但是,排序功能(处理T
?)可能仅限于可比较的对象,因此,返回Comparable
?implicit abstract def
?它看起来像应该实现的方法(abstract
),但不需要实现(implicit
),这听起来像是一个矛盾。 (这是SortedSet
)Dispatcher
吗?我无法弄清楚它在整个架构中是如何匹配的。但我一直在寻找游泳池,而是寻找调度员。Future
的内容吗?我正在尝试通过一个小的实现来逐步掌握概念,在一个循环的阅读和编程中。很抱歉这么多问题。我到目前为止所考虑的解决方案包括:
SortedSet
,将要分派给演员池的消息排入队列Set
。SortedSet
。我已经想到了这个解决方案,因为我对Scala和Akka都不是很了解。但我不想永远坚持这种解决方案。基本上演员可以做任何事情,但我想正确使用它们并正确使用所有其他元素作为邮箱,公共汽车,游泳池,调度员,期货等。
非常感谢。
答案 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状态与消息排序语义分离。