TGViewer
C# Geeks (.NET) C# Geeks (.NET) @csharpgeeks · 549 subscribers
Post #315 283
بلوک finally 🛡 تضمین می‌کند که ما همیشه قفل را آزاد کنیم، حتی اگر مشکلی پیش بیاید. PostgreSQL همچنین به طور خودکار advisory lockها را هنگام بسته شدن اتصالات آزاد می‌کند، که یک شبکه ایمنی خوب است.

💡SQL Server
یک قابلیت مشابه با sp_getapplock دارد.

بررسی کتابخانه DistributedLock 🔍

در حالی که رویکرد DIY کار می‌کند، اپلیکیشن‌های پروداکشن به ویژگی‌های پیچیده‌تری نیاز دارند. کتابخانه DistributedLock موارد استثنایی (edge cases) را مدیریت کرده و چندین گزینه بک‌اند (Postgres, Redis, SqlServer و غیره) را فراهم می‌کند. شما می‌دانید که من طرفدار اختراع مجدد چرخ نیستم، بنابراین این یک انتخاب عالی است.

پکیج را نصب کنید: 📦
Install-Package DistributedLock

من از رویکردی با IDistributedLockProvider استفاده خواهم کرد که به خوبی با DI کار می‌کند. شما می‌توانید یک قفل را بدون اینکه چیزی در مورد زیرساخت زیرین بدانید، به دست آورید. تمام کاری که باید انجام دهید این است که یک پیاده‌سازی از lock provider را در کانتینر DI خود ثبت کنید.

برای مثال، با استفاده از Postgres: 🔧
// Register the distributed lock provider
builder.Services.AddSingleton<IDistributedLockProvider>(
(_) =>
{
return new PostgresDistributedSynchronizationProvider(
builder.Configuration.GetConnectionString("distributed-locking")!);
});

یا اگر می‌خواهید از Redis با الگوریتم Redlock استفاده کنید:
// Requires StackExchange.Redis
builder.Services.AddSingleton<IConnectionMultiplexer>(
(_) =>
{
return ConnectionMultiplexer.Connect(
builder.Configuration.GetConnectionString("redis")!);
});

// Register the distributed lock provider
builder.Services.AddSingleton<IDistributedLockProvider>(
(sp) =>
{
var connectionMultiplexer = sp.GetRequiredService<IConnectionMultiplexer>();
return new RedisDistributedSynchronizationProvider(connectionMultiplexer.GetDatabase());
});

نحوه استفاده سرراست است: 👨‍💻
// شما همچنین می‌توانید یک تایم‌اوت پاس دهید، که در آن provider به تلاش برای به دست آوردن قفل
// تا رسیدن به تایم‌اوت ادامه خواهد داد.
IDistributedSynchronizationHandle? distributedLock = distributedLockProvider
.TryAcquireLock("nightly-report");

// اگر قفل را به دست نیاوردیم، آبجکت null خواهد بود
if (distributedLock is null)
{
return Results.Conflict();
}

// مهم است که قفل را در یک دستور using بپیچید تا اطمینان حاصل شود که به درستی آزاد می‌شود
using (distributedLock)
{
await DoWork();
}


این کتابخانه تمام بخش‌های دشوار را مدیریت می‌کند 👍: تایم‌اوت‌ها، تلاش‌های مجدد، و تضمین اینکه قفل‌ها حتی در سناریوهای شکست نیز آزاد می‌شوند.
این همچنین از بسیاری از بک‌اندها (SQL Server, Azure, ZooKeeper و غیره) پشتیبانی می‌کند، که آن را به یک انتخاب محکم برای بارهای کاری پروداکشن تبدیل می‌کند.

جمع‌بندی 📝

قفل‌گذاری توزیع‌شده چیزی نیست که هر روز به آن نیاز داشته باشید. اما وقتی به آن نیاز پیدا می‌کنید، شما را از باگ‌های ظریف و دردناکی که فقط تحت بار یا در پروداکشن ظاهر می‌شوند، نجات می‌دهد.

🔹 ساده شروع کنید: اگر از قبل از Postgres استفاده می‌کنید، advisory locks یک ابزار قدرتمند است.

🔹 برای یک تجربه توسعه‌دهنده تمیزتر، به سراغ کتابخانه DistributedLock بروید.

🔹 بک‌اندی را انتخاب کنید که متناسب با زیرساخت شما باشد (Postgres, Redis, SQL Server و غیره).

قفل مناسب در زمان مناسب تضمین می‌کند که سیستم شما سازگار، قابل اعتماد و انعطاف‌پذیر باقی بماند، حتی در چندین فرآیند و سرور.(منبع)
More from @csharpgeeks
  1. Sep 22, 2026یه مدتی قراره از دنیای NET. فاصله بگیرم، چون وقتشه برم سربازی. راستش نمیدونم این مدت رو چج…
  2. Sep 20, 2026🔥 حالا مشکل اصلی: Alert Storm فرض کن Database از دسترس خارج شده. ۱۰۰ Pod داری. هر Pod می‌…
  3. Sep 20, 2026🚨 طراحی سیستم Monitoring و Alerting در یک سیستم بزرگ فرض کن ساعت ۳ صبح است. سیستم شما با…
  4. Sep 19, 2026#Engineering_Leadership تصمیم نگرفتن هم یک تصمیم است یه چیز عجیب توی تیم‌های مهندسی: گاهی…
  5. Sep 19, 2026☑ چک‌لیست آماده‌سازی تیم، فرایندها و زیرساخت برای توسعه با AI توجه: هیچ چک‌لیستی جهان‌شمول…
  6. Sep 19, 2026📌پایان یک انتظار طولانی: اعتبارسنجی ناهمگام (Async Validation) در NET 11.
Threads Profile ViewerView any public Threads profile without an account.Open ThreadLook →Writing with AI? Make it sound human.Metric37 rewrites AI drafts so they read naturally. Free AI detector, 1,500 words free.Try Metric37 →