2017-09-13 50 views
0

我一直在研究Akka一段時間,我正在構建一個利用actor模型並需要維護與數據庫的連接的應用程序,但我有一個兩難的問題:我在哪裏放置這個連接,以及如何管理它?如何使用Akka actors管理數據庫連接?

這是我的推理至今:

  • 連接應僅進行一次初始化。
  • 由於連接代表一個狀態,它應該駐留在一個actor中。我們稱這個actor爲DatabaseConnection(只是爲了創造性)。
  • 由於我不想分享演員的狀態,因此所有查詢都應該在演員內部發生。
  • 我使用的數據庫驅動程序是reactive-mongo,因此每個查詢都會返回一個可以傳送給發件人的Future。

儘管查詢是通過期貨完成的,但我不禁想到這個模型無法擴展。只有一個線程管理所有數據庫訪問消息?即使利用期貨,這聽起來也是不合理的。 我曾經想過要讓小孩工作來管理數據庫查詢,但我將不得不與孩子分享聯繫。 我喜歡這最後的想法,因爲如果DatabaseConnection actor死了,它的所有孩子都會在理論上死去。但我不知道是否有另一種更好的方式來解決這個問題,而不分享國家。在那兒?

+0

[Akka and ReactiveMongo]的可能重複(https://stackoverflow.com/questions/18638570/akka-and-reactivemongo) – cvargascr

+0

[ReactiveMongo:單個連接池實例vs很多連接池實例與多個連接池的可能重複](https://stackoverflow.com/questions/45859204/reactivemongo-single-connection-pool-instance-vs-many-connection-pool-instances) – cchantep

回答

0

基於反應型mongo的example code,它看起來不像Actor封裝是必要的。檢查代碼示例:

val collection = db[BSONCollection]("articles") 

val query = BSONDocument() 

val cursor = collection.find(query).cursor[BSONDocument] 

val futureList = cursor.toList 

collection對象已經作用就像它封裝「連接」的狀態,並且響應於「查詢」與Future結果的實體。這幾乎是您正在考慮創建的演員的確切定義。

包裝紙的演員身體的內部上面的代碼似乎並沒有給你買了...

0

ReactiveMongo,作爲當前0.12.6版本,本身就是建立在阿卡。主要處理組件(裝here演員:

trait MongoDBSystem extends Actor { 
    ... 
} 

基本上,ReactiveMongo已經實現你想實現什麼,所以如果你使用ReactiveMongo,有一個在嘗試處理沒有意義與你自己的演員中的低級連接細節。

如果您想了解使用actors來處理連接和服務請求的一種方法,請研究ReactiveMongo的實現。除了上面鏈接的MongoDBSystem特性外,請查看MongoDriverMongoConnection類,以及DriverSpec中的測試。