Подтвердить что ты не робот

Гарантированная доставка в SignalR

Я оцениваю SignalR для веб-приложения средней загрузки.

Мы ожидаем ~ 500 msgs/sec, что не должно быть проблемой с SignalR.

Однако мы обеспокоены надежностью этого решения. У нашей среды есть проблемная сеть, и нередко клиент теряет свое сетевое соединение в течение ~ 30 секунд. Есть ли какой-либо механизм для обеспечения повторного подключения клиента, он получает все сообщения, отправленные во время автономной работы?

Спасибо!

4b9b3361

Ответ 1

Одним довольно простым способом справиться с этим было бы присвоение каждому сообщению идентификатора, который увеличивается с каждым сообщением. Клиент должен будет отслеживать последнее сообщение, которое он получил, и при повторном подключении просто отправит этот идентификатор сообщения на сервер; и тогда сервер должен будет отправить все пропущенные сообщения клиенту. Должно быть разумно просто реализовать.

EDIT: Я не думаю, что вам нужно было бы поддерживать какое-либо реальное состояние на сервере - я думаю, что почти все это может быть вытолкнуто в ваш хранилище данных или вашему клиенту. Клиент отправил бы идентификатор или метку последнего сообщения, которое он получил:

$.connection.myHub.server.updateMe(lastMessageId);

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

Что касается безгражданства, являющегося целью SignalR: я не могу прокомментировать это, не замечая, что я не могу представить какое-либо достаточно сложное приложение реального мира, которое не нужно было бы иметь какое-то вспомогательное хранилище данных, независимо от того, он в SignalR или какой-либо другой структуре (WCF, XSockets и т.д.) не имеет большого значения.

Ответ 2

Вы могли бы использовать какую-то систему quering, но чтобы добиться этого с минимальными усилиями, вы можете сделать это вот так...

Serverside: http://pastebin.com/tuicQYGq Clientside: http://pastebin.com/a8EbusuG

Я использую XSockets.NET, которая является платформой связи в реальном времени (с 2009 года), и контроллеры в XSockets.NET имеют состояние, поэтому это легко сделать.

EDIT: Ох... чтобы проверить это, используйте два браузера, например хром и сафари, затем отключите один браузер... отправьте некоторые сообщения от другого, а затем снова подключитесь, чтобы увидеть, как появляются сообщения. Вы должны использовать два разных браузера на localhost, поскольку xsockets предоставит каждому браузеру уникальный идентификатор хранилища.

EDIT: добавлен Func в очередь, чтобы вы могли настроить таргетинг на определенные клиенты, даже если они находятся в автономном режиме. Теперь только клиенты, отвечающие условиям, получат сообщения, если хотите.

Отношения Uffe