2013-08-30 138 views
1

我想構建一個服務,當url返回status 200時會通知我。我目前使用sidekiq工作者,如果status == 200,它更新我的數據庫(row.available = true),如果不是,它會引發異常並重試n seconds, n amount of times中的工作者。重複檢查url是否存在

雖然這有效,但它並不感覺高效或可擴展(1000年的檢查會導致1000年的例外,在某些平臺上這是個壞消息 - JRuby),而且我確信有一種方法可以構建一個內部服務來管理這個不依賴於sidekiq的URL監控(可能在Go或其他更適合的Ruby gem中)。但是,我不知道從哪裏開始,所以我會欣賞一些大方向。

+1

如果您還沒有這樣做,那麼您可以通過執行「HEAD」而不是「GET」請求來保存某些內容。例子:'Net :: HTTP.start('example.com'){| http | http.head('/')} .code' –

+0

謝謝。我正在使用'Faraday.head()'。 –

回答

2

編寫和運行簡單的鏈接檢查器很容易。這樣做可以快速,無冗餘地處理數千個鏈接,並且處理死鎖和響應速度較慢的鏈接而不會讓整個系統陷入困境。

我會用三個線程,再加上兩個隊列:

  1. 一個調度線程只從數據庫中讀取。它負責查找和排隊要檢入「待檢查」隊列的URL。
  2. 工作線程從第一個隊列中消耗並將結果推送到「更新的URL結果」隊列中。
  3. 一個更新/消費者線程,它接受#2中線程的結果並更新數據庫。

Ruby有一些內置的課程,以幫助:

我會強烈建議Typhoeus and Hydra在中間線程使用。這兩個類的文檔涵蓋了很多你需要做的事情,就像處理並行運行的多個線程一樣。

I不會將此代碼寫入Rails應用程序的一部分。 Rails沒有爲此增加任何價值,也沒有必要。我要麼需要活動記錄,要麼捎帶在現有的database.yaml設置和模型上,要麼使用Rails' "runner"作爲Rails代碼的附件運行代碼。

或者,我會寫一個小的,特定於應用程序的代碼片段,以便在不同的服務器上運行,以避免陷入Rails服務器。使用諸如MySQL或PostgreSQL驅動程序之類的東西可以讓你與Rails使用的同一個數據庫交談。在這種情況下,我會使用Sequel gem充當ORM,但那是因爲我比起Active Record更喜歡它。

當您編寫代碼時,需要考慮很多事情,包括重試失敗的URL,感知重定向和更新源URL以反映它們以避免浪費時間,並且不會毆打導致您成爲主機的服務器取締。

多年來我已經爲此寫了幾個應用程序,正確的做法需要很多的深思熟慮,所以先考慮一下你的設計,否則你可能會在稍後重寫一些主要內容。

+0

非常感謝。我會考慮這一點。 –