2
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

.NETで分散ロックを実装してみる

Posted at

こんにちは。

テックリードの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の準備は少々大変ですがコード的にはこれだけで分散ロックを実現できます。

濫用するとパフォーマンスに影響するので設計は大事ですがここぞというところにはしっかり使っていきたいですねー。

2
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?