2013-05-04 77 views
1

在我的應用程序中,我需要處理上傳的文檔並將處理結果放在數據庫中。
文檔存儲在文件系統中,元數據存儲在數據庫中。
對於每個文檔,需要打開並處理來自磁盤的文件,而不是相應地更新數據庫中的元數據。處理可能是昂貴的並且需要很長時間。
我打算做的是:在Play 2.1(Java)中運行後臺任務的正確方法是什麼?

  1. 跨度N個任務,一個任務來處理一個文檔
  2. 每個任務將去尋找最古老的,「未處理」文件
  3. 任務將其標記爲」進取」的數據庫,並開始處理它
  4. 文檔處理任務後,將更新元數據,並在數據庫將其標記爲‘已處理’
  5. 任務會是
後第2步

假設應用程序是用Java編寫的,而不是Scala,那麼實現這個槓桿化Play和Akka的正確/最簡單的方法是什麼?源代碼示例也將受到讚賞。

回答

1

正確的方法是「不要在Play應用程序中運行任何後臺任務」。 Play是用於編寫Web應用程序的Web框架,根據定義,後臺任務不使用Web界面。因此,建立一個單獨的後臺任務運行者並通過Akka發送消息/事件。事實上,如果您將盡可能多的業務邏輯推入後臺任務,您將擁有更具可擴展性的應用程序。

對於這個模型所得出的邏輯結論的一個例子,有一個看看Mongrel2 Web服務器http://mongrel2.org/manual/book-final.html

由於我們有像阿卡和駱駝在JVM世界的工具,而像遊戲框架正在斷奶我認爲現在是時候遵循Mongrel2的標準,並回到更多的三層架構中,在這種架構中,網絡應用層只做最少的工作。

如果你遵循這個架構,你需要把運行後臺任務所需的所有信息都捆綁到一個消息中,然後把它發送給一個執行工作的外部角色,然後讓該角色向另一個角色發送完成消息這將更新數據庫。

+0

Michael,你顯然是對的,但這只是一個原型應用程序,它將運行在單個JVM實例上。我的理解是,Play使用Akka,並提供服務請求和我自己的任務 - 所有這些只是來自Akka視角的不同演員執行的任務。所以我甚至在想,「在Play應用程序中」實際上是「在Akka」中? – 2013-05-05 07:20:15

+0

對。使用Akka庫。 Sen消息。讓演員執行後臺任務。但爲了簡潔的設計,假設演員不會在同一臺機器上。實際上,爲什麼不爲後臺任務執行者啓動第二個JVM。這可以幫助您創建一個可以擴展到1000臺機器的乾淨設計。 – 2013-05-05 08:52:47

相關問題