1

複数のサーバーで実行される .NET アプリケーション用のDistributedLockの NuGet パッケージを入手しました。ご存じない方のために説明すると、SQL Server のアプリケーション ロック機能を利用して、異なるマシン間で簡単にロックする手段を提供します。私がそれを使ってきたものは、大丈夫でした。ただし、ロックがチェックされた順序により、ロックが解放されたときに順序が維持されるかどうか疑問に思っていました。

たとえば、アプリケーションがキューから読み取り、各メッセージを順番に処理しているとします。各メッセージが世帯に関するもので、世帯の各メッセージを順番に処理したい場合はどうでしょうか。遭遇した最初のメッセージは、DistributedLock の Acquire を使用して、アカウントが空いているかどうかを確認し、空いている場合はロックし、メッセージの処理を開始できます。次に、キュー リスナー アプリが別のサーバーで実行されていて、同じ世帯のキューから別のメッセージを読み取るとします。この場合、Acquire は世帯のロックが解放されるまで待ってから、再度ロックしてメッセージを処理します。

var myLock = new SystemDistributedLock("UniqueHouseholdIdentifier");

using (myLock.Acquire())
{
    // message processed here in the lock
}

しかし、同じアプリを実行している 3 台目のマシンがあり、同じ世帯 ID を持つメッセージに遭遇した場合はどうなるでしょうか?

そのため、マシン #1 は世帯 ID A01 の最初のメッセージを取得し、ロックして処理を開始します。マシン #2 は、A01 のキューで 2 番目のメッセージを取得し、待機します。マシン #3 は、A01 のキューから 3 番目のメッセージを取得して待機します。

上記の場合、マシン #1 が A01 へのメッセージの処理を完了し、ロックを解放すると、A01 への 2 番目のメッセージを取得したマシン #2 が次にマシン #3 の前に実行されますか? それとも、実質的にランダムで、マシン #2 または #3 のいずれかが次のロックを取得する可能性がありますか? 秩序は保たれますか?

4

1 に答える 1