1

クライアントサーバーシステムで作業していますが、複数のクライアントが同時にアクションを実行しているという問題が発生しています。これは、コードのクリティカルセクションをロックすることで解決できます。これにより、最初のクライアントが2番目のクライアントがコードブロックに入る前にアクションを完了することが保証されます。私の質問はこれです:私たちのサーバーもクラスター化されているので、サーバー自体の複数のインスタンスが存在する可能性があり、以前と同じ問題が再現されます。この問題をどのように解決できますか?ありがとう!

問題を拡張するには:最初のユーザーは、アクションが有効かどうかを確認し、yes応答を取得しています。2番目のユーザーは、アクションが有効かどうかを確認し、最初のユーザーがアクションを完了する前にyes応答を受け取ります。ただし、最初のユーザーのアクションにより、2番目のユーザーのアクションが無効になるはずです。問題は、チェックが各ユーザーに対してほぼ同時に行われることです。

4

2 に答える 2

1

特定の問題の詳細は、適切な解決策を得るのに役立ちますが、何らかの形式のプロセス間/サーバー間のロックが必要なようです。.NET フレームワーク (または Win32 API) 内にこれを簡単にするものは何もありません。残念ながら、独自のソリューションを作成する必要があります。

1 つのプロセス/スレッドだけがアクションを実行するように、ある種のクラスター化されたキューイング メカニズムを調べることができます。これは、全体的な設計や解決しようとしている問題において、簡単かもしれませんし、そうでないかもしれません。または、中央機関 (データベースなど) とロック構造を使用して、特定のアクションのロックが既に開始されているかどうかを判断することもできます。問題は、データベースと常に対話する必要があるため、このようなソリューションを適切にスケーリングするのが難しいことです。

もう 1 つのオプションは、複数のプロセスが同じアクションを同時に処理しようとすることを許可するが、1 つのアクションのみを完了することを許可することです。これを確認するのは難しい場合がありますが、他の誰かがすでに作業を行っているかどうかを常に確認するよりも、余分な作業を実行して破棄する方が (計算上) コストがかかりません。

于 2010-04-15T23:39:04.230 に答える
1

設計が悪いようですね。可能であれば、サービスは状態をまったく維持しないでください。そうすれば、踏む共有状態はなくなります。

状態を維持する必要がある場合は、その共有状態へのすべてのアクセスをインターロックする必要があります。これには、C# で "lock" キーワードを使用できます。

private static object _stateLocker = new object();
private static int _someSharedState = 0;

public void SomeAction()
{
    lock (_stateLocker)
    {
        _someSharedState ++;
    }
}

public int GetValue()
{
    lock (_stateLocker)
    {
        return _someSharedState;    }
}
于 2010-04-16T01:10:12.497 に答える