Redis Pub/Sub ile Gerçek Zamanlı Mesajlaşma: .NET Entegrasyonu
Redis çok çeşitli kullanım alanlarına sahiptir. Redis’in sunduğu Pub/Sub (Publisher/Subscriber) mesajlaşma modeli, gerçek zamanlı veri yayını ve abonelik senaryolarında oldukça etkilidir. Bu makalede, Redis Pub/Sub’ın ne olduğundan ve .NET ile nasıl kullanılabileceğinden bahsedeceğim.
Redis Pub/Sub Mimarisi
Redis Pub/Sub, yayıncı (publisher) ve abonelerden (subscriber) oluşan bir mesajlaşma modelidir. Bu modelde, yayıncı belirli bir kanal üzerinden mesaj yayınlar ve aboneler bu kanallara abone olarak mesajları alır. Redis Pub/Sub’ın ana bileşenleri şunlardır:
- Publisher (Yayıncı): Mesajları belirli bir kanala yayınlar.
- Subscriber (Abone): Belirli bir kanala abone olarak mesajları alır.
- Channel (Kanal): Mesajların yayınlandığı ve abonelerin dinlediği sanal bir kanal.
Pub/Sub modeli, dağıtık sistemlerde gerçek zamanlı iletişim için idealdir. Birçok kullanım senaryosu vardır;
- Canlı Spor Skorları Yayını:
- Spor karşılaşmaları sırasında canlı skor güncellemelerini abonelere anında iletmek.
2. Gerçek Zamanlı Sohbet Uygulaması:
- Kullanıcılar arasındaki mesajları anında iletmek ve sohbet odalarında güncellemeleri paylaşmak.
3. Anlık Bildirim Sistemi:
- Kullanıcılara önemli olaylar veya güncellemeler hakkında anlık bildirimler göndermek.
4. IoT Cihazlarından Veri Toplama:
- Sensörlerden gelen verileri toplamak ve anlık olarak işlemek.
5. Oyun Durumu Güncellemeleri:
- Çok oyunculu oyunlarda oyun durumu, puanlar ve diğer önemli bilgileri oyunculara anında iletmek.
6. E-Ticaret Stok Bilgilendirmesi:
- Stok durumu değişikliklerini ve yeni ürün eklemelerini anında yöneticilere ve kullanıcılara iletmek.
7. Kullanıcı Etkinlikleri İzleme:
- Web sitelerinde veya uygulamalarda kullanıcı etkinliklerini izlemek ve analiz etmek.
8. Canlı Yayın Yorumları:
- Canlı video veya radyo yayınları sırasında gelen yorumları izleyicilere anında iletmek.
9. Sistem Sağlık İzleme:
- Sunucu ve uygulama performansını izlemek, kritik olayları veya hataları anında bildirmek.
Pub/Sub’ın Avantajları
- Gerçek Zamanlı İletişim: Pub/Sub modeli, komutların anında tüm abonelere iletilmesini sağlar, bu da hızlı ve eşzamanlı işlemler için idealdir.
- Kolay Ölçeklenebilirlik: Yeni client’lar eklendiğinde, Pub/Sub yapısı sayesinde herhangi bir ek yapılandırmaya gerek kalmadan sistem kolayca ölçeklenebilir.
- Merkezi Yönetim: Tüm işlemler merkezi bir noktadan yönetilerek sistemin genel durumu üzerinde daha fazla kontrol sağlanır.
- Esneklik: Farklı türde komutlar ve işlemler için kolayca genişletilebilir bir yapı sunar.
.NET ile Redis Pub/Sub Kullanımı
Redis Pub/Sub kullanımını göstermek için, .NET ile bir sistem sağlık izleme örneği yapalım. İlk olarak gerekli kütüphaneleri kurmamız gerekiyor. StackExchange.Redis
kütüphanesi bu iş için idealdir.
Gerekli Kütüphaneler ve Kurulum Adımları
NuGet Package Manager kullanarak StackExchange.Redis
kütüphanesini projeye ekleyin:
dotnet add package StackExchange.Redis
Sistem bileşenlerinin sağlık bilgilerini yayınlaması ve merkezi izleme servisinin bu bilgileri toplaması ve komutları yayınlaması için gerekli kodları yazalım.
using StackExchange.Redis;
using System;
class Publisher
{
static void Main(string[] args)
{
// Redis sunucusuna bağlan
ConnectionMultiplexer redis = ConnectionMultiplexer.Connect("localhost");
ISubscriber sub = redis.GetSubscriber();
while (true)
{
Console.WriteLine("Enter a message:");
string message = Console.ReadLine();
// Mesajı 'mychannel' kanalına yayınla
sub.Publish("mychannel", message);
}
}
}
using StackExchange.Redis;
using System;
class Subscriber
{
static void Main(string[] args)
{
// Redis sunucusuna bağlan
ConnectionMultiplexer redis = ConnectionMultiplexer.Connect("localhost");
ISubscriber sub = redis.GetSubscriber();
// 'mychannel' kanalına abone ol ve gelen mesajları dinle
sub.Subscribe("mychannel", (channel, message) => {
Console.WriteLine((string)message);
});
Console.WriteLine("Subscribed to mychannel. Press any key to exit...");
Console.ReadKey();
}
}
Bu basit örnekte, yayıncı (Publisher) kullanıcıdan gelen mesajları mychannel
kanalına yayınlar ve abone (Subscriber) bu kanaldaki mesajları dinleyerek ekrana yazdırır.
Örnek Kullanım
Şimdi bu basit örneği genişleterek, sistem sağlık izleme ve merkezi komut yayını senaryosuna dönüştürelim.
Problem Tanımı*
Bir web uygulaması geliştirdiniz ve IIS üzerinde çalışıyor. Uygulamanız load balancing yapısında, birden fazla sunucuda çalışıyor ve bu sunucular ölçeklenerek çoğaltılıyor. Ancak sunucu sayısı arttıkça, her birinde aynı anda işlem yapmak zorlaşıyor. Örneğin, tüm sunuculardaki cache’i temizlemek veya belirli bir uygulamayı yeniden başlatmak gibi işlemleri koordine etmek zor olabiliyor.
- Tabii ki sistemleri optimize etmenin daha iyi yöntemleri var, ancak bu makalede, bir örnek oluşturmak için bu problemi bilerek oluşturduk.
Çözüm
Bu problemi çözmek için Redis Pub/Sub yapısını entegre edeceğiz. Böylece, merkezi bir sistemden komutları yayınlayarak tüm sunucularda aynı anda işlemleri gerçekleştirebileceğiz.
- Komut Yayını Yapan Uygulama : Komutları merkezi bir yerden yayınlamak için bir API projesi oluşturacağız.
- Komutları Dinleyen Client: Tüm sunucuların bu API’den gelen komutları dinleyip uygulayabilmesi için bir yapı oluşturacağız.
Adım 1: Gerekli Kütüphaneler ve Kurulum Adımları
NuGet Package Manager kullanarak StackExchange.Redis
kütüphanesini projeye ekleyin:
dotnet add package StackExchange.Redis
Adım 2: API ile Komut Yayını
Merkezi sistemden API çağrıları ile komut yayınlayan ve istemcilerin bu komutları dinleyerek aksiyon aldığı bir örnek oluşturacağız.
Publisher
Bu uygulama, API üzerinden komutları alır ve Redis Pub/Sub kullanarak yayınlar. Bir .NET Web API kullanacağız.
CommandsController
, API üzerinden gelen komutları Redis Pub/Sub aracılığıyla yayınlar. Bu controllerda iki ana metod bulunur: ClearCache
ve Recycle
. Her iki metod da gelen isteği alır ve ilgili komutu commands
kanalına yayınlar.
using Microsoft.AspNetCore.Mvc;
using StackExchange.Redis;
using System.Threading.Tasks;
[ApiController]
[Route("api/[controller]")]
public class CommandsController : ControllerBase
{
private readonly IConnectionMultiplexer _redis;
public CommandsController(IConnectionMultiplexer redis)
{
// Redis bağlantısını dependency injection ile alıyoruz
_redis = redis;
}
[HttpPost("clear_cache")]
public async Task<IActionResult> ClearCache()
{
// Redis subscriber'ını alıyoruz
var sub = _redis.GetSubscriber();
//'commands' kanalına 'clear_cache' komutunu yayınlıyoruz
await sub.PublishAsync("commands", "clear_cache");
// Başarılı yanıt döndürüyoruz
return Ok("clear_cache command published.");
}
[HttpPost("recycle")]
public async Task<IActionResult> Recycle()
{
var sub = _redis.GetSubscriber();
// 'commands' kanalına 'recycle' komutunu yayınlıyoruz
await sub.PublishAsync("commands", "recycle");
return Ok("recycle command published.");
}
}
Adım 3: Komutları Dinleyen İstemciler
Bu uygulama, merkezi sistemden gelen komutları dinler ve ilgili aksiyonları alır.
CommandSubscriber
, Redis Pub/Sub yapısını kullanarak commands
kanalına abone olur ve gelen komutları dinler. Gelen komutlara göre belirli aksiyonlar alır: clear_cache
komutu ile memory cache temizlenir, recycle
komutu ile IIS'de çalışan uygulama yeniden başlatılır.
using StackExchange.Redis;
using System;
using System.Runtime.Caching;
using System.Diagnostics;
using System.Threading.Tasks;
class CommandSubscriber
{
static async Task Main(string[] args)
{
// Redis sunucusuna bağlan
ConnectionMultiplexer redis = ConnectionMultiplexer.Connect("localhost");
ISubscriber sub = redis.GetSubscriber();
// 'commands' kanalına abone ol ve gelen komutları dinle
await sub.SubscribeAsync("commands", (channel, message) =>
{
Console.WriteLine($"Received command: {message}");
switch (message.ToString())
{
case "clear_cache":
ClearCache();
break;
case "recycle":
Recycle();
break;
default:
Console.WriteLine("Unknown command");
break;
}
});
Console.WriteLine("Subscribed to commands channel. Press any key to exit...");
Console.ReadKey();
}
// Memory cache temizleme işlemi
static void ClearCache()
{
...
}
// IIS'de çalışan uygulamayı yeniden başlatma işlemi
static void Recycle()
{
...
}
}
Redis Pub/Sub Alternatifleri
Redis üzerine Pub/Sub sayısında herhangi bir sınırlandırma . Birden fazla Pub/Sub olabilir ve sistem sorunsuz çalışmaya devam eder. Ancak, Pub/Sub sayısındaki artış performansı doğrudan etkileyebilir.
Performans gereksinimlerinin yüksek olduğu senaryolarda Kafka veya RabbitMQ gibi message broker veya event streaming çözümlerine geçiş yapılabilir. Bu sistemler, büyük ölçekli veri işleme ve yüksek performans gerektiren uygulamalar için optimize edilmiştir ve daha iyi bir performans sunar.
Sonuç
Redis Pub/Sub, merkezi komut yayını senaryolarında gerçek zamanlı veri yayını ve abonelik modelinin etkin bir şekilde kullanılmasını sağlar. Bu makalede, Redis Pub/Sub kullanarak .NET ile bir merkezi komut yayını uygulaması oluşturduk.