2014-06-08 32 views
10

我目前正在制作一个相当大的基于Akka的Java应用程序,并且遇到了一些问题,这些问题让我感到无法接受。Akka消息和演员的命名约定

我目前的封装布局看起来有点像这样:

Project Structure

Mobile类作为actors包里面的演员监事。

因为我不希望创建一组新演员的每一个HttpClientAccount,我与端点ActorRef接收最后的结果通过周围那些消息对象,其存储在信息包,一起。但是,这会产生一个非常混乱的messages包,每个演员都有不同的消息。例如。 MobileForActor1Actor1ForMobileMobileForActor2等。现在我的问题是,有没有使用这种东西,这个问题涉及和是我的结构(Mobile - >Actor1 - >Mobile - >Actor2 - >等)公约的方式阿卡想要它或我必须只是瀑布消息(Mobile - >Actor1 - >Actor2 - >等)?

现在我发送ConnectMessageMobile演员,然后将其发送到Actor1Actor1过程,并发送一个新的消息发回MobileMobile发送一个响应然后Actor2如此循环下去,用新的消息根据旧消息创建。例如。 new Message2(message1.foo, message1.bar, message1.baz, newComputatedResult, newComputatedResult2, etc);

这是一个很好的做法,还是应该包含旧的实例(可能包含无用的信息)并包含新的东西?例如。 new Message2(message1, newComputatedResult, newComputatedResult2, etc);

或者我应该做一些完全不同的事情吗?

我想过使用TypedActors,但那些需要使用瀑布模式,我不知道如何通过想要接收最终结果的侦听器的ActorRef。

我希望我让自己足够容易理解,因为英语不是我的少女语言,这个问题对每个人都是清楚的。

我是Akka的开发者,很喜欢这个主意,但由于文档没有很好地介绍,所以我觉得这是最好的地方。谢谢阅读!

回答

7

我会冒昧一些评论回应这个,因为我已经处理了我学习曲线中的相同问题。我认为你需要一些经验法则,这样我的信息才包含在这里。

首先,创建演员是非常便宜;它们非常轻便。那么,为什么不为每个HttpClient和Account创建一个,并给他们从他们的身份派生出合适的名字呢?这也避免了你必须尽可能多地传递它们,可能会让你的代码黯然失色。

其次,保持您的消息名称短,集中并以动词开头。每条消息都应该告诉演员做一些事情,以便通过使用动词让名称反映出来。

三,消息集与演员一起去。我通常在演员类的同伴对象中声明它们,以便使用它们就像ActorClass.MessageName,除非它在ActorClass之内,然后它只是MessageName

四,向演员的名字追加一个计数器。我经常只是将一个计数器(使用AtomicInteger)与该类型的名称(Car-1Car-2等)组合在一起。

如果层次结构对您很重要,我会建议只将父行动员附加到名称上。类似Phone-1-in-Car-7含义Phone-1包含在Car-7内。然后,您可以通过遵循父链接以编程方式和手动方式来组装层次结构。

我认为ConnectMessage中的“消息”是多余的。只需将消息名称设置为“连接”即可,甚至更好“ConnectToThing”(无论Thing是什么,如果相关的话)。

我不会像您建议的Message2那样将您的消息名称过多。使用最少量的信息对任何要阅读这些名字的人都有用。我认为对这个问题的回应可能是由于这部分问题导致的。由于缺少很多细节,我发现它很混乱。

希望这会有所帮助。

+0

你能举出一些好消息命名的例子吗?例如,我有一个供应商和消费者。消费者想问供应商它有多少商品。你如何为请求和响应命名消息? –

+0

@TemaBolshakov - “GetGoodsCountRequest”和“GetGoodsCountResponse”如何? –

+0

不确定这些名称在scala中足够习惯用法。我喜欢第一个,但后面看起来有点多余。用Int来回应可能更好?或者为Int定义类型别名,例如'输入GoodsCount = Int'。斯卡拉最好的选择是什么? –