2017-06-12 5 views
0

私たちはAndroidとIOSでゲームを実装しています。ゲームが終了すると、各クライアントはゲームを終了するためのAPIを呼び出します。これは、次のようになります。このようなJSONと一緒に複数の同時Web API要求のうち1つだけを処理する

/game/finish 

:確認完了は常に呼ばれるようにするために

{ GameId:1, WinnerId: 2, .... } 

、両方のプレイヤーが同じパラメータでこのAPIを呼び出します。したがって、要求はサーバで同時に受け取ることができる。サーバー側では、これらの同時リクエストのみを処理し、他の1つを落とす必要があります(勝者/敗者ポイントを正しく増減するため)。

サーバ側はC#を使用して実装され、WebAPIの

私は、ロックステートメントを使用して考えていますが、それは、パフォーマンスに影響を与える可能性があります。

私に優れたソリューションを提供するすべてのヘルプははるかにかなりのだろう。

+0

何唯一の勝者が要求を送信した場合はどうですか? – Oscar

+0

APIコールを受けてゲームが既に処理されたかどうかを単に確認するなどして、1つのクライアントだけがリクエストを送信したり、ゲームを解決済みとしてマークしたりしてください。終了しました。 ( 'if(!isGameHandled(gameID)){// //状態を処理して保存}') – jAC

+0

ゲーム終了時にWinnerのインターネット接続が失われた場合、どうなりますか?私はそのゲーム@Oscarを失います。それで私たちは両方のクライアントに仕上げを呼びかけます。 – Nasseh

答えて

1

lockを使用する必要があります。lockを使用してこれを行うには多くの方法がありますが、適切なアプローチは多くのアーキテクチャ上の質問によって決まります。これは、データベースレベル、バックエンドレベル、または単にフロントエンド(webAPI)レベルで実行できます。第二のユーザが長すぎる応答を待機しないように、あなたのゲームの仕上げ工程は、あまりにも長く続くことができるならば仕方
はまた、「仕上げ - 割り当てる - - ロック解除ロック」で行うことができます。

は、あなたは、単にロックを保存し、lockのを最小限にするためにダブルチェックロックを使用する同時辞書を使用することができますが、一部の人々はそれがアンチパターンであると考えています。
あなたの場合、結果はロックがかかります提出し、ゲームを終了した最初のプレーヤーで:

private readonly ConcurrentDictionary<int, object> _gameLocks = new ConcurrentDictionary<int, object>(); 

// Finish process: 
if (!GameIsFinished(gameId)) 
{  
    lock (_gameLocks.GetOrAdd(gameId, new object()) 
    { 
     if (!GameIsFinished(gameId)) { 
      FinishGame(gameId); 
     } 
    } 
} 

第二のスレッドが(競合状態の場合)最初のチェックを通過したとしても、それは待ちます最初の処理が完了してからと等しいかどうかを確認して何もしないでください。

私は自分のデザインにカップルの質問がある:

  1. 両方のユーザーが終了する前にウィンドウを閉じる場合はどう?ゲームは単に無視され、忘れられていますか?
  2. 何ユーザーがwinnerId自分自身とあなたの要求を交換し、2件の同じGameIdとの要望が、異なるWinnerIdがあるかどうか。
  3. 私は実際に演奏されたことがないゲームの異なる結果とサーバーをスパムしたらどう?

お客様のサーバーは、クライアントではなく、の受賞者を明確に決定する必要があります。

+0

ここに答えがあります: 1. \t 1人のプレーヤーがゲームを離れた場合、2人目のプレーヤーが勝者になるというポリシーがあります。 2. \tあなたはそうです。しかし私たちはチームであり、両方のクライアントが勝者を正しく設定していることを確信しています 私たちはリアルタイムゲームにソケットIOを使用しており、サーバー側はnodeJSです。私たちはnodeJsでそれを扱うことができませんでした。なぜなら、新しいことは – Nasseh

+0

"crossing finger solutions"(可能ですが、決して起こらないと確信しています)はすべての悪の根源です。しかし、この答えはまたそのような解決策を示しています:うまくいけば誰もワーカープロセス数を上げるでしょう –

+0

私は結果を提出するときに最初に認証された各プレーヤーを言及する必要があります。 – Nasseh

関連する問題