2013-10-30 26 views
1

我有一套數據庫文檔(幾千),我想運行一些數據遷移活動。這些文檔中的每一個都包含對Windows文件系統中不同文件的引用。這些文件存儲在通過共享文件夾訪問的文件服務器中。我想要做的是將文件移動到文件系統中的不同位置,根據文檔中的屬性重新排列文件。Akka是否根據可用資源來規範演員?

我已經想好了以下設計:

  1. 有一個演員,查詢數據庫和滋生每個文檔一個演員
  2. 每個參與者將負責複製其相關 文件,其新的位置和,處理任何異常
  3. 當這些參與者完成其任務,它會通知結果的 中心演員(成功/失敗)

這是一個天真的設計?我應該扼制創建了多少演員,還是Akka基於處理器可用性來調節分配的資源?在文件系統方面是否存在任何問題,同時有太多請求處於活動狀態?

+0

offtopic:我想在這個特殊的情況下,你將得到更好的去與並行收集。 –

+0

@ om-nom-nom:有趣。你的意思是擁有一個帶有(sourcePath,destinationPath)元素的集合,然後用一個基於複製操作結果返回成功/失敗的函數映射它? – Eduardo

+0

是的,或多或少:'val xs = Seq(src - > dst,...); xs.par.map {Try(...)}'+ [parallelism hint](http://stackoverflow.com/q/14207762/298389) - 應該比部分演員更簡單 –

回答

2

默認的線程池/執行上下文/阿卡調度將有一個像每個核心一個線程,移動文件可能是一個阻塞操作,所以你纔會有儘可能多的文件在任何特定時刻移動,你有核心,在那段時間內沒有其他演員會被調用。

您可以配置調度程序使用多個線程,以獲得更多parallell活動,或將文件移動演員不與其他演員地干擾特定的調度。

也許一個更好的主意是將文檔視爲通過系統傳遞的消息,一方面將每個文檔作爲消息枚舉,然後將其發送給解析文件屬性並將其轉發給演員,實際移動。這使得有可能動機 - 演員實例取決於吞吐量您的磁盤等多少解析器演員實例和多少決定