1

URL が返されたときに通知するサービスを構築したいと考えていますstatus 200。現在sidekiqワーカーを使用しています。 の場合status == 200はデータベースを更新し ( row.available = true)、そうでない場合は例外を発生させ、ワーカーを で再試行しn seconds, n amount of timesます。

これは機能しますが、効率的またはスケーラブルとは感じられません (1000 のチェックでは数千の例外が発生し、特定のプラットフォーム (JRuby など) では悪いニュースです)。 sidekiq に依存しないこの URL 監視を管理します (おそらく Go や、より適した別の Ruby gem で)。ただし、どこから始めればよいかわからないので、一般的な方向性を教えていただければ幸いです。

4

1 に答える 1

2

単純なリンク チェッカーを作成して実行するのは簡単です。何千ものリンクに対して冗長性を持たずに迅速にそれを行い、システム全体を停止させずに停止したリンクや応答の遅いリンクを処理することは、ますます困難になります。

3 つのスレッドと 2 つのキューを使用します。

  1. データベースからの読み取りのみを行うディスパッチャ スレッド。これは、「チェック対象」キューにチェックインする URL を見つけてキューに入れる役割を果たします。
  2. 最初のキューから消費し、結果を「更新された URL 結果」キューにプッシュするワーカー スレッド。
  3. #2 のスレッドの結果を受け取り、データベースを更新するアップデータ/コンシューマ スレッド。

Ruby には、役立つ組み込みクラスがいくつかあります。

真ん中のスレッドで使用する場合は、Typhoeus と Hydraを強くお勧めします。これら 2 つのクラスのドキュメントには、並行して実行される複数のスレッドの処理に関する限り、必要な作業の多くが含まれています。

このコードを Rails アプリケーションの一部として書くつもりはありませんRails がこれに付加する価値はありませんし、必要でもありません。既存の database.yaml 設定とモデルに Active Record とピギーバックを要求するか、Rails の「ランナー」を使用して Rails コードの補助としてコードを実行します。

または、アプリケーション固有の小さなコードを作成して、別のサーバーで実行し、Rails サーバーの停止を回避します。MySQL や PostgreSQL ドライバーのようなものを使用すると、Rails が使用するのと同じデータベースと通信できます。この場合、Sequel gem を ORM として使用しますが、それは Active Record よりも Sequel gem の方が好きだからです。

このコードを作成する際には、失敗した URL の再試行、リダイレクトの検出、ソース URL を更新して時間を無駄にしないようにすること、ホスティング サーバーに負荷をかけて禁止されることのないようにすることなど、考慮すべきことがたくさんあります。

私はこの目的のために何年にもわたっていくつかのアプリを書いてきましたが、それを正しく行うには多くの事前の考慮が必要です。

于 2013-09-01T20:52:16.323 に答える