2011-01-07 21 views
1

我正在編寫一個Rails應用程序,用於「擦除/導航」一些其他網站和web服務的內容。我正在使用MechanizeSavon來進行重疊提升。如何構建可在運行時編輯的Rails站點?

但是考慮到網絡的動態特性,我想讓這些網站的管理員用戶可以編輯我的電話 - 而不是要求我發佈新版本的網站。

使用daemons寶石,實際的抓取線程發生異步到網站。

我的要求是:

  1. 以爲刮/ Web服務調用代碼是很簡單的,最簡單的途徑就是讓全班編輯由管理員。
  2. 保留刮碼的歷史 - 以便我們可以相當容易地恢復,如果我們引入一個問題。
  3. 最初使用文件系統中的代碼,但只要編輯並存儲在某處,就可以使用該代碼。

我想我的選擇是:

  1. 存儲在數據庫中的代碼(與舊版本的歷史表)
  2. 存放在私人混帳回購協議的地方,並access that的代碼歷史/最新版本。

我想到的是git的路線可能是最容易的,因爲它存在的理由是跟蹤文件的歷史... 但或許是寶石/插件,做這一切對我來說,開箱即用?

在此先感謝您的任何提示/建議。 〜克里斯

+0

你使用mod_rails來承載它嗎? – hometoast 2011-01-07 13:12:57

+0

mod_rails - 那是乘客,對吧?我相信我會 - 更在開發階段:) – 2011-01-08 09:16:16

回答

1

我真的希望你沒有像what's talked about here ...

假設你正在做一個適當的mixin,曾經有一個名爲「acts_as_versioned」的寶石,它會做你想要的東西。已經有一段時間了,所以我不知道它是否已經變成插件或者是否已經被放棄。實質上,它使用的過程是爲版本化表提供一個組合鍵。

你的數據庫將有一個這樣的結構:

  • 鍵列(ID備案)
  • 版本列(ID備案的版本)
  • 所有的記錄屬性

假設您的腳本有一個表格,而您想要的腳本有三個版本。您的表將有以下記錄:

  • 123,3, '#Be現在好'
  • 123,2, '使 「喜」'
  • 123,1,「#Do不會壞「

獲取最新版本將如下

Scripts.find簡單:第一,:條件=> {:ID => 123},:爲了=> 」版本desc「 的

回滾將像刪除最新版本一樣簡單,或者具有指向活動版本的指針的另一個表。隨你便。

你是對的,git,subversion,mercurial和公司會在這方面好得多。爲了提供支持,你只要按照下列步驟操作:

  1. 退房服務器上的腳本(使用標記,以便您可以管理在任何時間發生的事情有)
  2. 建立一個cron作業檢查出新腳本定期(像每六小時或任何你感到舒服的)
  3. 運行腳本的守護程序應自動運行新版本。
+0

謝謝,acts_as_versioned聽起來很有趣,必須仔細研究。而不是,所以我們正在做一個comparethemarket.com類型的網站,我們正在抓取的網站達成了協議,但誰沒有時間來製作web服務選項......但希望有一天能夠:) – 2011-01-07 14:56:13

1

如果您的網站已經是源代碼控制之下,如果你是下mod_rails運行/客,你可以遵循以下步驟:

  1. 編輯刮碼
  2. 提交本地的變更
  3. touch yourapp/tmp/restart.txt

那應該給你變化的歷史,你不應該重新部署。

比較安全,但不能肯定是否有可能對你來說是測試/研究與開發服務器上:做出改變,本地提交,測試,然後對生產服務器,git pull然後touch tmp/restart.txt

+0

狡猾 - 我喜歡這條路線。我希望對生產進行「安全」測試相當容易,所以要避免使用測試選項 - 但要記住它的一些事情...... – 2011-01-07 14:51:47

1

我以前寫過一些大蜘蛛和頁面分析器,需要記住的一點是代碼向整個應用程序提供什麼服務。

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將幫助您花費時間並以小步驟完成。

相關問題