我目前正在制作一个非常大的基于Akka的Java应用程序,而且我遇到了一些让我感到困扰的问题。
我目前的包装布局看起来像这样:
我的Mobile
课程担任actors
包中演员的主管。
由于我不想为每个HttpClient
和Account
创建一组新的Actors,我会将这些A +传递给存储在messages包中的消息对象,以及接收最终结果的端点ActorRef
。但是,这会创建一个非常混乱的messages
包,每个actor都有不同的消息。例如。 MobileForActor1
,Actor1ForMobile
,MobileForActor2
等等。现在我的问题是,是否有一个公约用于处理此问题的这类内容并且是我的结构(Mobile
- > Actor1
- > Mobile
- > Actor2
- >等。)Akka想要它的方式或者我必须对消息进行排序({ {1}} - > Mobile
- > Actor1
- >等)
现在我将Actor2
发送给我的ConnectMessage
演员,然后将其发送给Mobile
,Actor1
处理它并发回新消息Actor1
,Mobile
然后将该响应发送到Mobile
,并且循环继续,并根据旧消息创建新消息。例如。 Actor2
这是一个好的做法,还是应该包含旧实例(可能包含不再有用的信息)并包含新内容?例如。 new Message2(message1.foo, message1.bar, message1.baz, newComputatedResult, newComputatedResult2, etc);
或者我应该做一些完全不同的事情?
我考虑过使用TypedActors,但是那些需要使用瀑布模式,我不知道如何传递想要接收最终结果的侦听器的ActorRef。
我希望自己能够理解,因为英语不是我的母语,每个人都清楚这个问题。
我是Akka开发人员并且很喜欢这个想法,但由于文档没有很好地涵盖这一点,我认为这将是最好的问题。谢谢阅读!
答案 0 :(得分:9)
我会冒一些评论来回应这个,因为我在Akka的学习曲线中处理了同样的问题。我认为你要求一些经验法则,因此我的内容包含在内。
首先,创造演员非常便宜;它们非常轻巧。那么,为什么不为每个HttpClient和Account创建一个,并为它们提供从其身份派生的合适名称?这也避免了你必须尽可能多地传递它们,可能会使你的代码整齐。
其次,保持消息名称简短,重点突出并以动词开头。每条消息都应告诉演员做某事,以便你希望名字通过动词反映出来。
第三,消息集与演员一起发送。我通常在actor类的伴随对象中声明它们,因此使用它们就像ActorClass.MessageName
,除非它在ActorClass
内,然后它只是MessageName
。
第四,在演员的名字附加一个计数器。我经常只将计数器(使用AtomicInteger
)与类型名称(Car-1
,Car-2
等)组合在一起。
如果层次结构对您很重要,我建议只将父actor附加到名称。类似Phone-1-in-Car-7
的含义Phone-1
包含在Car-7
中。然后,您可以通过遵循父链接以编程方式和手动方式组合层次结构。
我认为"消息"在ConnectMessage
中是多余的。只需将消息名称设为" Connect"甚至更好" ConnectToThing" (无论如何,如果相关的话)。
我不会像你在Message2
建议的那样过多地复制你的信息名称。使用最少量的信息对于读取这些名称的任何人都有用。我认为这部分问题可能导致对此缺乏回应。我发现它很混乱,因为很多细节都没有了。
希望这会有所帮助。