2012-04-28 26 views
1

我正在Rails中開發一個網站,它必須每天運行一次腳本。該腳本讀取xml-feeds並更新數據庫。我正在使用Rails 3.1.1並在Heroku上運行網站。Rails:每天運行一個feedreading腳本(1h)。建議?

我在這裏有什麼選擇,以便腳本在運行時不會完全殺死網站?添加一個我認爲可以解決這個問題的測試儀,但是相當昂貴,尤其是當我運行該腳本時,並不是真的需要它。

我可以在另一個數據庫上運行腳本並複製它嗎?在後臺運行它?總之,我有什麼選擇?

編輯:我在這裏不太清楚。我的問題是儘可能少地影響Web服務器/數據庫,而不是運行腳本(每當等)。我打算在夜間播放劇本,儘可能少影響劇本,但我不希望網站在那個小時內完全失效。

+0

你可以看看gem https: //github.com/javan/whenever。 – afaf12 2012-04-28 20:45:40

回答

2

很多這取決於腳本的性能特點。如果cpu密集程度非常高但影響不大,那麼我不會擔心:當使用類似heroku調度程序的作業時,作業會在單獨的dyno中運行。由於它是一個獨立的測試儀,它不會影響正在服務請求的其他dynos。

沉重的數據庫使用是另一回事。你的數據庫有一定數量的IO,緩存,CPU等,如果你努力推動它(大量的寫入通常比許多讀取更糟糕,因爲那些高速緩存),那麼你可能會降低你的其他dynos的性能。

也可以停止網站工作 - 如果你的工作最終鎖定了其他應用試圖訪問的行/表上的鎖,那麼你的網絡動態鏈將被阻止,直到你的工作釋放鎖。

如果您在解析feed時逐個更新數據庫行,那麼您可能會確定:在鎖爭用方面,大量小寫入/讀取比大量寫入/讀取要好,不認爲你會碰到很難的分貝,因爲它聽起來像你一般會從索引列中一次加載一行,做一些紅寶石計算,然後更新一行。

如果您發現性能被降級不可接受的,然後如果瓶頸是讀一個出路是有一個讀取從站(也稱爲副本,或在Heroku的說話follower)。簡而言之,這是一個單獨的只讀數據庫服務器,用於跟蹤主數據庫服務器(因此它總是非常新的)。你對這個服務器做的任何事情都不會影響你的主數據庫,所以你可以不必擔心地查詢。

如果問題是您需要執行的寫入次數,則這不會對您有所幫助。在某種程度上,這可以通過切換到更強大的數據庫服務器來解決(付費)。對於某些使用模式,不同類型的數據存儲(例如mongo,redis)有時比關係數據庫更合適。有時候可以設計出一些性能熱點,但顯然你是最適合考慮的人。

這是非常抽象的 - 你真正知道的唯一方法就是通過嘗試。設置你的應用程序的副本,啓動此任務,看看性能如何下降(或者如果你不擔心一次性影響,可以對真實應用程序執行此操作)

+0

謝謝,這幾乎是我尋找的「通用」答案。我收到了許多不同來源的不同答案,我想我會使用heroku調度程序,但是此信息有所幫助。 – Christoffer 2012-04-30 07:12:50

1

檢出用於導軌的feedzirra插件。當您想要進行飼料加工時,這非常棒。

同時結帳whenever寶石。安裝它,並創建一個模型方法,每隔一段時間運行一次,以便進行Feed處理。

這樣,您的Web服務器完全沒有循環,這不會影響服務請求。然而,數據庫是一個不同的故事。

+0

謝謝,雖然我將這個問題翻譯成了我的問題。這是否會使網站在執行腳本時嘗試訪問它的用戶「失望」,因爲它會使用數據庫?或者它很可能會變慢? – Christoffer 2012-04-29 08:11:55

+0

該網站不會關閉。您正在處理的Feed的大小以及您獲得的流量將決定最終用戶在緩慢請求方面會產生多少影響。 – Faisal 2012-04-29 14:14:19

1

我推薦你寶石resqueresque-scheduler。我在生產中使用它們,開發和測試非常簡單方便(請參閱resque_spec

我知道,heroku支持redis很好。你可以試試gem heroku-scheduler。我沒有使用它,但認爲它也很酷;)

Whenever也很棒。我提出了另一種選擇。這是你的選擇

+0

謝謝,就像其他答案一樣,我覺得將其轉化爲「用戶體驗」有點困難。如果我使用這個解決方案,那麼這實際上會做什麼。只要沒有人使用該網站,它會執行這些操作,或者它是如何工作的? – Christoffer 2012-04-29 08:13:28

相關問題