我以前寫過一些大蜘蛛和頁面分析器,需要記住的一點是代碼向整個應用程序提供什麼服務。
Rails提供了由您的蜘蛛引擎收集的數據的演示文稿。演示文稿是硬幣的一面,蜘蛛是另一面,它們應該是兩個獨立的代碼庫,通過一些數據共享機制連接在一起,在您的情況下,它是數據庫。當您的蜘蛛程序代碼是分開的時,數據庫會爲您帶來一些巨大的優勢,就像Rails可用。聽起來你已經有了一些分離,但我建議創造一個更大的差距。考慮到這一點,以下是我以前做過的事情,以及我現在要做的事情。
此前,我有一個單獨的應用程序,用於產生多個蜘蛛任務的蜘蛛。每個任務都會查看一堆不同的URL,將結果放入數據庫中,然後退出。每次退出主應用程序都會產生另一個蜘蛛來處理更多的URL。在每個循環中,主應用程序都檢查了運行時參數的YAML配置文件,比如它應該運行多少個子任務,它們會得到多少個URL,等待連接多久等。它存儲了每次裝入配置文件的最後修改日期,如果我對該文件進行了更改,應用程序會在相當短的時間內感知它,重新讀取該文件並調整其行爲。
所有有關被抓取/抓取的URL /網頁/網站的狀態信息都保存在數據庫中,以便我可以檢查其進度。我可以看到隊列中已處理或保留了多少個,各種結果代碼以及返回的內容。如果我不喜歡的東西,我甚至可以調整過濾器跳過垃圾頁面,知道蜘蛛的任務將在幾分鐘內更新。
該系統工作得非常好,蜘蛛網主要客戶的系列沒有小故障,運行了幾個星期,因爲我添加了新的網站到列表中。 (我們正在幫助財富50強公司之一改進他們的網站,並且每個網站都是由不同的團隊設計和實施的,這使得每個網站都完全不同。我的代碼必須靈活且健壯,我真的很滿意它的工作方式)
要改變它,這些天我會使用數據庫表來保存所有的配置信息。這樣我就可以輕鬆構建管理員表單,並讓其他人繼承調整應用運行時配置的任務。蜘蛛任務也將被寫入,以便他們從數據庫中取出配置,而不是從主應用程序繼承它。我原本主應用程序執行所有管理,並將配置信息傳遞給spidering應用程序,因爲我想盡可能降低與數據庫的連接數。我正在使用Postgres,現在知道它可以輕鬆地處理負載,所以通過讓各個任務處理它們的配置,我可以使它更具響應性。
通過使蜘蛛引擎與呈現引擎分離,可以暫時停止其中一個或另一個,而不會影響蜘蛛抓取工作的進度。一旦我有了自動重新加載的前提,我不認爲我必須停止蜘蛛引擎,我只是調整了它的首選項。它幾乎連續幾周都沒有停下來,我們最終拉下了塞子,因爲我們有足夠的數據滿足我們的需求。
所以,我建議調整你的代碼,這樣你的蜘蛛引擎就不依賴於Rails,相反它會被cron或者一個單獨的調度應用程序解僱。如果您不得不暫時停止Rails,那麼您的引擎仍然會運行。如果您必須暫時停止引擎,則Rails可以繼續提供頁面。數據庫位於兩者之間,充當膠水。
當然,如果數據庫出現故障,你會被徹底清理,但還有什麼新東西? :-)
編輯:克里斯說:
「我看你對分流點的代碼了,雖然我的Ruby-FU低 - 不知道多遠,我可以單獨而不必擁有ActiveModel/migrations的副本,再加上一些共享的模型類。「
如果我們看一下您的應用程序spider engine <--> | <-- database --> | <--> Rails/MVC/presentation
,其中發動機,並分別Rails的讀取和寫入到數據庫中,並看看每個做得很好,這有助於弄清楚如何將它們分解爲單獨的代碼庫。
Rails旨在處理遷移,所以讓它。沒有理由重新發明這一輪。但是,你多長時間進行一次移民,並且在你做什麼時會受到什麼影響?一旦應用程序穩定,你就很少這樣做,並且在那個時候你會在維護週期中對它們進行調整來調整數據庫。您可以關閉蜘蛛引擎和Web界面幾分鐘,遷移數據庫,然後啓動並關閉並運行。遷徙是一種必要的罪惡,但在生產中幾乎沒有阻止者。大多數企業都有「軟件星期日」,或者一些預先公佈的維護窗口,所以也一樣。
ActiveRecord,建模和關聯也很容易處理。這些模型已經在Rails內部需要的文件中,所以蜘蛛引擎也可以繼承數據庫知識;多個應用程序/腳本可以使用相同的模型文件。你沒有看到Rails的書籍談論太多,但ActiveRecord實際上非常容易在Rails之外使用。搜索activerecord without rails
的谷歌更多信息。
如果您希望通過執行常規require
來獲得某些類的擴展,您也可以使用ActiveSupport,但通常應用於呈現Web界面的Rails「視圖」和「控制器」邏輯不應該是在發動機中完全需要。
業務邏輯,在Rails中的控制器中,甚至可以重構成單獨的方法,由Rails方面和蜘蛛引擎所需要的。這是看Rails的另一種方式,但符合「幹」的口頭禪 - 不要重複自己,所以要模塊化並需要(或者說是require_relative
)位和塊,這是整個系統的構建塊。
如果您不想要一個完全獨立的代碼庫,您可以利用Rail的腳本runner
,該腳本可以訪問ActiveRecord :: Base和ActiveRecord :: Associations和ActiveSupport。從您應用的主目錄中執行rails runner -h
,或者搜索「rails runner
」以獲取更多信息。 runner
對於一個小時開始並運行多次的工作並不好,因爲鐵路的啓動成本很高。但是,如果你有一個長期運行的任務,說一個與你的rails應用程序並行運行的任務,那麼這是一個很好的選擇。我會認真考慮您的應用程序的蜘蛛方面。最終,您可能想要將蜘蛛引擎分配給單獨的主機,因此演示文稿端有一個專用主機,因此runner
將幫助您花費時間並以小步驟完成。
你使用mod_rails來承載它嗎? – hometoast 2011-01-07 13:12:57
mod_rails - 那是乘客,對吧?我相信我會 - 更在開發階段:) – 2011-01-08 09:16:16