Как реализовать горизонтальное масштабирование SignalR без использования существующих вариантов объединительной платы

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


person Vijay VSTO    schedule 15.10.2016    source источник
comment
В вашем сценарии вы можете держать всех пользователей, которым нужно общаться друг с другом, на одном сервере?   -  person Pawel    schedule 21.12.2016


Ответы (1)


Я не уверен, какова ваша текущая реализация, потому что ваше объяснение кажется немного смешанным. Если у вас есть несколько серверов за балансировщиком нагрузки, это означает, что вы применили некоторые методы (я так думаю!). Но вы сказали, что он отлично работает в среде с одним сервером, но не на нескольких серверах. Давайте рассмотрим, что является обязательным для нескольких серверов (масштабирование)

  1. Связь между экземплярами: это означает, что любое сообщение в одном экземпляре доступно во всех других экземплярах. Классическая реализация — любой тип очереди, SignalR поддерживает Redis, вы можете использовать SQL Server, но очевидны ограничения любого решения SQL. Azure использует Redis Cache как PaaS

  2. Хранилище в памяти: обычно вы используете это на одном сервере, но это обязательно для реализации общей памяти. Опять же, у Redis есть решение с общей памятью на случай, если у вас есть доступный сервер. Нет никакой возможности реализовать это без такого решения, как Redis. Опять же, менее производительным решением будет реализация MemStorage на SQL.

  3. Аутентификация: стандартная реализация безопасности использует файл cookie для хранения зашифрованного ключа. Но когда у вас есть несколько серверов, каждый сервер имеет свой уникальный ключ. Чтобы решить проблему, вы должны реализовать свой собственный DataProtector, если вы используете этот метод.

Примеры выходят за рамки этого объяснения, большая часть кода (даже шаблоны без реальных реализованных методов) заняла бы несколько страниц. Я предлагаю вам взглянуть на 3 элемента, которые являются обязательными для масштабирования вашего приложения.

person Maximiliano Rios    schedule 27.12.2016
comment
Не могли бы вы хотя бы добавить ссылки на исходный код или статьи или другие ответы на вопросы о пользовательских реализациях объединительной платы? Я уверен, что есть по крайней мере несколько хороших вещей, которые действительно могут помочь в вопросе стартера. - person cassandrad; 27.12.2016
comment
Я добавлю несколько примеров (минимум), которые помогут понять концепцию... Я сам реализовал полное решение, но там много кода. - person Maximiliano Rios; 27.12.2016
comment
Тогда вы можете дать ссылку на свой репозиторий, да? Это будет очень полезно для других. - person cassandrad; 27.12.2016
comment
Извините, я не могу предоставить вам доступ к моему репозиторию, потому что я не владею проектом, и у меня были бы юридические проблемы, поэтому я должен создать что-то новое и поделиться этим. - person Maximiliano Rios; 27.12.2016
comment
Тогда ваш ответ не содержит информации о том, как масштабировать SignalR с пользовательской базой данных. Это то, о чем спрашивал автор темы. - person cassandrad; 27.12.2016