SignalR
Simplest way to achieve real-time web functionality
Agenda
• Introduction
• Hubs
• Scale Out / Backplane
• Self Host
Intro to SignalR
• A library for real-time web functionality
• Built on OWIN(SignalR 2.x)
• Open Web Interface for .Net
• Open source on Github
Intro to SignalR
• Built on persistent connections
• Remote Procedure Call(RPC)
• Server push
• Transports
• Web Socket
• Server Sent Event
• Forever Frame
• Long Polling
• Fallback
Transports
comet HTML 5
Long Polling Forever Frame
Server Sent
Event
Web Socket
Long Polling
• Response when server data
changed
Forever Frame
• Hidden iframe
• Only for IE
Server Sent Event
• HTML5 EventSource
• One way communication
(Server to client)
• Except IE
Web Socket
• Persistent full-duplex
bi-directional connection
• Criteria are met for both
server and client side
Web Browser Transport Requirements
Transport
Internet
Explorer
Chrome
(Windows or
iOS)
Firefox
Safari
(OSX or iOS)
Android
WebSockets 10+ current - 1 current - 1 current – 1 N/A
Server-Sent
Events
N/A current - 1 current - 1 current - 1 N/A
ForeverFrame 8+ N/A N/A N/A 4.1
Long Polling 8+ current – 1 current - 1 current - 1 4.1
Core Architecture
• pub/sub
• Publish-Subscribe pattern
Core Architecture
publisher
message cache
worker worker worker
client client client client client
message bus
1.Message serialized,
saved to cache
associated with signal,
topic is marked for
delivery, publish call
returns
2. Worker is scheduled for
a signal, selects a waiting
subscriber, retrieves
message from cache
3. Worker sends message
to client as bytes over a
transport
Watch out
• Sending large messages
• Memory leaks – all hub instances are transient
• Session – don’t use it from SignalR, at all, ever (no support)
Platform Support
• OS
• Windows 2008 r2 to 2012
• Windows 7+
• Windows Azure(No support Web Socket)
• .Net framework
• .Net 4.5+(Web Socket support)
• .Net 4
• IIS
• IIS 8(Web Socket support)
• IIS 7 and IIS 7.5
Hubs
• Least developer work
• Monitor network transport
• Specifying network technology
• Accept/Return simple type, complex type
• Complex objects serialized to/from JSON
Hubs-Server side
• Register in Startup.cs
• HubName attribute
• Broadcast
• Clients.All.dynamic
• Clients.Caller.dynamic
• Clients.Others.dynamic
• Clients.Caller(Context.ConnectionId).dynamic
• Clients.AllExcept(connectionId, connectionId).dynamic
• Clients.User(userId).dynamic
PM> Install-Package Microsoft.AspNet.SignalR
public partial class Startup
{
public void Configuration(IAppBuilder app)
{
app.MapSignalR();
}
}
[HubName("alias")]
public class NewHub : Hub
{
}
Hubs-Client side
• jQuery base
• $.connection.hubName -> Camelcase
• $.connection.hub.start()
• $.connection.hub.start({ transport: [‘webSockets’,
‘longPolling’] })
• $.connection.hub.logging = true -> Debugging
• hub.server.serverMethod
• hub.client.dynamicMethod
<script src="~/scripts/jquery-
1.6.4.min.js"></script>
<script src="~/scripts/jquery.signalR-
2.2.0.js"></script>
<script src="~/SignalR/hubs"></script>
PM> Install-Package Microsoft.AspNet.SignalR.JS
Hubs
• Server
• OnConnected
• OnReconnected
• OnDisconnected
• Client
• $.connection.hub.start
• $.connection.hub.reconnecting
• $.connection.hub.disconnected
• $.connection.hub.connectionSlow
DEMO: First SignalR
Hubs
• Groups
• Send message to particular groups
• Not persisted on server
• Server side
• Groups.Add(Context.ConnectionId, groupName)
• Groups.Remove(Context.ConnectionId, groupName)
• Broadcast
• Clients.Group(groupName).dynamic
• Clients.Group(groupName, connectionId,
connectionId).dynamic
• Clients.OthersInGroup(groupName).dynamic
DEMO: UKWL with SignalR
Scale out
• Problem
client
Server 1 Server 2
Scale out + Backplane
Backplane
clien
t
Server
clien
t
clien
t
clien
t
clien
t
clien
t
Server
clien
t
clien
t
clien
t
clien
t
clien
t
Server
clien
t
clien
t
clien
t
clien
t
Backplane
• HOW TO
• Nuget + ONE line code
• Limitation
• Much slower than single server
• Lower rate
Load patterns
• Server broadcast – low rate, message to all clients
• Server push – low rate, message to unique clients
• User event driven – broadcast on client action
• High frequency – fixed high rate, unique messages
Backplane
• Redis
• SQL Server
• Azure Service Bus
PM> Install-Package Microsoft.AspNet.SignalR.Redis
public partial class Startup
{
public void Configuration(IAppBuilder app)
{
app.MapSignalR();
}
}
GlobalHost.DependencyResolver.UseRedis("server", port, "password",
"AppName");
DEMO: Scale out with Redis
Self host
• Normally hosted in IIS
• WHY self-hosted
• No IIS
• Performance issue
• Console / Windows Form Application
Self host - Server
class Program
{
static void Main(string[] args)
{
using (WebApp.Start("http://localhost:8080")) {
Console.ReadLine();
}
}
}
class Startup
{
public void Configuration(IAppBuilder app)
{
app.UseCors(CorsOptions.AllowAll);
app.MapSignalR();
}
}
PM> Install-Package Microsoft.AspNet.SignalR.SelfHost
PM> Install-Package Microsoft.Owin.Cors
Self host - Client
<script type="text/javascript">
$(function () {
$.connection.hub.url = "http://localhost:8080/signalr";
});
</script>
PM> Install-Package Microsoft.AspNet.SignalR.JS
<script src="~/scripts/jquery-1.6.4.min.js"></script>
<script src="~/scripts/jquery.signalR-2.2.0.js"></script>
<script src="http://localhost:8080/signalr/hubs"></script>
Q & A

signalr

  • 1.
    SignalR Simplest way toachieve real-time web functionality
  • 2.
    Agenda • Introduction • Hubs •Scale Out / Backplane • Self Host
  • 3.
    Intro to SignalR •A library for real-time web functionality • Built on OWIN(SignalR 2.x) • Open Web Interface for .Net • Open source on Github
  • 4.
    Intro to SignalR •Built on persistent connections • Remote Procedure Call(RPC) • Server push • Transports • Web Socket • Server Sent Event • Forever Frame • Long Polling • Fallback
  • 5.
    Transports comet HTML 5 LongPolling Forever Frame Server Sent Event Web Socket
  • 6.
    Long Polling • Responsewhen server data changed
  • 7.
    Forever Frame • Hiddeniframe • Only for IE
  • 8.
    Server Sent Event •HTML5 EventSource • One way communication (Server to client) • Except IE
  • 9.
    Web Socket • Persistentfull-duplex bi-directional connection • Criteria are met for both server and client side
  • 10.
    Web Browser TransportRequirements Transport Internet Explorer Chrome (Windows or iOS) Firefox Safari (OSX or iOS) Android WebSockets 10+ current - 1 current - 1 current – 1 N/A Server-Sent Events N/A current - 1 current - 1 current - 1 N/A ForeverFrame 8+ N/A N/A N/A 4.1 Long Polling 8+ current – 1 current - 1 current - 1 4.1
  • 11.
    Core Architecture • pub/sub •Publish-Subscribe pattern
  • 12.
    Core Architecture publisher message cache workerworker worker client client client client client message bus 1.Message serialized, saved to cache associated with signal, topic is marked for delivery, publish call returns 2. Worker is scheduled for a signal, selects a waiting subscriber, retrieves message from cache 3. Worker sends message to client as bytes over a transport
  • 13.
    Watch out • Sendinglarge messages • Memory leaks – all hub instances are transient • Session – don’t use it from SignalR, at all, ever (no support)
  • 14.
    Platform Support • OS •Windows 2008 r2 to 2012 • Windows 7+ • Windows Azure(No support Web Socket) • .Net framework • .Net 4.5+(Web Socket support) • .Net 4 • IIS • IIS 8(Web Socket support) • IIS 7 and IIS 7.5
  • 15.
    Hubs • Least developerwork • Monitor network transport • Specifying network technology • Accept/Return simple type, complex type • Complex objects serialized to/from JSON
  • 16.
    Hubs-Server side • Registerin Startup.cs • HubName attribute • Broadcast • Clients.All.dynamic • Clients.Caller.dynamic • Clients.Others.dynamic • Clients.Caller(Context.ConnectionId).dynamic • Clients.AllExcept(connectionId, connectionId).dynamic • Clients.User(userId).dynamic PM> Install-Package Microsoft.AspNet.SignalR public partial class Startup { public void Configuration(IAppBuilder app) { app.MapSignalR(); } } [HubName("alias")] public class NewHub : Hub { }
  • 17.
    Hubs-Client side • jQuerybase • $.connection.hubName -> Camelcase • $.connection.hub.start() • $.connection.hub.start({ transport: [‘webSockets’, ‘longPolling’] }) • $.connection.hub.logging = true -> Debugging • hub.server.serverMethod • hub.client.dynamicMethod <script src="~/scripts/jquery- 1.6.4.min.js"></script> <script src="~/scripts/jquery.signalR- 2.2.0.js"></script> <script src="~/SignalR/hubs"></script> PM> Install-Package Microsoft.AspNet.SignalR.JS
  • 18.
    Hubs • Server • OnConnected •OnReconnected • OnDisconnected • Client • $.connection.hub.start • $.connection.hub.reconnecting • $.connection.hub.disconnected • $.connection.hub.connectionSlow
  • 19.
  • 20.
    Hubs • Groups • Sendmessage to particular groups • Not persisted on server • Server side • Groups.Add(Context.ConnectionId, groupName) • Groups.Remove(Context.ConnectionId, groupName) • Broadcast • Clients.Group(groupName).dynamic • Clients.Group(groupName, connectionId, connectionId).dynamic • Clients.OthersInGroup(groupName).dynamic
  • 21.
  • 22.
  • 23.
    Scale out +Backplane Backplane clien t Server clien t clien t clien t clien t clien t Server clien t clien t clien t clien t clien t Server clien t clien t clien t clien t
  • 24.
    Backplane • HOW TO •Nuget + ONE line code • Limitation • Much slower than single server • Lower rate
  • 25.
    Load patterns • Serverbroadcast – low rate, message to all clients • Server push – low rate, message to unique clients • User event driven – broadcast on client action • High frequency – fixed high rate, unique messages
  • 26.
    Backplane • Redis • SQLServer • Azure Service Bus PM> Install-Package Microsoft.AspNet.SignalR.Redis public partial class Startup { public void Configuration(IAppBuilder app) { app.MapSignalR(); } } GlobalHost.DependencyResolver.UseRedis("server", port, "password", "AppName");
  • 27.
    DEMO: Scale outwith Redis
  • 28.
    Self host • Normallyhosted in IIS • WHY self-hosted • No IIS • Performance issue • Console / Windows Form Application
  • 29.
    Self host -Server class Program { static void Main(string[] args) { using (WebApp.Start("http://localhost:8080")) { Console.ReadLine(); } } } class Startup { public void Configuration(IAppBuilder app) { app.UseCors(CorsOptions.AllowAll); app.MapSignalR(); } } PM> Install-Package Microsoft.AspNet.SignalR.SelfHost PM> Install-Package Microsoft.Owin.Cors
  • 30.
    Self host -Client <script type="text/javascript"> $(function () { $.connection.hub.url = "http://localhost:8080/signalr"; }); </script> PM> Install-Package Microsoft.AspNet.SignalR.JS <script src="~/scripts/jquery-1.6.4.min.js"></script> <script src="~/scripts/jquery.signalR-2.2.0.js"></script> <script src="http://localhost:8080/signalr/hubs"></script>
  • 31.

Editor's Notes

  • #2 https://channel9.msdn.com/Events/TechEd/NorthAmerica/2014/DEV-B416#fbid= https://channel9.msdn.com/Events/Build/2013/3-502
  • #4 http://www.asp.net/signalr/overview/getting-started/introduction-to-signalr http://owin.org/ http://www.asp.net/aspnet/overview/owin-and-katana/getting-started-with-owin-and-katana
  • #7 http://stackoverflow.com/questions/11077857/what-are-long-polling-websockets-server-sent-events-sse-and-comet http://nadirmuzaffar.blogspot.tw/2013/03/polling-long-polling-comet-server-side.html
  • #8 http://stackoverflow.com/questions/11077857/what-are-long-polling-websockets-server-sent-events-sse-and-comet http://nadirmuzaffar.blogspot.tw/2013/03/polling-long-polling-comet-server-side.html http://stackoverflow.com/questions/12078550/is-comet-obsolete-now-with-server-sent-events-and-websocket http://www.leggetter.co.uk/real-time-web-technologies-guide/realtime-web-technology-transport-mechanisms/
  • #10 http://cometdaily.com/2007/11/05/the-forever-frame-technique/
  • #11 http://stackoverflow.com/questions/11077857/what-are-long-polling-websockets-server-sent-events-sse-and-comet http://nadirmuzaffar.blogspot.tw/2013/03/polling-long-polling-comet-server-side.html
  • #12 http://stackoverflow.com/questions/11077857/what-are-long-polling-websockets-server-sent-events-sse-and-comet http://nadirmuzaffar.blogspot.tw/2013/03/polling-long-polling-comet-server-side.html
  • #13 http://www.asp.net/signalr/overview/getting-started/supported-platforms
  • #18 http://www.asp.net/signalr/overview/guide-to-the-api/hubs-api-guide-server
  • #21 http://www.asp.net/signalr/overview/guide-to-the-api/handling-connection-lifetime-eventsr
  • #23 http://www.asp.net/signalr/overview/guide-to-the-api/hubs-api-guide-server#route
  • #25 http://www.asp.net/signalr/overview/performance/scaleout-in-signalr http://www.tugberkugurlu.com/archive/scaling-out-signalr-with-a-redis-backplane-and-testing-it-with-iis-express
  • #29 http://www.asp.net/signalr/overview/performance/scaleout-with-sql-server http://www.asp.net/signalr/overview/performance/scaleout-with-redis http://www.asp.net/signalr/overview/performance/scaleout-with-windows-azure-service-bus
  • #31 http://www.asp.net/signalr/overview/deployment/tutorial-signalr-self-host