Новое:Talanto осенью: поиск с цифрами, вакансия по шагам и каталог компаний

+1 512новых вакансий за сутки·54 396вакансий открыто сейчас·Новое:Talanto осенью: поиск с цифрами, вакансия по шагам и каталог компаний

Новые вакансии в TelegramРаботодателям
Talanto
Вакансии
Компании5 565
РезюмеAIПодготовкаСтатьи
BoostТарифыBoost
Войти

Не нашли подходящее?

Пусть нужная вакансия найдёт вас сама.

  1. Подборка в TelegramНовые вакансии по вашему фильтру — сразу в бота.Подключить
  2. Мэтчи по резюмеЗагрузите резюме — покажем, где вы подходите лучше всего.Загрузить
  3. Сохранить фильтрНастройте поиск один раз и возвращайтесь к новым вакансиям.Настроить
Что нового на TalantoTalanto осенью: поиск с цифрами, вакансия по шагам и каталог компаний

Для работодателей

Опубликуйте вакансию — отклики придут в ваш кабинет.

  1. Вакансиябесплатно
  2. Откликиконтакты бесплатно
  3. Наймэтапы и интервью

40 компаний публикуют вакансии напрямую · 4 395 кандидатов открыты к предложениям

Разместить вакансию

Популярные направления

Все подборки
  • Python8 752
  • Облачные технологии6 631
  • QA вакансии2 183
  • Android1 322
  • Инженер данных860
  • Продакт-менеджер316

Разработка

  • iOS1 238
  • Backend вакансии1 196
  • AI вакансии549
  • Fullstack вакансии500
  • Frontend вакансии426
  • Mobile вакансии28

По стеку

  • Go5 209
  • Java3 131
  • Kotlin1 113
  • Node.js1 008
  • Rust833
  • .NET656
  • PHP322
  • C++270
  • C#207

DevOps и инфраструктура

  • Kubernetes3 882
  • Linux-инфраструктура2 817
  • DevOps вакансии2 655
  • Terraform / IaC2 191
  • Мониторинг и Observability1 071
  • CI/CD919
  • SRE308
  • Кибербезопасность38

Аналитика и данные

  • Аналитик данных522
  • Data Scientist435
  • Бизнес-аналитик397
  • Системный аналитик67

Другие направления

  • Проджект-менеджер109
  • UI/UX дизайн67
  • Ручное тестирование14

По регионам

  • Вакансии в США22 951
  • Вакансии в Европе10 259
  • Работа в России2 963
  • Вакансии в Канаде2 034

По формату

  • Удалённые вакансии39 691
  • Релокация в США22 951
  • Гибридная работа3 633
  • Офисная работа2 761

По уровню

  • Senior вакансии19 599
  • Middle вакансии11 130
  • Junior вакансии3 562

Сейчас нанимают

Все компании
  • Wise192 вакансии
  • Rakuten189 вакансий
  • ASML163 вакансии
  • Grab134 вакансии
  • Celonis42 вакансии
  • Spotify37 вакансий
  • Adyen28 вакансий
  • Infobip28 вакансий
  • Monzo20 вакансий
  • Darktrace17 вакансий

Вакансии из 344 источников: карьерные страницы компаний и джоб-борды.

КомпанииО насНовостиПубличная офертаУсловия использованияПолитика конфиденциальностиПоддержка
←К теме BlazorВсе вопросы
BlazorMiddleТеория

Как Blazor Server обрабатывает circuit disconnect/reconnect и состояние пользователя?

В закладки
Сначала попробуйте ответить сами30 секунд
Сравнить с ответом ↓

Circuit — серверный объект с состоянием пользователя в Blazor Server. При разрыве SignalR circuit сохраняется на сервере до истечения DisconnectedCircuitRetentionPeriod (по умолчанию 3 мин), после чего уничтожается и состояние теряется.

Настройка таймаута и circuit

// Program.cs
builder.Services.AddRazorComponents().AddInteractiveServerComponents();

builder.Services.AddServerSideBlazor(options =>
{
    // Таймаут неактивного circuit (default: 3 minutes)
    options.DisconnectedCircuitMaxRetained = 100;
    options.DisconnectedCircuitRetentionPeriod = TimeSpan.FromMinutes(5);

    // JSInterop timeout
    options.JSInteropDefaultCallTimeout = TimeSpan.FromSeconds(60);
});

Circuit disconnect/reconnect в Blazor Server

В Blazor Server каждое соединение пользователя с сервером называется circuit. Это объект на стороне сервера, хранящий состояние всех компонентов, DI-сервисов со Scoped-временем жизни и очередь обновлений DOM. Связь осуществляется через SignalR WebSocket.

Жизненный цикл circuit

  • Connected — активное соединение, события обрабатываются в реальном времени.
  • Disconnected — соединение прервано (мобильная сеть, перезагрузка вкладки). Circuit остаётся живым на сервере в течение настроенного таймаута.
  • Reconnecting — браузер пытается восстановить соединение, показывая встроенный UI.
  • Disposed — таймаут истёк или пользователь закрыл вкладку, circuit уничтожается.

Кастомные обработчики disconnect/reconnect

Реализуйте CircuitHandler для отслеживания жизненного цикла circuit в сервисах:

using Microsoft.AspNetCore.Components.Server.Circuits;

public class TrackingCircuitHandler : CircuitHandler
{
    private readonly ILogger<TrackingCircuitHandler> _logger;

    public TrackingCircuitHandler(ILogger<TrackingCircuitHandler> logger)
    {
        _logger = logger;
    }

    public override Task OnConnectionUpAsync(Circuit circuit, CancellationToken ct)
    {
        _logger.LogInformation("Circuit {Id} connected", circuit.Id);
        return Task.CompletedTask;
    }

    public override Task OnConnectionDownAsync(Circuit circuit, CancellationToken ct)
    {
        _logger.LogWarning("Circuit {Id} disconnected", circuit.Id);
        return Task.CompletedTask;
    }

    public override Task OnCircuitClosedAsync(Circuit circuit, CancellationToken ct)
    {
        _logger.LogInformation("Circuit {Id} closed", circuit.Id);
        return Task.CompletedTask;
    }
}

// Регистрация
builder.Services.AddScoped<CircuitHandler, TrackingCircuitHandler>();

Состояние пользователя при разрыве

Пока circuit жив на сервере (в пределах таймаута), все Scoped-сервисы и состояние компонентов сохраняются. При реконнекте браузер повторно синхронизирует DOM. Если circuit истёк — состояние теряется, пользователь видит ошибку и должен перезагрузить страницу.

Для критически важных данных используйте одну из стратегий персистентности:

  • Server-side store: хранить состояние в Redis/БД, связав с userId.
  • PersistentComponentState: serialization state при prerendering.
  • localStorage через JSInterop: сохранять черновики форм на клиенте.
// Пример сохранения в localStorage при изменении
@inject IJSRuntime JS

private async Task OnFormChanged()
{
    var json = JsonSerializer.Serialize(_formModel);
    await JS.InvokeVoidAsync("localStorage.setItem", "draft", json);
}

Подводные камни

  • Scoped DI = per-circuit, не per-request. Scoped-сервисы живут всё время circuit. Если храните в них состояние — оно не обнуляется между навигациями.
  • Goroutine leak при disconnected. Async-операции, запущенные в circuit (background timer, HttpClient запросы), продолжают работать пока circuit жив. Используйте CancellationToken из ComponentBase.CancellationToken.
  • Масштабирование без sticky sessions. При нескольких серверах реконнект может попасть на другой узел, где нет circuit. Нужен SignalR Redis Backplane или sticky sessions в load balancer.
  • Concurrent updates из background tasks. При обновлении UI из фонового потока обязательно вызывайте InvokeAsync(StateHasChanged), иначе thread-safety нарушена.
  • Таймаут по умолчанию 3 минуты. Для мобильных пользователей с нестабильной сетью этого может не хватить. Увеличивайте DisconnectedCircuitRetentionPeriod с учётом нагрузки на память сервера.
  • Потеря state при истечении circuit. Нет автоматического восстановления — пользователь видит ошибку. Используйте <ReconnectionModal> кастомный UI для лучшего UX.

Частые вопросы на собеседовании

  • В чём разница между Blazor Server и Blazor WebAssembly?
  • Что такое Blazor и каковы его основные модели хостинга?
  • Как Blazor управляет повторным рендерингом компонентов и как его оптимизировать?
  • В каких типах frontend-проектов Blazor даёт реальный выигрыш, а где будет избыточен или неудачен?

Типичные ошибки

  • Отвечать определением без production-сценария.
  • Не называть runtime boundary, security boundary или failure mode.
  • Игнорировать версию API, observability и тестовую проверку.

Что проверяет интервьюер

  • Объясняет механизм своими словами и без выдуманных API.
  • Называет реальные риски, диагностику и критерий корректности.
  • Связывает ответ с текущей документацией и миграционными ограничениями.

Как вы знаете этот вопрос?

Проверить себя по теме Blazor →

Источники

  • https://learn.microsoft.com/en-us/aspnet/core/blazor/
  • https://learn.microsoft.com/en-us/aspnet/core/blazor/components/rendering
←Предыдущий вопросКак использовать `RenderFragment` и `RenderFragment<T>` для шаблонных компонентов?

Связанные темы

Blazorblazor-productionrisk-analysistechnical-depth