こんにちは。
テックリードのTerukiです。
スケールアウトされる環境では、同時に実行されると困る処理がある時にシンプルなlock構文では対応しきれない時があります。
これに対応する便利なライブラリがあるので今回はそれの紹介です。
これは.NETで使える分散ロックのライブラリで、Redisや主要なRDB、ファイルシステムを使ったロックなどいろいろ実装があります。
WebのシステムではRedisを使うのが一番良さそうです。
実装
ASP.NET CoreではDI経由で使うことになるかなと思います。
var redis = ConnectionMultiplexer.Connect(connectionString);
services.AddSingleton<IDistributedLockProvider>(new RedisDistributedSynchronizationProvider(redis.GetDatabase()));
使う時はDIから IDistributedLockProvider
の実装を取得して使う感じ。
await using (var @lock = await DistributedLockProvider.AcquireLockAsync("text").ConfigureAwait(false)) {
// 分散ロックしたい処理
}
textの部分には例えば該当ユーザーのIDなどを入れておくとそのユーザーにおいてのみ分散ロックすることができます。
AさんとBさんが居た時に、AさんがロックしてもBさんはロックされないみたいなイメージ。
逆にtextのような固定値の場合はAさんがロックしたらBさんも待機させられるような状態になります。あまりこのユースケースはなさそうではありますが。
Redisの準備は少々大変ですがコード的にはこれだけで分散ロックを実現できます。
濫用するとパフォーマンスに影響するので設計は大事ですがここぞというところにはしっかり使っていきたいですねー。