2016-12-27 111 views
0
  1. 主要用於akka原始人Actor - 任何狀態變化或狀態查詢通過異步消息的人辦理。阿卡:演員的組合和代理

  2. Akka還提供了一個鮮爲人知的原始碼Agent,它是由新值(或通過修改其值的函數)異步更新的。ans可以從任何線程同步讀取。

問題:在單JVM演員系統,如何將這些方法結合起來:具有通過異步更新原始。只有消息(如Actor),但哪個狀態可以直接以線程安全方式讀取(如Agent

我真的很感激鏈接到任何相關的討論/項目/樣本。

解決方案,我發現迄今:

  1. 明顯的可能性是有Actor其更新 Agent。但我想知道是否有更優雅的&高性能解決方案。
  2. Scalaz Agent,但沒有scalaz依賴性的解決方案將是首選。
  3. 中途骯髒的解決方案:中斷Actor通過發佈(在外發郵件中)功能來讀取actor的狀態,類似於Agent.get()。線程安全性必須手工處理。
  4. 變通方法:讓Actor更新中的某些外部共享狀態。線程安全性必須手工處理。

回答

1

注意劑已被標記爲由阿卡隊棄用,並會在下一個主要版本(2.5.0可能)被移除。 This是相應的票證。

確實,Akka的核心思想是鼓勵異步溝通,所以我認爲從這個角度來看,溝通代理是有意義的。

另一種解決方案可能是使用Actor並異步訪問其狀態。如果此場景涉及到您作爲Get消息可能需要等待,直到處理幾條Update消息,則可以考慮先使用優先郵箱處理Get消息。示例here