2013-08-23 73 views
1

我正在構建一個Web應用程序,允許用戶上傳音頻文件,特別是音樂。大多數時候,我預計每首歌曲的播放時間通常爲幾分鐘,文件大小約爲3-10MB。但是,我想要接受音頻上傳,最高可達100MB,可能需要超過一個小時的音頻。目前,我正在使用FFmpeg,SoX和LAME的組合將7種可能的格式轉換爲mp3格式,並執行包括均衡,修整和衰落在內的音頻修改。這些文件然後被存儲並鏈接到數據庫中。做實時,可擴展音頻處理的最佳策略?

我目前的策略是使用在後端PHP來處理一個HTTP文件上傳請求的整個過程,我在其中執行以下功能:

  1. 驗證
  2. 轉碼音頻信號轉變成多個版本(使用通過PHP)
  3. 商店殼原和轉碼版本的一個臨時目錄
  4. 上傳的所有音頻文件到Amazon S3的永久存儲
  5. 提交將每個文件的ID鏈接到數據庫,將它們鏈接到用戶

這與我已經設置的圖像處理系統非常相似。但是,儘管圖像可以在幾秒鐘內完成整個過程,但音頻可能需要更長的時間。音頻最多可能需要5-10分鐘才能處理和存儲。

我的問題是:

  1. 對於音頻處理,這將是更好的轉碼叉到另一個後臺進程,書寫自己的狀態數據庫,並執行ping命令它每隔幾秒鐘更新網頁與所有這一切都在一個HTTP請求?

  2. 隨着未來擴展的意圖,建議在單個服務器實例上進行所有處理,讓前端web實例免費複製/銷燬?

    • 如果是,這是否需要跨域文件直接上傳到該服務器? (任何人都知道這是怎麼YouTube或大網站做呢?)

謝謝!

回答

2

如果我正確理解你的系統,你最好的辦法可能是更多的東西是這樣的:

  • 在你的web前端,存儲音頻,並創建一個「任務」,表明該音頻需要被處理。
  • 運行後臺任務,執行任務並執行處理。在任務結束時,可以通知用戶(如果需要)並且可以更新數據庫狀態等。

你的任務應該寫出來,如果他們中途失敗了,他們可以從頭開始重新執行而不會造成任何問題。您可以在此體系結構中運行多個後臺任務和Web前端。

編寫任務的好方法是使用消息傳遞系統,如AMQP。有像rabbitmq這樣便宜的服務可以爲你做到這一點。當然,您也可以在任何數據庫之上構建您自己的數據庫,但這可能需要輪詢。

最後,您可能會發現使用zencoder這樣的服務進行轉碼會更快,更高效,因爲它們可以並行處理工作並可能處理更多輸入格式,但可能與您的處理不兼容。

+0

我不想使用外部服務進行轉碼,因爲我們已經自己處理了轉碼,但這更多的是關於如何在允許文件上傳的同時進行縮放的問題。我的假設是,只要我們允許在任何前端Web實例上進行文件上傳,橫向擴展就會困難得多,因爲只要流量減少,理論上就可以銷燬實例,這可能發生在文件上傳的中間。在那種情況下,在一臺中央服務器上處理所有文件上傳會更好嗎? –

+0

zencoder的建議僅僅是一個建議,可以考慮其他事情,而不是主要觀點。 –

+0

不知道您的流量和預算的具體細節,我不能告訴你,如果有一個或更多的上傳服務器更好。對於大型上傳,我通常會將客戶端重定向到s3,而不是隧道式傳輸或自行託管文件。這需要客戶端更多的智能,但它更加強大和動態。 –

0

你一定想把音頻處理丟到後臺進程。

根據涉及的可伸縮性,您可能需要一臺專用於處理的計算機。您可能想要查看其他資源,您也可以卸載音頻內容(如PCIe卡等)

對不起,我不知道跨域文件上傳或大狗如何操作(youtube,soundcloud ect)