Марк Прайс предложил свой набор из 60 вопросов (как технических, так и на софт-скилы), которые могут задать на собеседовании.
35. SignalR для веб-функциональности в реальном времени
«Расскажите, как реализовать систему уведомлений в реальном времени с использованием SignalR в приложении .NET? Опишите ключевые компоненты и как вы обеспечите масштабируемость и производительность системы».
Хороший ответ
Во-первых, нужно добавить библиотеку SignalR в проект .NET:
dotnet add package Microsoft.AspNetCore.SignalR
После этого создадим класс Hub, который выступает в качестве центрального координатора для входящих и исходящих сообщений. Здесь мы можем определить методы, которые клиенты будут вызывать для отправки сообщений на сервер. Сервер затем может транслировать эти сообщения другим подключённым клиентам:
public class NotificationHub : Hub
{
public async Task SendNotification(string message)
{
await Clients.All.SendAsync("ReceiveNotification", message);
}
}
В
Program.cs зарегистрируем маршруты SignalR и убедимся в правильной конфигурации для использования WebSockets как метода транспортировки для лучшей производительности и снижения задержек:var builder = WebApplication.CreateBuilder(args);
builder.Services.AddSignalR();
var app = builder.Build();
app.MapHub<NotificationHub>("/notifications");
app.Run();
На стороне клиента в проект необходимо добавить клиентскую js-библиотеку signalr. Затем используем JavaScript-клиент SignalR для подключения к хабу и определения функций отправки и получения сообщений:
const conn = new signalR.HubConnectionBuilder()
.withUrl("/notifications")
.build();
conn.on("ReceiveNotification", function(message) {
console.log("New notification: " + message);
});
async function start() {
try {
await connection.start();
console.log("SignalR Connected.");
} catch (err) {
console.log(err);
setTimeout(start, 5000);
}
};
conn.onclose(start);
start();
Для масштабирования приложения SignalR можно использовать Azure SignalR Service, который переносит управление подключениями и масштабирование на управляемый сервис, способный обрабатывать миллионы одновременных подключений. В конфигурации приложения просто изменим настройки подключения для интеграции с Azure SignalR Service:
builder.Services
.AddSignalR()
.AddAzureSignalR("строка подключения");
Эта реализация охватывает создание хаба, конфигурацию в приложении и взаимодействие на стороне клиента, обеспечивая надёжные и масштабируемые возможности работы в режиме реального времени. Использование Azure SignalR Service помогает управлять и масштабировать приложение по мере увеличения нагрузки пользователей, обеспечивая бесперебойную работу в режиме реального времени.
Источник: https://github.com/markjprice/tools-skills-net8/blob/main/docs/interview-qa/readme.md