1

現在、Steam Web API を使用して DotA 2 マッチをクロールするサービスを作成しています。ソリューションをスケーラブルにしたいので、クロール ジョブを同時にバッファリングして処理できるようにしたいと考えています。それがキューの考えの理由です:

クロール アーキテクチャ

すべてのコンポーネントは、異なるコンピューター/VM 上で実行できる必要があります (メモリ内またはプロセス間同期はありません)。クロール ジョブは次のようになります。

Job 1: Crawl match 1234 with options ABC
Job 2: Crawl match 2345 with options BCD

データの性質上、同じ試合を指す複数のジョブがキューに入れられる場合があります (2 人のプレイヤーが同じゲームをプレイした場合など)。したがって、キューが提供できない同期メカニズムが必要です (クローラーは、同じ一致のデータを同時に書き込もうとしてはなりません)。

私の実際の質問は、同じデータにアクセスする必要があるキューワーカーを同期するために使用できるパターンはありますか?

私が考えたアプローチの 1 つは、クローラーが一致できるようにする別のサービスを導入することでしたLock(これは、データベースから一致データを読み書きする前に行う必要があります)。

クロール コントローラー

しかし、それは多くの新しい質問と要件をもたらします:

  • コントローラーをスケーリングする方法は?
  • コントローラーが壊れたら?
  • キュー ワーカーがマッチのロックを解除しない場合はどうなりますか?
  • ...

興味がある場合は、おそらく使用するテクノロジを次に示します。

  • キュー: Windows Server のサービス バス
  • サービス: .NET Web API
  • データベース: SQL Server 2012
4

2 に答える 2

1

これは予約システムのように聞こえますが、オンラインチケット予約システムにあるような問題です-

user asks for tickets
system offers specific tickets
user thinks a while and maybe pays, during that think time system cannot offer tickets to anyone else
eventually user buys, rejects or maybe just times out
system updates ticket availability

質問:システムで、同じパラメーターを持つ2つのクローラーが同時に検索し、結果を同時に更新できない場合、問題はありますか?私が尋ねる理由は、クロールアクション自体がユーザーの思考時間に類似していると認識しているためです。これは、データベースのロックを保持するのが合理的ではない期間の長時間実行アクションです。

私が提案するスキームは、データベースとデータベーストランザクションによって仲介される楽観的ロックであるため、個別のコントローラーは必要ありません。DBは単一障害点であり、最終的にはスケーラビリティのボトルネックになりますが、DBを分割することで対処できます。 。

なんらかのコントローラーが必要です。ただし、シングルトンである必要はありません。ここでも、データベースロックを介してインスタンスを仲介します。私が目にする大きな問題は、失敗したクローラーを確実にキャッチすることです。「青空」シナリオで実行中のクローラーのDBテーブルを維持するのは簡単です。私には非常に注意が必要なのは失敗のケースです。

秘訣はデータベースをパーティション化することであるかどうか疑問に思います。各パーティションは、独自のコントローラーを持つ「ワークグループ」に対応しています。コントローラが動作している限り、コントローラは作業を開始し、クエリを監視して、ワークグループで重複が発生しないようにすることができます。クローラーが完了すると、「準備完了」メッセージがキューに入れられ、結果統合サービスがデータをパーティションからマスターにプルします。

于 2013-03-01T10:29:59.523 に答える
0

キュー内のメッセージのセット/グループを関連付ける必要がある場合は、そのためにセッションを使用できます。また、複数のサブスクリプションで単一のトピックを使用することは、サブスクリプションに設定されたさまざまなフィルターに基づいてメッセージを分割する良い方法です。次の情報が役立つ場合があります。

  1. (私のブログより) http://abhishekrlal.wordpress.com/2012/02/07/enterprise-integration-patterns-with-service-bus-part-1/
  2. http://code.msdn.microsoft.com/windowsazure/Brokered-Messaging-Session-41c43fb4

上記のサンプルの参照を Azure SDK 1.8 に更新する必要がある場合があります。これは、Windows Server の Service Bus 1.0 をサポートするものであるためです。

于 2013-03-01T14:23:47.890 に答える