SignalR User Connections Yönetimi En Etkili Yöntemler


SignalR User Connections Yönetimi En Etkili Yöntemler

SignalR ve Bağlantı Yönetiminin Önemi

Gerçek zamanlı web uygulamaları geliştirenler için SignalR kullanıcı bağlantıları yönetimi anahtar bir konudur. Özellikle anlık bildirim, sohbet ya da oyun gibi çoklu kullanıcıların aynı anda etkileşimde bulunduğu sistemlerde, her kullanıcının bağlantısının güvenli, kararlı ve yönetilebilir olması gerekmektedir. SignalR ile kullanıcıların bağlantılarını doğru yönetmek; mesajların doğru kullanıcıya, ölçeklenebilir ve tutarlı biçimde ulaşmasını sağlar.

User Connections Yönetimi Nasıl Yapılır?

Kullanıcı ve Bağlantı ID İlişkisi Oluşturma

SignalR'da bir kullanıcı birden fazla cihazdan veya tarayıcı penceresinden sisteme bağlanabilir. Bu yüzden genellikle bir kullanıcının birden fazla bağlantı ID'si olabilir. Aşağıdaki örnekte, kullanıcıların bağlantı ID'lerinin bir sözlükte tutulması gösterilmektedir:


private static readonly Dictionary<string, HashSet<string>> _userConnections = new();

public override Task OnConnectedAsync()
{
    string userName = Context.User.Identity.Name;
    string connectionId = Context.ConnectionId;

    lock(_userConnections)
    {
        if (!_userConnections.ContainsKey(userName))
        {
            _userConnections[userName] = new HashSet<string>();
        }
        _userConnections[userName].Add(connectionId);
    }
    return base.OnConnectedAsync();
}

Bağlantı Kesildiğinde Yönetim

Kullanıcı bağlantısı koptuğunda veya sistemden ayrıldığında ilgili bağlantı ID'sinin bağlantı listesinden çıkarılması gerekmektedir.


public override Task OnDisconnectedAsync(Exception exception)
{
    string userName = Context.User.Identity.Name;
    string connectionId = Context.ConnectionId;

    lock(_userConnections)
    {
        if (_userConnections.ContainsKey(userName))
        {
            _userConnections[userName].Remove(connectionId);
            if (_userConnections[userName].Count == 0)
            {
                _userConnections.Remove(userName);
            }
        }
    }
    return base.OnDisconnectedAsync(exception);
}

Belirli Kullanıcıya Mesaj Gönderme

SignalR user connections yönetimi kapsamında, kullanıcıya özel mesaj göndermek için aşağıdaki gibi bir yaklaşım kullanılabilir:


public Task SendMessageToUser(string userName, string message)
{
    if(_userConnections.ContainsKey(userName))
    {
        foreach(var connectionId in _userConnections[userName])
        {
            Clients.Client(connectionId).SendAsync("ReceiveMessage", message);
        }
    }
    return Task.CompletedTask;
}

Sonuç ve En İyi Uygulamalar

SignalR user connections yönetimi konusunda, bağlantıların eşzamanlı güncellenmesi, bellek veya dağıtık sistemde senkronizasyonu oldukça önemlidir. Büyük ölçekli uygulamalarda bu yönetimi in-memory yerine dağıtık cache (örn. Redis) ile yapmak gereklidir. SignalR user connections yönetimini başarıyla uygulayarak, uygulamanızda yüksek performans, güvenlik ve esneklik sağlayabilirsiniz.