2014-06-08 35 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'。斯卡拉最好的選擇是什麼? –