2015-09-07 57 views
2

將消息傳遞給間接相關參與者的最佳方式是什麼?假設我有5個演員,其中每個演員都是先前演員(父母)的孩子,演員#2有多個孩子。最底層的演員#5(演員#1是否在這個例子的頂部)能夠充分傳遞一個消息給演員#2的間接相關兒童之一?下面將消息傳遞給間接相關的參與者

素描:箭頭指向童星表示消息

現在,我得到的是,這裏的演員選拔機制的工作,但根據官方文檔阿卡,應避免使用,除非你正在利用遠程的。那麼,最好是在某個地方舉辦一次全球單身人士參考演員#1並從那裏傳遞消息?如果這條鏈變得更復雜會怎麼樣?我忘了一些邪惡的設計模式來解決這個問題嗎?

如果以前回答過類似的問題,我會很感激,如果您可以將其鏈接到我,因爲我找不到它。

具體而言,我目前在Java中使用Akka。基於Scala的解決方案也受到歡迎。

child actor

回答

0

我看到2種方式:

  1. 通行證孩子的ActoRef在構造函數#5演員。
  2. 讓另一位演員擔任「接待員」,該接待員將持有所需的ActorRef s列表,並將其作爲對某些提問信息的回覆發送給他們。
+0

我不喜歡不得不多次傳遞同一個演員參考。它可能會在服務被隔離和鬆散耦合的複雜架構中破壞語義。我更喜歡第二種解決方案,但它並不完全符合我的要求。 – ExecutorService

+1

如果你想要孤立和鬆散耦合的服務,我想你應該使用actorSelection – ka4eli

3

在這種情況下,我不會有使用Actor選擇的問題,但是文檔並沒有聲明當使用refs時可以避免Actor選擇。如果您以這種方式將許多來自演員#5的消息發送給同一個孩子,則可以先使用演員選擇以獲得具有resolveOne的演員引用,然後使用該ActorRef進行後續通信。也許是一個合理的妥協。

如果你不想使用Actor選擇,我不會使用全局單例,而是使Actor的構造函數的actorRef部分成爲Actors 3,4和5,以便引用傳遞給Actor 5我認爲它警告說,不要演員選擇同一文件給出了答案選擇:

在可演員創作或 初始化期間提供ActorRefs所有其他情況下,由父母傳遞他們的孩子或引入 演員將他們的ActorRefs發送給消息中的其他Actor。

一個比較另類,是使用發佈和訂閱機制:http://doc.akka.io/docs/akka/snapshot/scala/event-bus.html

如果兒童演員已訂閱的頻道,演員#5可以將消息發佈到通道,而無需知道的身份訂戶。

+0

http://doc.akka。io/docs/akka/2.3.13/java/untyped-actors.html#Identifying_Actors_via_Actor_Selection 「使用ActorRef而不是依賴ActorSelection與其他Actor進行通信總是可取的,例外是 使用At-最少一次交付設施 發起與遠程系統的第一次聯繫「 – ExecutorService

+0

謝謝。 TBH,我認爲文檔的相同部分爲您提供了最佳答案「在所有其他情況下,可以在Actor創建或初始化期間提供ActorRefs,將它們從父母傳遞給子代,或者通過將其ActorRefs發送給消息中的其他Actor來引入Actor。 – mattinbits

+0

這很糟糕:/。我誠實地希望爲Akka提供更好的解決方案。 – ExecutorService