2016-07-15 30 views
4

我工作的一個示例服務Fabric項目,在這裏我要保持一個購物清單。爲此,我有一個ShoppingList actor,可以通過特定的ID進行標識。它使用StateManager將當前列表內容存儲在其狀態中。一切正常。服務織物演員 - 保存狀態數據庫

然而,在並行我想保持在一個SQL數據庫的購物清單的內容。特別是:

  • 店內所有添加/刪除,供日後分析項目請求(ML)
  • 從DB第一男主角初始化加載列表內容(例如集羣已經在重新創建)

什麼是實現這一目標的最佳方法?創建一個自定義StateProvider(如何?找不到示例)? 或者,也許有處理所有數據庫操作(可能使用隊列和提醒)其他服務/演員?

所有的例子似乎完全依靠默認StateManager,沒有數據持久化到外部存儲設備,所以我不知道什麼是最好的做法。

回答

5

的最佳方式將是有專人負責將數據存儲到數據庫的獨立實體。演員只會發送一個事件(並不意味着SF事件)和一些關於執行操作的數據,另一個實體會捕獲它並執行其餘的工作。

但是,當然,你可以實現在演員本身這個東西,但它會帶來兩個可能的問題:

  • 演員將無法處理其他請求是否會有與DB或之間連接的一些問題演員和數據庫,或者是否會有高負載的數據庫本身,它會緩慢地處理請求。演員將不得不等待轉移到數據庫成功完成。
  • DB的可能的過載與來自許多行爲者,而不是一個或與另一實體和批量插入幾個連接許多單個連接。

所以,你的最終解決將取決於你的系統的工作量。但是,如果這些數據的價值太高而不能承受損失,那麼您肯定需要一個可靠的隊列來安全地將數據存儲在數據庫中。

另外,我覺得你可以使用默認狀態管理器來存儲日誌和有關交易前將被轉移到數據庫和事務完成之後,從一個服務的狀態中刪除。沒有必要在服務中永久存儲這些數據。

而另一件事情要考慮 - 從數據庫讀取。也許,如果你有關係數據庫,將與新的紀錄只有一個表更新+是否會有演員,將查詢在激活這樣的大數據量,你將有性能下降,因爲這表將被鎖定爲讀或寫,如果你將不會將其配置爲表現不同。因此,您可能需要緩存系統來讀取演員激活的數據 - 取決於您的工作量。

並且將其實現您的自定義狀態管理器:看看this例子。基本上,所有你需要做的是落實IReliableStateManagerReplica接口,並把它傳遞給StatefullService構造函數。