2017-06-21 72 views
0

Bisuness邏輯飢餓誰參加一個序列過程

我們有以下業務邏輯來完成:

100萬次這樣做:

  1. 下載索引文件我
  2. 解壓文件
  3. 從文件中提取一些信息
  4. 刪除文件

當前阿卡解決方案

的阿卡的解決方案,我們目前所面對的創造百萬的演員誰是負責一個要下載的文件,一旦他們這樣做,他們創造一個演員照顧2,3,4步驟。

問題

一旦我們運行的過程中,我們遇到了在阿卡高度重視下載者的情況,演員的休息飢餓模式beeing。

我們知道,隨着機器磁盤變滿,因爲下載的演員經常下載,但其他演員沒有機會掃描和刪除文件。

問題

  1. 有沒有辦法迫使阿卡不捱餓演員下來的演員鏈?
  2. 有沒有辦法告訴下載演員等待,直到它得到一些通知它可以繼續(例如不超過1000並行的磁盤文件)

感謝。

+0

至於問題2:僅使用1000的演員,這是負責所有步驟 - > 1000個文件的最大磁盤上,沒有任何可能發生的饑荒,因爲一個角色負責的整個步驟鏈。您可以使用一個包含所有文件的隊列進行下載,這樣1000名演員一旦完成了他們的配置,就可以請求一個新文件。 – thwiegan

+0

1000000名演員同時下載1000000個文件是無稽之談。單線程可以更快地完成這項工作。應該將步驟2-4合併到一個作業中,並提交給可用處理程序+ 1的線程池。 –

回答

0

使用不同的調度程序對於兩種類型的演員:

在你的配置,你可以定義一個單獨的調度程序(舉例來說):

my-dispatcher { 
    type = Dispatcher 
    executor = "thread-pool-executor" 
    thread-pool-executor { 
    fixed-pool-size = 32 
    } 
    throughput = 100 
} 

然後你就可以分配到一個特定的演員創建時:

val myActor = context.actorOf(Props[MyActor].withDispatcher("my-dispatcher"), "myactor1") 

調度程序實際上是線程池。將兩個保證分開,保證緩慢的阻塞操作不會使另一個餓死。一般來說,這種方法被稱爲批量標題,因爲這個想法是,如果應用程序的一部分失敗,其餘部分仍然響應。

欲瞭解更多信息,請參閱the documentation