📩 موارد استفاده عملی (Practical Use Cases)
با توجه به اینکه کانالهای Redis با معناشناسی "حداکثر یک بار تحویل" (at-most-once delivery) کار میکنند (پیامها در صورت عدم حضور مشترک ممکن است از دست بروند)، این کانالها برای سناریوهایی مناسب هستند که از دست دادن گاهبهگاه پیام قابل قبول بوده و ارتباط Real-time یا نزدیک به Real-time مطلوب است. ✅
🎯 چند مورد استفاده ممکن:
🔹️فیدهای شبکههای اجتماعی: انتشار پستها یا بهروزرسانیهای جدید برای کاربران. 📢
🔹️بهروزرسانی امتیازات زنده: ارسال امتیازات زنده بازیها یا بهروزرسانیهای ورزشی برای مشترکین. ⚽️
🔹️اپلیکیشنهای چت: تحویل پیامهای چت به صورت Real-time به شرکتکنندگان فعال. 💬
🔹️ویرایش مشارکتی: انتشار تغییرات در محیطهای ویرایش مشارکتی.
🔹️بهروزرسانیهای Distributed Cache: ابطال ورودیهای کش در سرورهای متعدد هنگام تغییر دادهها. (این مورد را در ادامه با جزئیات بیشتر پوشش خواهیم داد.)
💡نکته مهم: کانالهای Redis بهترین انتخاب برای دادههای حیاتی که از دست دادن پیام در آنها غیرقابل قبول است، نیستند. در چنین مواردی، باید یک سیستم پیامرسانی با قابلیت اطمینان بالاتر را در نظر بگیرید. 🔐
💻 پیادهسازی Pub/Sub با Redis Channels در NET.
ما برای ارسال پیامها با کانالهای Redis از کتابخانه StackExchange.Redis استفاده خواهیم کرد.
📥 نصب و راهاندازی
ابتدا آن را نصب میکنیم:
Install-Package StackExchange.Redis
شما میتوانید Redis را به صورت محلی در یک کانتینر Docker اجرا کنید. پورت پیشفرض 6379 است:
docker run -it -p 6379:6379 redis
📤 سرویس Producer (ناشر)
در اینجا یک سرویس Background ساده آمده است که به عنوان Producer (ناشر) پیامهای ما عمل میکند.
ما با اتصال به نمونه Redis خود یک ConnectionMultiplexer ایجاد میکنیم. این به ما امکان میدهد تا یک ISubscriber به دست آوریم که میتوانیم از آن برای پیامرسانی Pub/Sub استفاده کنیم. ISubscriber ما را قادر میسازد تا با تعیین نام کانال، یک پیام را در آن کانال منتشر کنیم.
public class Producer(ILogger<Producer> logger) : BackgroundService
{
private static readonly string ConnectionString = "localhost:6379";
private static readonly ConnectionMultiplexer Connection =
ConnectionMultiplexer.Connect(ConnectionString);
private const string Channel = "messages";
protected override async Task ExecuteAsync(CancellationToken stoppingToken)
{
var subscriber = Connection.GetSubscriber();
while (!stoppingToken.IsCancellationRequested)
{
var message = new Message(Guid.NewGuid(), DateTime.UtcNow);
var json = JsonSerializer.Serialize(message);
await subscriber.PublishAsync(Channel, json);
logger.LogInformation(
"Sending message: {Channel} - {@Message}",
message);
await Task.Delay(5000, stoppingToken);
}
}
}
حالا نوبت به معرفی یک سرویس Background مجزا برای مصرف پیامها میرسد. ⬇️