2015-08-21 7 views
2

У меня возникла странная проблема с SignalR с помощью разных балансировщиков нагрузки (я попробовал балансировку эластичной нагрузки и HAProxy).SignalR через балансировщик нагрузки

Моя установка выглядит следующим образом:

клиент C# -> HAProxy -> (SignalR Хост 1 или SignalR хоста 2)

HAProxy настроен на roundrobin с печеньем для обеспечения сессии липкости

баланс roundrobin
печенья SERVERID вставки непрямого NoCache

Когда у меня есть один SignalR хост за прокси (с помощью длинного опроса или сервера Отправить событие) все работает отлично. Я могу подключиться, вызвать методы и обработать обратные вызовы.

Как только я добавляю второй сервер SignalR, все начинает плохо работать. Я могу подключиться нормально, а соединения правильно загружают баланс. Я могу отправлять сообщения, и они правильно прикрепляются к серверу. Проблема в том, что обратные вызовы просто не возвращают мой клиент через прокси.

Что такое недоумение, это прекрасно работает с одним хостом, настроенным на балансировщике нагрузки.

Другое примечание: я не хочу масштабировать SignalR с объединительной панелью. Мои хосты signalr не должны знать друг о друге или заботиться о подключенных клиентах. В моей архитектуре SignalR является интерфейсом уровня уровня приложения, который обрабатывает широковещательные услуги связи. Я использую Signlar, чтобы поддерживать push-уведомления из приложения.

Мысли?

+1

Вы счастливы, что сообщение, посланное клиентом не может достичь других подключенных клиентов из-за них, возможно, является подключен к различным концентраторам? – cdsln

+0

Да, как я уже сказал, signalr - это внешний интерфейс другого уровня приложений. Связь между концентраторами осуществляется через этот другой уровень. – bsmatt

ответ

2

Я понял это ...

Оказывается, проблема была не обрабатывал липкой сессии должным образом. В частности, я не связывал файл cookie бэкэнд-сервера, который создает балансировщик нагрузки с моим соединением-концентратором. Результатом этого является то, что keep-alive поступает с одного хоста, где другой хост получает все сообщения от клиента, поэтому мой клиент эффективно тайминг молча. Я включил все System.Diagnostics из signalr, чтобы понять это.

Я никогда не выяснял, как справиться с липкостью во время процесса соединения (возможно, создавая новый класс persistentconnection и обрабатывая сообщения о подключении). Вместо этого я сделал это как часть процесса входа в систему, использующего вызовы REST. Я извлекаю файл cookie из этих вызовов и добавляю его в контейнер cookie соединения hub, и сеансы должным образом прилипают.

Update: Вот как вы установите печенье в связи хаба

std::unordered_map<utility::string_t, utility::string_t> ConnectionHeaders; 
ConnectionHeaders[U("Cookie")] = <INSERT COOKIE> 
m_HubConnection->set_headers(ConnectionHeaders); 

Благодаря

+1

Мне любопытно, были ли у вас какие-либо ошибки в консоли, такие как «ERR_NETWORK_CHANGED». У нас есть некоторые странности с SignalR, и серверы находятся на балансировщике нагрузки. –

+0

Нет ... Я не видел такой ошибки. Я запустил регистрацию, и на сервере я заметил, что сообщения keep keep остаются на одном хосте, в то время как другой хост обрабатывает различные другие сообщения. – bsmatt

+0

@bsmatt Вы можете поделиться более конкретным способом добавления cookie в контейнер cookie? Спасибо –

Смежные вопросы