11

キューからメッセージを受信し、指定された Id を持つ製品をドキュメント データベースから読み取り、メッセージに基づいて何らかの操作ロジックを適用し、最後に更新された製品をデータベースに書き戻すワーカー サービスがあるとします (a)。

水平スケーリング書き込み

この作業は、異なる製品を扱う場合でも安全に並行して実行できるため、水平方向にスケーリングできます (b)。ただし、複数のサービス インスタンスが同じ製品で動作する場合、同時実行の問題またはデータベースからの同時実行例外が発生する可能性があります。その場合、何らかの再試行ロジックを適用する必要があります (それでも、再試行は再び失敗する可能性があります)。 .

質問: どうすればこれを回避できますか? 2 つのインスタンスが同じ製品で動作していないことを確認する方法はありますか?

例/使用例: オンライン ストアでは、productA、productB、および productC のセールが 1 時間で終了し、何百人もの顧客が購入しています。購入ごとに、メッセージがキューに入れられます (productId、numberOfItems、price)。 目標: ワーカー サービスの 3 つのインスタンスを実行し、productA のすべてのメッセージが instanceA に、productB が instanceB に、productC が instanceC に到達するようにするにはどうすればよいでしょうか (同時実行の問題は発生しません)。

: 私のサービスは C# で記述され、ワー​​カー ロールとして Azure でホストされています。メッセージングには Azure Queues を使用し、ストレージには Mongo を使用することを考えています。また、エンティティ ID はGUID.

それはテクニック/デザインに関するものなので、問題を解決するために別のツールを使用する場合、私はまだ興味があります.

4

5 に答える 5

1

データベースを常に最新の状態にし、すでに処理されたユニットと常に一致させたい場合は、同じ可変エンティティに対していくつかの更新を行います。

これに準拠するには、同じエンティティの更新をシリアル化する必要があります。プロデューサーでデータを分割してこれを行うか、エンティティのイベントを同じキューに蓄積するか、分散ロックまたはデータベース レベルのロックを使用してワーカーでエンティティをロックします。

アクター モデル (akka を使用する Java/scala の世界) を使用して、エンティティまたはそれらを順次処理するエンティティのグループごとにメッセージ キューを作成することができます。

更新 .netおよびhereへの akka ポートを試すことができます。ここでは、scala での akka の使用に関するサンプル付きの素敵なチュートリアルを見つけることができます。しかし、一般的な原則については、[アクター モデル] についてさらに検索する必要があります。それにもかかわらず、欠点があります。

最終的には、データを分割し、特定のエンティティに対して一意の特殊なワーカー (障害が発生した場合に再利用および/または再起動できる) を作成する機能に関係します。

于 2015-03-09T07:58:57.620 に答える
1

この種のものには、ブロブ リースを使用します。基本的に、既知のストレージ アカウントにあるエンティティの ID を使用して BLOB を作成します。ワーカー 1 がエンティティを取得すると、BLOB のリースを取得しようとします (存在しない場合は、BLOB 自体を作成します)。両方の処理が成功した場合、メッセージの処理を許可します。その後、必ずリースを解放してください。うまくいかない場合は、メッセージをキューに戻します

新しいストレージ ライブラリを使用するように微調整されていますが、ここで Steve Marx によって最初に説明されたアプローチに従っていますhttp://blog.smarx.com/posts/managing-concurrency-in-windows-azure-with-leases

コメント後に編集: すべてのメッセージが同じエンティティと通信する可能性が高い場合 (あなたの称賛が意味するように)、エンティティ構造またはメッセージング構造のいずれかでアプローチを再設計します。

例: CQRS 設計パターンを検討し、すべてのメッセージの処理からの変更を個別に保存します。これにより、製品エンティティは、さまざまなワーカーによってエンティティに対して行われたすべての変更の集約になり、単一のオブジェクトに順次再適用および再水和されます

于 2015-03-08T21:55:35.367 に答える