簡體   English   中英

在Rails中運行大量長時間運行的后台作業

[英]Running large amount of long running background jobs in Rails

我們正在構建一個網絡應用程序,用戶將在其中上傳可能需要在后台處理的潛在大文件。 該任務涉及調用第三方API,因此每個作業可能需要幾個小時才能完成。 我們正在使用DelayedJob運行后台作業。 每個用戶啟動一個后台作業,每個后台作業都需要幾個小時才能完成,這將很快增加很多后台作業。 我想知道為此設置部署的最佳方法是什么? 我們目前托管在DigitalOcean上。 我已經啟動了10名DelayedJob工人。 每個硬盤(理想狀態下)占用157MB內存。 主動運行時,它將占用約900 MB的內存。 現在我們的用戶群很小,所以這不是問題,但很快就會成為一個問題。 因此,在4GB的Droplet上,我一次可以運行2到3個工人。 我們應該如何處理這個問題? 我們是否應該考慮使用DigitalOcean的API按需自動旋轉便宜的液滴? 我們應該每月訂閱一次高內存滴嗎? 如果我們使用自動旋轉的液滴,我們應該堅持使用DigitalOcean還是讓Heroku更有意義? 還是整個方法都是錯誤的,我們應該從一個不同的方向來對待它嗎? 任何幫助/建議將不勝感激。

謝謝!

聽起來您在DigitalOcean主機上可以運行的工作程序數量受到內存的限制。

如果您擔心規模擴大,我會專注於使工人盡可能高效。 您是否進行了基准測試以了解將900MB內存分配到的位置? 我不確定這些工作的性質是什么,但是您提到了大文件。 您是將這些文件的內容讀取到內存中還是在流式傳輸它們? 您是否正在使用可以調整的SQL數據庫? 當您可以使用批處理端點時,是否要進行許多小的API調用? 您是否正在分配必須隨后進行垃圾收集的中間變量? 您可以在發送文件之前壓縮文件嗎?

看一下工作結構本身。 我發現后台工作最適合於許多較小的工作,而不是一項較大的工作。 這樣可以並行執行,並在所有工作程序之間實現更多的負載平衡。 您甚至可能擁有一份可以產生其他工作的工作。 如果您需要一個作業來在一組作業完成時編排回調,則https://github.com/salsify/delayed_job_groups_plugin上有一個DelayedJobGroup插件,該插件僅允許您在同級作業完成后調用最終作業。 我的目標是單個作業的執行時間不超過30秒。 這是任意的,但它說明了我指的是較小的工作。

一些托管服務提供商(例如Amazon)提供競價型實例,您可以在沒有保證可用性的服務器上以較低的價格支付費用。 這些與我前面提到的工作機會少得多的方法非常匹配。

最后,Ruby可能不是正確的工具。 語言比較快,如果您受內存或CPU的限制,則可以考慮使用其他語言(例如Javascript,Go或Rust)編寫這些作業及其工作程序。 它們可以與Ruby堆棧很好地配對,但是可以將計算量大的子例程卸載到更快的語言中。

最后,像許多擴展問題一樣,如果您的資金超過了時間,則總是可以投入更多的硬件。 至少一會兒。

我的記憶和時間對您來說是更多的問題。 您必須使用sidekiq gem來完成此過程,因為這樣做會減少時間和內存消耗,因為它將redis用作鍵值對db的數據庫。如果問題仍然存在,則使用Java腳本。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM