Back to Blog
1 min read

SignalR Scaling: Building Scalable Real-Time Applications

Azure SignalR Service handles the complexity of scaling real-time applications, managing connections and message delivery across multiple servers.

Azure SignalR Service Setup

az signalr create \
    --resource-group myResourceGroup \
    --name mySignalR \
    --sku Standard_S1 \
    --unit-count 1 \
    --service-mode Default

Hub Implementation

public class ChatHub : Hub
{
    public async Task SendMessage(string user, string message)
    {
        await Clients.All.SendAsync("ReceiveMessage", user, message);
    }

    public async Task JoinGroup(string groupName)
    {
        await Groups.AddToGroupAsync(Context.ConnectionId, groupName);
        await Clients.Group(groupName).SendAsync("UserJoined", Context.User?.Identity?.Name);
    }

    public async Task SendToGroup(string groupName, string message)
    {
        await Clients.Group(groupName).SendAsync("ReceiveMessage", message);
    }

    public override async Task OnConnectedAsync()
    {
        await base.OnConnectedAsync();
        await Clients.All.SendAsync("UserConnected", Context.ConnectionId);
    }
}

Configuration

var builder = WebApplication.CreateBuilder(args);

builder.Services.AddSignalR()
    .AddAzureSignalR(options =>
    {
        options.ConnectionString = builder.Configuration["Azure:SignalR:ConnectionString"];
    });

var app = builder.Build();

app.MapHub<ChatHub>("/chatHub");

Client Connection

import * as signalR from '@microsoft/signalr';

const connection = new signalR.HubConnectionBuilder()
    .withUrl('/chatHub')
    .withAutomaticReconnect()
    .build();

connection.on('ReceiveMessage', (user, message) => {
    console.log(`${user}: ${message}`);
});

await connection.start();
await connection.invoke('SendMessage', 'User1', 'Hello!');

Summary

Azure SignalR Service scales real-time applications effortlessly, handling millions of connections with automatic load balancing.


References:

Michael John Peña

Michael John Peña

Senior Data Engineer based in Sydney. Writing about data, cloud, and technology.