編寫和運行簡單的鏈接檢查器很容易。這樣做可以快速,無冗餘地處理數千個鏈接,並且處理死鎖和響應速度較慢的鏈接而不會讓整個系統陷入困境。
我會用三個線程,再加上兩個隊列:
- 一個調度線程只從數據庫中讀取。它負責查找和排隊要檢入「待檢查」隊列的URL。
- 工作線程從第一個隊列中消耗並將結果推送到「更新的URL結果」隊列中。
- 一個更新/消費者線程,它接受#2中線程的結果並更新數據庫。
Ruby有一些內置的課程,以幫助:
我會強烈建議Typhoeus and Hydra在中間線程使用。這兩個類的文檔涵蓋了很多你需要做的事情,就像處理並行運行的多個線程一樣。
I不會將此代碼寫入Rails應用程序的一部分。 Rails沒有爲此增加任何價值,也沒有必要。我要麼需要活動記錄,要麼捎帶在現有的database.yaml設置和模型上,要麼使用Rails' "runner"作爲Rails代碼的附件運行代碼。
或者,我會寫一個小的,特定於應用程序的代碼片段,以便在不同的服務器上運行,以避免陷入Rails服務器。使用諸如MySQL或PostgreSQL驅動程序之類的東西可以讓你與Rails使用的同一個數據庫交談。在這種情況下,我會使用Sequel gem充當ORM,但那是因爲我比起Active Record更喜歡它。
當您編寫代碼時,需要考慮很多事情,包括重試失敗的URL,感知重定向和更新源URL以反映它們以避免浪費時間,並且不會毆打導致您成爲主機的服務器取締。
多年來我已經爲此寫了幾個應用程序,正確的做法需要很多的深思熟慮,所以先考慮一下你的設計,否則你可能會在稍後重寫一些主要內容。
如果您還沒有這樣做,那麼您可以通過執行「HEAD」而不是「GET」請求來保存某些內容。例子:'Net :: HTTP.start('example.com'){| http | http.head('/')} .code' –
謝謝。我正在使用'Faraday.head()'。 –