💾 ابطال کش در سیستمهای توزیع شده (Cache Invalidation)
در یک پروژه اخیر، من یک چالش رایج در سیستمهای توزیع شده را حل کردم: همگام نگه داشتن کشها. 🧩 ما از یک رویکرد کشینگ دو سطحی استفاده میکردیم:
کش in-memory روی هر وب سرور برای دسترسی فوقسریع.
کش مشترک Redis برای جلوگیری از ضربه زدن مکرر به پایگاه داده.
مشکل این بود که وقتی دادهای در پایگاه داده تغییر میکرد، به راهی نیاز داشتیم تا به سرعت به تمام وب سرورها بگوییم که کشهای in-memory خود را پاک کنند. اینجا بود که Redis Pub/Sub به کمک آمد. ما یک کانال Redis را به طور خاص برای پیامهای ابطال کش راهاندازی کردیم. 📣
💻 پیادهسازی CacheInvalidationBackgroundService
هر برنامه یک سرویس CacheInvalidationBackgroundService را اجرا میکند که در کانال ابطال کش عضو میشود (Subscribe میکند):
public class CacheInvalidationBackgroundService(
IServiceProvider serviceProvider)
: BackgroundService
{
public const string Channel = "cache-invalidation";
protected override async Task ExecuteAsync(CancellationToken stoppingToken)
{
await subscriber.SubscribeAsync(Channel, (channel, key) =>
{
var cache = serviceProvider.GetRequiredService<IMemoryCache>();
cache.Remove(key);
return Task.CompletedTask;
});
}
}
هر زمان که دادهای در پایگاه داده تغییر میکند، ما یک پیام را در این کانال با کلید کش داده بهروز شده، منتشر میکنیم. تمام وب سرورها در این کانال عضو هستند، بنابراین فوراً از حذف داده قدیمی از کشهای in-memory خود مطلع میشوند. از آنجایی که کش in-memory در صورت از کار افتادن برنامه پاک میشود، از دست دادن پیامهای ابطال کش مشکلی ایجاد نمیکند. این کار کشهای ما را سازگار نگه میدارد و تضمین میکند که کاربران ما همیشه بهروزترین اطلاعات را میبینند. ✅
📝 خلاصه
Redis Pub/Sub
یک راهحل جادویی برای هر نیاز پیامرسانی نیست، اما سادگی و سرعت آن، آن را به یک ابزار ارزشمند تبدیل میکند. کانالها به ما امکان میدهند تا به راحتی ارتباط بین مؤلفههای با اتصال سست (loosely coupled components) را پیادهسازی کنیم. 🔗
کانالهای Redis دارای معناشناسی "حداکثر یک بار تحویل" (at-most-once delivery) هستند، بنابراین برای مواردی که از دست دادن گاهبهگاه پیام قابل قبول است، بهترین گزینه میباشند.
موفق باشید! 👋
🔖 هشتگها:
#Redis #PubSub #CacheInvalidation #DistributedSystems #DotNet #Messaging #BackgroundService