2017-01-02 147 views
1

我最近開始搞亂阿卡的演員和http模塊。然而,我偶然發現了一個令人討厭的小怪癖,那就是創建singelton演員。阿卡和單身演員

這裏有兩個例子:

1)

我有一個內存緩存,我的服務是相當小的(其應用程序,而),所以我很喜歡這在內存模型。我可以在地圖中保存與用戶有關的大部分信息(以及列表圖,但仍然很容易推理結構),而且我沒有獲得redis,geode或aerospike的開銷和複雜性。

唯一的問題是這個內存chache可以被多個源修改,並且所述修改必須是同步的。我認爲我只是將結構和訪問方法包裝到一個actor中,構建消息隊列,容易接收 - >發送邏輯,而不是將這個結構的所有3個接入方法同步(例如通過構建消息隊列或實現鎖定)如果事情擴大,那麼使用內存數據庫中的專用數據庫替換DA角色將非常容易。我有一個「服務」層,應該用來爲各種作業調度角色(訪問數據庫,訪問內存中的緩存,使用數據執行此計算並將結果傳遞給用戶...等等)。

它使服務層成爲排序的「單例」,對某些函數進行封閉,因爲它沒有任何阻塞或CPU /內存密集的任何方式,它只是將任務進一步分配到下一行如決定請求應該有多少演員/線程/我們應該創建和去哪裏)

但是,這件事情需要之一:

a)使這兩個對象的單身者或

b)製作這兩個對象都是實際的「對象」(如在scala對象表示法中,它指定一個帶有fu的單名單例)在其範圍內關閉的節點)

b)存在很多問題,即服務層要麼必須讓一個actor系統「通過」它(我不確定這是一個最佳實踐)爲了創建參與者,而不是創建自己的「孩子」,它將使用全球參與者系統創建孩子,而消息傳遞和監控邏輯將更加尷尬和不直觀。此外,內存緩存不會有內置消息隊列的優勢(我不是說它很難實現一個,但這似乎是其中一種情況,其中之一是「哦,快活,它的好處我有演員,我不必花時間來實施和測試這個代碼「)

a)似乎有一個問題,一般來說,在akka文檔中通常沒有文檔記錄和未被記錄。我的意思是:

http://doc.akka.io/docs/akka/2.4/scala/cluster-singleton.html

看看這個狗屎,在文檔中有一半是警告不要使用它,它是它自己的依賴,並坦率地說,它非常難以閱讀的可憐的傢伙像我這樣還沒有併入編程的象牙塔&。

所以,啊。你們中的任何一個人可以向我解釋爲什麼它不好使用單身演員?你如何設計單身人士,如果他們不能成爲演員?有沒有什麼辦法可以設計出不會造成很多傷害的單身演員?整個「服務」模型是否具有「全球」服務而不是實例化的「un akka like」?

回答

1

只是爲了澄清文檔,他們沒有警告不要使用它。他們警告說,在某些情況下,使用單身人士會導致問題,這是根據具體情況而定的。他們提到以下幾種情況:

  • 如果單身人士是性能瓶頸。這是有道理的。如果一切都依賴於一個緩慢運行的單個對象,那麼一切都將變得緩慢。
  • 如果演員需要不停地使用,如果單身人士不得不遇到問題,因爲這些消息不能僅由另一個實例處理。在恢復工作之前,需要一段時間重新啓動單身人士。
  • 如果您打開了自動關閉功能,則會發生最大的問題。自動關閉是假定無法訪問的節點關閉並從網絡中刪除的策略。如果你這樣做了,但是節點實際上並沒有關閉,但由於網絡分區而無法訪問,分區的兩邊都會決定它們是存活的節點並創建它們自己的單例。所以現在你有兩個單身人士。當然,這不是你想要從單身人士那裏得到的。但是你不應該在測試之外使用自動關閉。這是一個可怕的恢復策略,包括測試的完整性和方便性。

所以我不認爲這是建議不要使用它。根據結構的性質,如果你確實使用了它,就要明確預期的缺陷。