Microsoft Developer Tour Технологическая экспедиция msdevtour.ru Коммуникации в реальном времени с ASP.NET SignalR Владимир Юнев Содержание Введение в веб-общение в реальном времени Как общаются браузеры ASP.NET SignalR Магия реального времени за пару минут Построение масштабных проектов Масштабирование ASP.NET SignalR Введение в общение в реальном времени Как общаются браузеры Microsoft Developer Tour #MSDevTour Общение не в реальном времени Общение в реальном времени Проще говоря… SignalR - это абстракция, которая умеет выбирать способ взаимодействия в real-time поверх HTTP ASP.NET SignalR Магия реального времени за пару минут Microsoft Developer Tour #MSDevTour Представляем SignalR Абстракция поверх транспортных протоколов События вместо задач/асинхронности Управление соединениями Широковещательные или целевые рассылки на клиентов Что делает SignalR? Постоянное соединение от Клиента к Серверу поверх HTTP Легкое создание много-пользовательских веб-приложений реального времени Автоматически настраиваемые транспортные протоколы Обратная совместимость SignalR Web Sockets Forever Frames Long Polling Server Sent Events Что еще делает SignalR? Позволяет делать пуши server-to-client и RPC Строить асинхронные соединения с масштабированием до тысяч клиентов Масштабироваться с Service Bus, SQL Server & Redis Open Source на GitHub ASP.NET SignalR 2.0 Поддержка iOS и Android Добавлена поддержка iOS и Android через компоненты MonoTouch и MonoDroid компании Xamarin Portable .NET Client Поддержка платформ: NET 4.5, Silverlight 5, Windows Phone 8, WinRT (.NET для Windows Store Apps) Self Hosting Package NuGet-пакет для самостоятельного хостинга SignaR Обратная совместимость Сервер и клиент могут иметь разные версии ASP.NET SignalR 3.0 – часть ASP.NET 5 подробности уже скоро… Ключевые концепции SignalR Хаб • Более высоко-уровневый пайплайн построенный поверх Connection API, что позволяет вашему клиенту и серверу вызывать методы друг-друга Connection • Представляет простейшую конечную точку для отправки сообщений единичным клиентам, группам или широковещательные Объединительная шина (Backplane) • Объединительная шина позволяет вам масштабировать ваше приложение на множество серверов. При использовании шины, каждый экземпляр приложения отправляет сообщения в шину, а она, в свою очередь, перенаправляет их другим экземплярам приложений Хабы Microsoft Developer Tour #MSDevTour Хабы SignalR Так как Хабы вызываются на клиенте по имени, это имя может быть настроено по желанию Хаб – это .NET-класс, который наследуется от Microsoft.AspNet.SignalR.Hub Clients представляет динамические свойства полезные при работе с разными устройствами Класс Hub так же предлагает виртуальные методы полезные для ответа на события под(от)ключения Отправка сообщения всем подключенным клиентам Clients.All.doWork() Отправка сообщений вызывающему клиенту Clients.Caller.doWork() Отправка сообщений остальным клиентам Clients.Others.doWork() Отправка сообщений определенным клиентам Clients.Users(“Brady”).doWork() SignarlR Hub - сервер public class ChatHub : Hub { public void SendMessage(String message) { Clients.addMessage(message); } } Чат на базе SignalR Hub var hub = $.connection.chat; hub.addMessage = function (message) { $("#msgs").append("<li>" + message + "</li>"); }; $.connection.hub.start().done(function () { $("#send").click(function () { hub.sendMessage($("#msg").val()); }); }); DEMO Магия SignalR Microsoft Developer Tour #MSDevTour Построение масштабных проектов реального времени Паттерны масштабирования ASP.NET SignalR Microsoft Developer Tour #MSDevTour Обратите внимание на… Блокировки, блокирующий I/O никогда не блокируйте метод Hub используйте async везде, где только можно Отправка больших сообщений Избегайте утечек памяти плохое пониманием жизненного цикла объекта SignalR Сессии – никогда не используйте их из SignalR, точка. используйте сессии Hub, куки, хранилище браузера, БД, и т.д. Архитектура SignalR : публикации/подписки шина сообщений Паттерн 1. Серверный броадкаст • Броадкаст с низкой нагрузкой единого сообщения всем клиентам • Одна отправка шины сообщения соответствует многим пользователям (fan out) • Увеличение клиентов не увеличивает траффик очереди сообщений Примеры: уведомления в приложении, простое табло акций Паттерн 2. Серверный пуш • Броадкаст с низкой нагрузкой уникальных сообщений каждому клиенту • Одна отправка шины сообщения соответствует одному пользователю (no fan out) • Увеличение клиентов означает увеличение траффика очереди сообщений Примеры: мониторинг уникальных акций, мониторинг задач Паттерн 3. По событию от пользователя • Броадкаст по действию клиентов • Одна отправка шины сообщения соответствует многим пользователям (fan out) • Увеличение клиентов означает больше траффика очереди сообщений Примеры: приложения чатов, общая работа над документами Паттерн 4. Высокочастотное общение • Фиксированный высокоскоростной броадкаст от серверов и клиентов • Мы не рекомендуем > 25Hz • Одна отправка шины сообщения соответствует одному пользователю (no fan out) • Больше клиентов означает увеличение траффика очереди сообщений • Примеры: игры в реальном времени, shootr.signalr.net Паттерны нагрузки, итоги 1. Серверный броадкаст низкая частота, сообщение всем 2. Серверный пуш низкая частота, сообщение уникальным 3. На базе событий клиента броадкаст на события клиента 4. Высокая частота фиксированная высокая частота, уникальные сообщения Инструменты тестирования масштабирования Счетчики производительности Microsoft.AspNet.SignalR.Utils, signalr.exe -ipc crank.exe для генерации нагрузки SignalR Нагрузочное тестирование хостинга конечных точек stress.exe для запуска изолированных сценариев in-proc Настройки IIS для управления лимитами Проблема масштабирования: доставка сообщения Проблема масштабирования: скорость клиента Проблема масштабирования: распределенный клиент Хабы привязаны к серверу, так что вам требуется использовать объединительную шину, когда вы запускаете веб-ферму Как работает объединительная шина? Что SignalR делает без шины? Как работает объединительная шина? Вот как объединительная шина решает проблему Архитектура масштабирования Объединительная шина web nodes клиенты Реализация масштабирования • SQL Server, Redis & Azure Service Bus • Самая легкая установка (пакет NuGet + 1 строчка кода) • Великолепно подходит для паттерна нагруженного броадкаста • Ограниченно для других сценариев Каждое сообщение отправляется на каждый сервер, так что по мере увеличения траффика вы упираетесь в скорость выборки сообщений из объединительной шины одним веб-сервером • Объединительная шина значительно медленнее чем производительность одного сервера пропускная ширина != масштабу Настройка масштабирования: Общий сервер • Подходит для одновременной работы над документами, вайтбордами • Клиенты работающие над одной задачей идут на один сервер • Приложение знает какая задача происходит на каком сервере похоже на идею игрового лобби игры в реальном времени при подсоединении к серверу • Используйте группы для разделения траффика, например, группы на один документ • Масштабирование выделенного сервера через задачу одновременной работы Настройка масштабирования: Server affinity foo Настройка масштабирования: Специфический сервер • Подходит для сценария Серверный Пуш; уникальные клиенты • Подключение клиента к специфическому серверу и сохранение этой связи • Публикация сообщений для клиента на привязанный сервер через конечную точку Настройка масштабирования: Специфический сервер Настройка масштабирования: Шина сообщений с фильтрами • Подходит для сценария Серверный Пуш; уникальные клиенты • Веб-сервера подключаются к шине с фильтрами на подписке • Фильтр обновляется при каждом подключении • При поступлении сообщения производится локальный броадкаст Настройка масштабирования: Шина сообщений с фильтрами Объединительная шина web nodes клиенты Настройка масштабирования: Перенос сервера • Подходит для игр в реальном времени, когда требуется перенести игрока в другой шард/вселенную/мир (другой сервер) • Производительность уровня сервера (очень высокая) • Нельзя отправлять сообщения между клиентами на разных серверах без дополнительной работы Настройка масштабирования: Гибрид Микс и соответствие нескольким паттернам • Например, объединение подходов plug-in scale-out providers с server affinity для отказо-усточивой совместной работы над документами, где пользователь первым приходит в лобби, выбирает документ/комнату, затем подключается к кластеру, который обслуживает этот документ, который сам сконфигурирован в подходе plug-in scale-our providers • Например, используйте подход «перенос сервера» для высоко-частотного обмена в приложении и настройте доставку сервер-на-сервер для уведомлений и оповещений внутри приложения Заключение SignalR делает общение в реальном времени простым И предлагает магию… ASP.NET SignalR – готовая инфраструктура Хабы, подключения, шины – все для любых решений Построение проектов реального времени ASP.NET SignalR подходит для любых паттернов масштаба Всем спасибо! Ваши вопросы Владимир Юнев эксперт по стратегическим технологиям, Microsoft azurerus@microsoft.com @XaocCPS http://facebook.com/yunev http://blogs.msdn.com/b/vyunev Группа Azure для всех – http://facebook.com/groups/azurerus/ azure.com asp.net msftva.ru ©2015 Microsoft Corporation. All rights reserved. Microsoft, Windows, Office, Azure, System Center, Dynamics and other product names are or may be registered trademarks and/or trademarks in the U.S. and/or other countries. The information herein is for informational purposes only and represents the current view of Microsoft Corporation as of the date of this presentation. Because Microsoft must respond to changing market conditions, it should not be interpreted to be a commitment on the part of Microsoft, and Microsoft cannot guarantee the accuracy of any information provided after the date of this presentation. MICROSOFT MAKES NO WARRANTIES, EXPRESS, IMPLIED OR STATUTORY, AS TO THE INFORMATION IN THIS PRESENTATION.