Signalr webfarm с Бэкпланом не синхронизирован


У нас есть приложение SignalR, которое мы построили и протестировали для использования на одном веб-сервере. Требования изменились, и нам нужно развернуть приложение на веб-ферме. SignalR поддерживает несколько backplanes, так как приложение уже использует Sql Server, который мы реализовали. С введением второго веб-узла мы столкнулись с проблемой сохранения данных, которые кэшируются в концентраторе, синхронизированными между узлами.

Каждый концентратор имеет внутренний кэш в виде набор данных. Кэш заполняется, когда клиент сначала запрашивает данные, и оттуда любое взаимодействие обновляет локальный кэш и sql-сервер, а затем уведомляет всех подключенных клиентов об изменениях.

Объединительная плата обрабатывает широковещательные сообщения между клиентами, но другой узел не получает сообщения.

Наша первая мысль состояла в том, что может существовать метод, который мы могли бы подключить, который бы запускался от backplane, посылая сообщение клиентам узлов, но у нас есть не видел такой вещи, упомянутой в документации.

Нашей второй мыслью было создать .net-клиент внутри хаба.

private async void ConnectHubProxy()
    {
        IHubProxy EventViewerHubProxy = _hubConnection.CreateHubProxy("EventViewerHub");
        EventViewerHubProxy.On<string>("BroadcastAcknowledgedEvents", EventIDs => UpdateCacheIsAcknowledged(EventIDs));
        EventViewerHubProxy.On<string>("BroadcastDeletedEvents", EventIDs => UpdateCacheIsDeleted(EventIDs));
        ServicePointManager.DefaultConnectionLimit = 10;
        await _hubConnection.Start();
    }

Наши вопросы: Как нам синхронизировать кэш? Возможна ли первая мысль, и мы пропустили ее в документации? Есть ли какие-либо проблемы, связанные с тем, чтобы хаб подключался к самому себе?

1 2

1 ответ:

Рекомендуемый способ иметь "состояние" в сценарии масштабирования-иметь источник персистентности. Так что в вашем случае, если вы хотите иметь "глобальный" кэш, один из способов реализовать это-через базу данных.

При создании базы данных все узлы могут выполнять запись/чтение из одного источника и, следовательно, иметь глобальный кэш.

Причина, по которой наличие кэша в памяти не является хорошей идеей, заключается в том, что в веб-ферме, если узлы выходят из строя, они теряют весь свой кэш в памяти. Около имея персистентность, не имеет значения, были ли узлы запущены в течение нескольких дней или только что восстановились после сбоя на основе "выключения", уровень персистентности всегда есть.