Top Banner
183

Real-Time Web Apps & .NET - What are your options?

Jan 13, 2017

Download

Software

Phil Leggetter
Welcome message from author
This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
Transcript
Page 1: Real-Time Web Apps & .NET - What are your options?
Page 2: Real-Time Web Apps & .NET - What are your options?

PHIL @LEGGETTERHead of Developer Relations

2 / 121

@leggetter

Page 3: Real-Time Web Apps & .NET - What are your options?

3 / 121

@leggetter

Page 4: Real-Time Web Apps & .NET - What are your options?

What we'll cover

1. Why Real-Time?2. Common Real-Time Use Cases3. What are your options?

How do you choose?.NET examplesPros & Cons

4. The Future of Real-Time

4 / 121

@leggetter

Page 5: Real-Time Web Apps & .NET - What are your options?

When do we need Realtime?

5 / 121

@leggetter

Page 6: Real-Time Web Apps & .NET - What are your options?

WCaaS

6 / 121

@leggetter

Page 7: Real-Time Web Apps & .NET - What are your options?

WCaaS

Data: Is there a timely nature to the data?

6 / 121

@leggetter

Page 8: Real-Time Web Apps & .NET - What are your options?

7 / 121

@leggetter

Page 9: Real-Time Web Apps & .NET - What are your options?

User Experience: Is there a timely nature to the

experience?

7 / 121

@leggetter

Page 10: Real-Time Web Apps & .NET - What are your options?

Realtime is required when there's a Need or

Demand for:

Up to date informationInteraction to maintain engagement (UX)

8 / 121

@leggetter

Page 11: Real-Time Web Apps & .NET - What are your options?

These aren't new Needs or Demands

But...

9 / 121

@leggetter

Page 12: Real-Time Web Apps & .NET - What are your options?

These aren't new Needs or Demands

But...

The Internet

9 / 121

@leggetter

Page 13: Real-Time Web Apps & .NET - What are your options?

Internet

“ a global computer network providing a varietyof information and communication facilities,consisting of interconnected networks usingstandardized communication protocols.

10 / 121

@leggetter

Page 14: Real-Time Web Apps & .NET - What are your options?

11 / 121

@leggetter

Page 15: Real-Time Web Apps & .NET - What are your options?

12 / 121

@leggetter

Page 16: Real-Time Web Apps & .NET - What are your options?

13 / 121

@leggetter

Page 17: Real-Time Web Apps & .NET - What are your options?

HTTP was better. But many wanted more.

14 / 121

@leggetter

Page 18: Real-Time Web Apps & .NET - What are your options?

15 / 121

@leggetter

Page 19: Real-Time Web Apps & .NET - What are your options?

16 / 121

@leggetter

Page 20: Real-Time Web Apps & .NET - What are your options?

17 / 121

@leggetter

Page 21: Real-Time Web Apps & .NET - What are your options?

HTTP + Browsers were restrictive

HTTP - request/response paradigmKeeping persistent HTTP connections aliveNo cross-browser XMLHttpRequest2 connection limitNo browser cross origin supportGeneral cross browser incompatibilities

18 / 121

@leggetter

Page 22: Real-Time Web Apps & .NET - What are your options?

HTTP + Browsers were restrictive

HTTP - request/response paradigmKeeping persistent HTTP connections aliveNo cross-browser XMLHttpRequest2 connection limitNo browser cross origin supportGeneral cross browser incompatibilitiesSo we HACKED! Java Applets, Flash, HTTP Hacks

18 / 121

@leggetter

Page 23: Real-Time Web Apps & .NET - What are your options?

Then Real-Time Went Mainstream

19 / 121

@leggetter

Page 24: Real-Time Web Apps & .NET - What are your options?

Social

20 / 121

@leggetter

Page 25: Real-Time Web Apps & .NET - What are your options?

Technology Advancements

Memory & CPU speed and costThe CloudBrowser standardisation & enhancementsAny client can use the standards

21 / 121

@leggetter

Page 26: Real-Time Web Apps & .NET - What are your options?

22 / 121

@leggetter

Page 27: Real-Time Web Apps & .NET - What are your options?

MASSIVE Increase in Internet Usage

23 / 121

@leggetter

Page 31: Real-Time Web Apps & .NET - What are your options?

25 / 121

@leggetter

Page 32: Real-Time Web Apps & .NET - What are your options?

Common Real-Time Use Cases

26 / 121

@leggetter

Page 33: Real-Time Web Apps & .NET - What are your options?

Notifications & Activity Streams

27 / 121

@leggetter

Page 34: Real-Time Web Apps & .NET - What are your options?

Data Visualizations

28 / 121

@leggetter

Page 35: Real-Time Web Apps & .NET - What are your options?

29 / 121

Chat@leggetter

Page 36: Real-Time Web Apps & .NET - What are your options?

30 / 121

@leggetter

Page 37: Real-Time Web Apps & .NET - What are your options?

Real-Time Location Tracking

31 / 121

@leggetter

Page 38: Real-Time Web Apps & .NET - What are your options?

Multi-User Collaboration

32 / 121

@leggetter

Page 39: Real-Time Web Apps & .NET - What are your options?

WebRTC Powered AV Chat

33 / 121

@leggetter

Page 40: Real-Time Web Apps & .NET - What are your options?

34 / 121

@leggetter

Page 41: Real-Time Web Apps & .NET - What are your options?

Users expect a real-time UX

34 / 121

@leggetter

Page 42: Real-Time Web Apps & .NET - What are your options?

Users expect a real-time UX

Without a real-time UX your app appears

broken

34 / 121

@leggetter

Page 43: Real-Time Web Apps & .NET - What are your options?

Real-time Web Apps & .NET What are your options?

35 / 121

@leggetter

Page 44: Real-Time Web Apps & .NET - What are your options?

7 Factors to Consider

36 / 121

@leggetter

Page 45: Real-Time Web Apps & .NET - What are your options?

1. Should you keep on polling?

37 / 121

@leggetter

Page 46: Real-Time Web Apps & .NET - What are your options?

Polling Calculations

Scenario

1. Site average of 10,000 Users

38 / 121

@leggetter

Page 47: Real-Time Web Apps & .NET - What are your options?

Polling Calculations

Scenario

1. Site average of 10,000 Users2. Over 1 Hour, with a 10 second polling interval

38 / 121

@leggetter

Page 48: Real-Time Web Apps & .NET - What are your options?

Polling Calculations

Scenario

1. Site average of 10,000 Users2. Over 1 Hour, with a 10 second polling interval3. Requests from pages load + HTML, CSS, JS, Images for 10k users = 50,000

38 / 121

@leggetter

Page 49: Real-Time Web Apps & .NET - What are your options?

Polling Calculations

Scenario

1. Site average of 10,000 Users2. Over 1 Hour, with a 10 second polling interval3. Requests from pages load + HTML, CSS, JS, Images for 10k users = 50,0004. Poll requests per user/minute = (60 / 10) = 6

38 / 121

@leggetter

Page 50: Real-Time Web Apps & .NET - What are your options?

Polling Calculations

Scenario

1. Site average of 10,000 Users2. Over 1 Hour, with a 10 second polling interval3. Requests from pages load + HTML, CSS, JS, Images for 10k users = 50,0004. Poll requests per user/minute = (60 / 10) = 65. Poll requests per user/hour = (6 * 60) = 360

38 / 121

@leggetter

Page 51: Real-Time Web Apps & .NET - What are your options?

Polling Calculations

Scenario

1. Site average of 10,000 Users2. Over 1 Hour, with a 10 second polling interval3. Requests from pages load + HTML, CSS, JS, Images for 10k users = 50,0004. Poll requests per user/minute = (60 / 10) = 65. Poll requests per user/hour = (6 * 60) = 3606. Poll requests site wide per hour = (360 * 10,000) = 3,600,000

38 / 121

@leggetter

Page 52: Real-Time Web Apps & .NET - What are your options?

Polling Calculations

Scenario

1. Site average of 10,000 Users2. Over 1 Hour, with a 10 second polling interval3. Requests from pages load + HTML, CSS, JS, Images for 10k users = 50,0004. Poll requests per user/minute = (60 / 10) = 65. Poll requests per user/hour = (6 * 60) = 3606. Poll requests site wide per hour = (360 * 10,000) = 3,600,000

With polling the site would need to handle 3.65 Million requests per hour

Or 50k HTTP requests + maintain 10k persistent connections?

38 / 121

@leggetter

Page 53: Real-Time Web Apps & .NET - What are your options?

Cache - clients keep pollingPush Proxy solutions

fanout.iostreamdata.io

Quick Win solutions

39 / 121

@leggetter

Page 54: Real-Time Web Apps & .NET - What are your options?

2. Use an existing solution

Don't reinvent the wheel

Unless you've a unique use case

40 / 121

@leggetter

Page 55: Real-Time Web Apps & .NET - What are your options?

Why use an existing solution?

Connection fallback/upgrade hacks still requiredWebSocket: 91% of connectionsHTTP fallback: 9% of connections

41 / 121

@leggetter

Page 56: Real-Time Web Apps & .NET - What are your options?

Why use an existing solution?

Connection fallback/upgrade hacks still requiredWebSocket: 91% of connectionsHTTP fallback: 9% of connections

Support/Community

41 / 121

@leggetter

Page 57: Real-Time Web Apps & .NET - What are your options?

Why use an existing solution?

Connection fallback/upgrade hacks still requiredWebSocket: 91% of connectionsHTTP fallback: 9% of connections

Support/CommunityMaintenance

41 / 121

@leggetter

Page 58: Real-Time Web Apps & .NET - What are your options?

Why use an existing solution?

Connection fallback/upgrade hacks still requiredWebSocket: 91% of connectionsHTTP fallback: 9% of connections

Support/CommunityMaintenanceFuture features

41 / 121

@leggetter

Page 59: Real-Time Web Apps & .NET - What are your options?

Why use an existing solution?

Connection fallback/upgrade hacks still requiredWebSocket: 91% of connectionsHTTP fallback: 9% of connections

Support/CommunityMaintenanceFuture featuresScaling

41 / 121

@leggetter

Page 60: Real-Time Web Apps & .NET - What are your options?

42 / 121

@leggetter

Page 61: Real-Time Web Apps & .NET - What are your options?

j.mp/realtime-tech-guide

42 / 121

@leggetter

Page 62: Real-Time Web Apps & .NET - What are your options?

3. Use languages you're comfortable

with

43 / 121

@leggetter

Page 63: Real-Time Web Apps & .NET - What are your options?

3. Use languages you're comfortable

with

43 / 121

@leggetter

Page 64: Real-Time Web Apps & .NET - What are your options?

Solutions by language

PHP: Ratchet, dNode-phpJava: Netty, JettyJavaScript (Node.JS): Faye, Socket.IO (Engine.IO), Primus.io.NET (C#): SignalR, XSocketsPython: Lots of options built on TornadoRuby: em-websocket, FayeLanguage agnostic: most hosted services

44 / 121

@leggetter

Page 65: Real-Time Web Apps & .NET - What are your options?

4. Mobile Friendly?

45 / 121

@leggetter

Page 66: Real-Time Web Apps & .NET - What are your options?

Mobile Friendly

Only some have mobile libraries

46 / 121

@leggetter

Page 67: Real-Time Web Apps & .NET - What are your options?

Mobile Friendly

Only some have mobile librariesHow much data are you sending?

46 / 121

@leggetter

Page 68: Real-Time Web Apps & .NET - What are your options?

Mobile Friendly

Only some have mobile librariesHow much data are you sending?SSL required on 3/4G networks

46 / 121

@leggetter

Page 69: Real-Time Web Apps & .NET - What are your options?

5. Application/Solution Communication Patterns

47 / 121

@leggetter

Page 70: Real-Time Web Apps & .NET - What are your options?

5. Application/Solution Communication Patterns

How does the client/server & client/client communicate

47 / 121

@leggetter

Page 71: Real-Time Web Apps & .NET - What are your options?

Simple Messaging

48 / 121

@leggetter

Page 72: Real-Time Web Apps & .NET - What are your options?

0:00 49 / 121

@leggetter

Internet ^5 Machine

Page 73: Real-Time Web Apps & .NET - What are your options?

0:00 49 / 121

@leggetter

Internet ^5 Machine

Page 74: Real-Time Web Apps & .NET - What are your options?

Simple Messaging

// client

var ws = new WebSocket('wss://localhost/');

50 / 121

@leggetter

Page 75: Real-Time Web Apps & .NET - What are your options?

Simple Messaging

// client

var ws = new WebSocket('wss://localhost/');

ws.onmessage = function(evt) { var data = JSON.parse(evt.data);

50 / 121

@leggetter

Page 76: Real-Time Web Apps & .NET - What are your options?

Simple Messaging

// client

var ws = new WebSocket('wss://localhost/');

ws.onmessage = function(evt) { var data = JSON.parse(evt.data);

// ^5 performHighFive();};

50 / 121

@leggetter

Page 77: Real-Time Web Apps & .NET - What are your options?

Simple Messaging

// client

var ws = new WebSocket('wss://localhost/');

ws.onmessage = function(evt) { var data = JSON.parse(evt.data);

// ^5 performHighFive();};

// server

server.on('connection', function(socket){

50 / 121

@leggetter

Page 78: Real-Time Web Apps & .NET - What are your options?

Simple Messaging

// client

var ws = new WebSocket('wss://localhost/');

ws.onmessage = function(evt) { var data = JSON.parse(evt.data);

// ^5 performHighFive();};

// server

server.on('connection', function(socket){

socket.send(JSON.stringify({action: 'high-5'}));});

50 / 121

@leggetter

Page 79: Real-Time Web Apps & .NET - What are your options?

Simple Messaging

using Nexmo.Api;

// SMSvar results = SMS.Send(new SMS.SMSRequest { from = "15555551212", to = "17775551212", text = "this is a test" });

// Voicevar result = Voice.TextToSpeech(new Voice.TextToSpeechCallCommand { to = "17775551212", from = "15555551212", text = "Hello from Nexmo" });

51 / 121

@leggetter

Page 80: Real-Time Web Apps & .NET - What are your options?

PubSub

52 / 121

@leggetter

Page 81: Real-Time Web Apps & .NET - What are your options?

53 / 121

@leggetter

Page 82: Real-Time Web Apps & .NET - What are your options?

PubSub

// client

var client = new Faye.Client('http://localhost:8000/faye');

54 / 121

@leggetter

Page 83: Real-Time Web Apps & .NET - What are your options?

PubSub

// client

var client = new Faye.Client('http://localhost:8000/faye');

client.subscribe('/leggetter-updates', function(data) {

54 / 121

@leggetter

Page 84: Real-Time Web Apps & .NET - What are your options?

PubSub

// client

var client = new Faye.Client('http://localhost:8000/faye');

client.subscribe('/leggetter-updates', function(data) {

console.log(data.text);});

54 / 121

@leggetter

Page 85: Real-Time Web Apps & .NET - What are your options?

PubSub

// client

var client = new Faye.Client('http://localhost:8000/faye');

client.subscribe('/leggetter-updates', function(data) {

console.log(data.text);});

client.subscribe('/leggetter-dm-notifications', function(data) { console.log(data.count);});

54 / 121

@leggetter

Page 86: Real-Time Web Apps & .NET - What are your options?

PubSub

// client

var client = new Faye.Client('http://localhost:8000/faye');

client.subscribe('/leggetter-updates', function(data) {

console.log(data.text);});

client.subscribe('/leggetter-dm-notifications', function(data) { console.log(data.count);});

// server

server.publish('/leggetter-updates', {text: 'Hello DevWeek!'});

54 / 121

@leggetter

Page 87: Real-Time Web Apps & .NET - What are your options?

PubSub

// client

var client = new Faye.Client('http://localhost:8000/faye');

client.subscribe('/leggetter-updates', function(data) {

console.log(data.text);});

client.subscribe('/leggetter-dm-notifications', function(data) { console.log(data.count);});

// server

server.publish('/leggetter-updates', {text: 'Hello DevWeek!'});

server.publish('/leggetter-dm-notifications', {count: 2});

54 / 121

@leggetter

Page 88: Real-Time Web Apps & .NET - What are your options?

Evented PubSub

55 / 121

@leggetter

Page 89: Real-Time Web Apps & .NET - What are your options?

Evented PubSub

// client

var updates = io('/leggetter-updates');

56 / 121

@leggetter

Page 90: Real-Time Web Apps & .NET - What are your options?

Evented PubSub

// client

var updates = io('/leggetter-updates');updates.on('created', function (data) { // Add activity to UI});

56 / 121

@leggetter

Page 91: Real-Time Web Apps & .NET - What are your options?

Evented PubSub

// client

var updates = io('/leggetter-updates');updates.on('created', function (data) { // Add activity to UI});updates.on('updated', function(data) { // Update activity});updates.on('deleted', function(data) { // Remove activity});

56 / 121

@leggetter

Page 92: Real-Time Web Apps & .NET - What are your options?

Evented PubSub

// client

var updates = io('/leggetter-updates');updates.on('created', function (data) { // Add activity to UI});updates.on('updated', function(data) { // Update activity});updates.on('deleted', function(data) { // Remove activity});

// server

var io = require('socket.io')();var updates = io.of('/leggetter-updates');

56 / 121

@leggetter

Page 93: Real-Time Web Apps & .NET - What are your options?

Evented PubSub

// client

var updates = io('/leggetter-updates');updates.on('created', function (data) { // Add activity to UI});updates.on('updated', function(data) { // Update activity});updates.on('deleted', function(data) { // Remove activity});

// server

var io = require('socket.io')();var updates = io.of('/leggetter-updates');updates.emit('created', {text: 'PubSub Rocks!', id: 1});

56 / 121

@leggetter

Page 94: Real-Time Web Apps & .NET - What are your options?

Evented PubSub

// client

var updates = io('/leggetter-updates');updates.on('created', function (data) { // Add activity to UI});updates.on('updated', function(data) { // Update activity});updates.on('deleted', function(data) { // Remove activity});

// server

var io = require('socket.io')();var updates = io.of('/leggetter-updates');updates.emit('created', {text: 'PubSub Rocks!', id: 1});updates.emit('updated', {text: 'Evented PubSub Rocks!', id: 1});updates.emit('deleted', {id: 1});

56 / 121

@leggetter

Page 95: Real-Time Web Apps & .NET - What are your options?

PubSub vs. Evented PubSub

57 / 121

@leggetter

Page 96: Real-Time Web Apps & .NET - What are your options?

58 / 121

@leggetter

Page 97: Real-Time Web Apps & .NET - What are your options?

59 / 121

@leggetter

Page 98: Real-Time Web Apps & .NET - What are your options?

PubSub

client.subscribe('devexp-channel', function(data) { if(data.eventType === 'chat-message') { addMessage(data.message); }

60 / 121

@leggetter

Page 99: Real-Time Web Apps & .NET - What are your options?

PubSub

client.subscribe('devexp-channel', function(data) { if(data.eventType === 'chat-message') { addMessage(data.message); } else if(data.eventType === 'channel-purposed-changed') { updateRoomTitle(data.purpose); } else if(/* and so on */) { }})

60 / 121

@leggetter

Page 100: Real-Time Web Apps & .NET - What are your options?

PubSub

client.subscribe('devexp-channel', function(data) { if(data.eventType === 'chat-message') { addMessage(data.message); } else if(data.eventType === 'channel-purposed-changed') { updateRoomTitle(data.purpose); } else if(/* and so on */) { }})

Evented PubSub

var devexp = io('/devexp-channel');devexp.on('chat-message', addMessage);devexp.on('channel-purposed-changed', updateChannelPurpose);

60 / 121

@leggetter

Page 101: Real-Time Web Apps & .NET - What are your options?

PubSub

client.subscribe('devexp-channel', function(data) { if(data.eventType === 'chat-message') { addMessage(data.message); } else if(data.eventType === 'channel-purposed-changed') { updateRoomTitle(data.purpose); } else if(/* and so on */) { }})

Evented PubSub

var devexp = io('/devexp-channel');devexp.on('chat-message', addMessage);devexp.on('channel-purposed-changed', updateChannelPurpose);devexp.on('current-topic-changed', updateChannelTopic);devexp.on('user-online', userOnline);devexp.on('user-offline', userOffline);

60 / 121

@leggetter

Page 102: Real-Time Web Apps & .NET - What are your options?

DataSync

61 / 121

@leggetter

Page 103: Real-Time Web Apps & .NET - What are your options?

62 / 121

@leggetter

Page 104: Real-Time Web Apps & .NET - What are your options?

Data Sync

// client

var ref = new Firebase("https://app.firebaseio.com/doc1/lines");

63 / 121

@leggetter

Page 105: Real-Time Web Apps & .NET - What are your options?

Data Sync

// client

var ref = new Firebase("https://app.firebaseio.com/doc1/lines");

ref.on('child_added', function(childSnapshot, prevChildKey) { // code to handle new child.});

63 / 121

@leggetter

Page 106: Real-Time Web Apps & .NET - What are your options?

Data Sync

// client

var ref = new Firebase("https://app.firebaseio.com/doc1/lines");

ref.on('child_added', function(childSnapshot, prevChildKey) { // code to handle new child.});

ref.on('child_changed', function(childSnapshot, prevChildKey) { // code to handle child data changes.});

63 / 121

@leggetter

Page 107: Real-Time Web Apps & .NET - What are your options?

Data Sync

// client

var ref = new Firebase("https://app.firebaseio.com/doc1/lines");

ref.on('child_added', function(childSnapshot, prevChildKey) { // code to handle new child.});

ref.on('child_changed', function(childSnapshot, prevChildKey) { // code to handle child data changes.});

ref.on('child_removed', function(oldChildSnapshot) { // code to handle child removal.});

63 / 121

@leggetter

Page 108: Real-Time Web Apps & .NET - What are your options?

Data Sync

// client

var ref = new Firebase("https://app.firebaseio.com/doc1/lines");

ref.on('child_added', function(childSnapshot, prevChildKey) { // code to handle new child.});

ref.on('child_changed', function(childSnapshot, prevChildKey) { // code to handle child data changes.});

ref.on('child_removed', function(oldChildSnapshot) { // code to handle child removal.});

ref.push({ 'editor_id': 'leggetter', 'text': 'Nexmo Rocks!' });

63 / 121

@leggetter

Page 109: Real-Time Web Apps & .NET - What are your options?

Data Sync

// client

var ref = new Firebase("https://app.firebaseio.com/doc1/lines");

ref.on('child_added', function(childSnapshot, prevChildKey) { // code to handle new child.});

ref.on('child_changed', function(childSnapshot, prevChildKey) { // code to handle child data changes.});

ref.on('child_removed', function(oldChildSnapshot) { // code to handle child removal.});

ref.push({ 'editor_id': 'leggetter', 'text': 'Nexmo Rocks!' });

Framework handles updates to other clients

63 / 121

@leggetter

Page 110: Real-Time Web Apps & .NET - What are your options?

RMI (aka RPC)

64 / 121

@leggetter

Page 111: Real-Time Web Apps & .NET - What are your options?

65 / 121

@leggetter

Page 112: Real-Time Web Apps & .NET - What are your options?

RMI

// clientvar chat = $.connection.chatHub;

66 / 121

@leggetter

Page 113: Real-Time Web Apps & .NET - What are your options?

RMI

// clientvar chat = $.connection.chatHub;

chat.client.broadcastMessage = function (name, message) { // handle message};

66 / 121

@leggetter

Page 114: Real-Time Web Apps & .NET - What are your options?

RMI

// clientvar chat = $.connection.chatHub;

chat.client.broadcastMessage = function (name, message) { // handle message};

chat.server.send( 'me', 'hello world' );

66 / 121

@leggetter

Page 115: Real-Time Web Apps & .NET - What are your options?

RMI

// clientvar chat = $.connection.chatHub;

chat.client.broadcastMessage = function (name, message) { // handle message};

chat.server.send( 'me', 'hello world' );

$.connection.hub.start(); // async

66 / 121

@leggetter

Page 116: Real-Time Web Apps & .NET - What are your options?

RMI

// clientvar chat = $.connection.chatHub;

chat.client.broadcastMessage = function (name, message) { // handle message};

chat.server.send( 'me', 'hello world' );

$.connection.hub.start(); // async

// serverpublic class ChatHub : Hub{

66 / 121

@leggetter

Page 117: Real-Time Web Apps & .NET - What are your options?

RMI

// clientvar chat = $.connection.chatHub;

chat.client.broadcastMessage = function (name, message) { // handle message};

chat.server.send( 'me', 'hello world' );

$.connection.hub.start(); // async

// serverpublic class ChatHub : Hub{ public void Send(string name, string message) {

66 / 121

@leggetter

Page 118: Real-Time Web Apps & .NET - What are your options?

RMI

// clientvar chat = $.connection.chatHub;

chat.client.broadcastMessage = function (name, message) { // handle message};

chat.server.send( 'me', 'hello world' );

$.connection.hub.start(); // async

// serverpublic class ChatHub : Hub{ public void Send(string name, string message) { // Call the broadcastMessage method to update clients. Clients.All.broadcastMessage(name, message); }}

66 / 121

@leggetter

Page 119: Real-Time Web Apps & .NET - What are your options?

67 / 121

@leggetter

Page 120: Real-Time Web Apps & .NET - What are your options?

68 / 121

@leggetter

Page 121: Real-Time Web Apps & .NET - What are your options?

69 / 121

@leggetter

Page 122: Real-Time Web Apps & .NET - What are your options?

70 / 121

@leggetter

Page 123: Real-Time Web Apps & .NET - What are your options?

71 / 121

@leggetter

Page 124: Real-Time Web Apps & .NET - What are your options?

6. Deployment & ArchitectureConsiderations

72 / 121

@leggetter

Page 125: Real-Time Web Apps & .NET - What are your options?

Code

https://github.com/leggetter/realtime-dotnet-examplesShort link: http://j.mp/rt-dotnet-ex

73 / 121

@leggetter

Page 126: Real-Time Web Apps & .NET - What are your options?

Self Hosted (Tightly Coupled) 74 / 121

@leggetter

Page 127: Real-Time Web Apps & .NET - What are your options?

.NET Self-Hosted Real-Time options

SignalRXSockets

75 / 121

@leggetter

Page 128: Real-Time Web Apps & .NET - What are your options?

76 / 121

@leggetter

Page 129: Real-Time Web Apps & .NET - What are your options?

Self-Hosted Demo 1: ASP.NET + SignalR (Tightly Coupled)76 / 121

@leggetter

Page 130: Real-Time Web Apps & .NET - What are your options?

What we'll look at:

References\Microsoft.AspNet.SignalR.*

Scripts\jquery.signalR*.js

App_Start\SignalRStartup.cs

Controllers\HomeController.cs

Hubs\ChatHub.cs

Views\Home\SignalR.cshtml

Script\chat\SignalRChat.js

77 / 121

@leggetter

Page 131: Real-Time Web Apps & .NET - What are your options?

Pros

.NETSimple integrationMS SupportedjQuery Dependency

Cons

Tightly coupledRMI onlySelf-ScalingScaling (realtime + HTTP)

Self-Hosted Demo 1: Pro & Cons

78 / 121

@leggetter

Page 132: Real-Time Web Apps & .NET - What are your options?

79 / 121

@leggetter

Page 133: Real-Time Web Apps & .NET - What are your options?

Self-Hosted Demo 2: ASP.NET + XSockets (Tightly Coupled)79 / 121

@leggetter

Page 134: Real-Time Web Apps & .NET - What are your options?

What we'll look at:

References\XSockets.*

App_Start\XSocketsStartup.cs

Controllers\HomeController.cs

XSockets\ChatController.cs

Views\Home\XSockets.cshtml

Scripts\XSockets.latest.js

Script\chat\XSocketsChat.cs

80 / 121

@leggetter

Page 135: Real-Time Web Apps & .NET - What are your options?

Pros

.NETSimple integrationCommunication patterns

PubSub/EventedRMI

Licensed

Cons

Tightly coupledSelf-ScalingScaling (realtime + HTTP)Licensed

Self-Hosted Demo 2: Pro & Cons

81 / 121

@leggetter

Page 136: Real-Time Web Apps & .NET - What are your options?

Self-Hosted: .NET + Message Queue (Loosely Coupled)82 / 121

@leggetter

Page 137: Real-Time Web Apps & .NET - What are your options?

83 / 121

@leggetter

Page 138: Real-Time Web Apps & .NET - What are your options?

Pros

.NETMaps well to PubSubLoosely coupledCould use another runtime

Cons

How does it fit with RMI/SignalR?Multiple componentsSelf-scalingQueue routing questionsIn: HTTP. Out: WebSocket

Self-Hosted: .NET + Message Queue - Pro &

Cons

84 / 121

@leggetter

Page 139: Real-Time Web Apps & .NET - What are your options?

85 / 121

@leggetter

Page 140: Real-Time Web Apps & .NET - What are your options?

Self-Hosted: ASP.NET + Faye

(Loosely Coupled)85 / 121

@leggetter

Page 141: Real-Time Web Apps & .NET - What are your options?

Pros

PubSubConnection fallbackRedis Queue supportSimple integration

Cons

Not .NET(?)You need to scale

Self-Hosted + Faye: Pros & Cons

86 / 121

@leggetter

Page 142: Real-Time Web Apps & .NET - What are your options?

.NET Hosted Real-Time options

AblyFirebaseFanoutPubNubPusherRealtime.coSyncano

87 / 121

@leggetter

Page 143: Real-Time Web Apps & .NET - What are your options?

88 / 121

@leggetter

Page 144: Real-Time Web Apps & .NET - What are your options?

Hosted Demo: Pusher88 / 121

@leggetter

Page 145: Real-Time Web Apps & .NET - What are your options?

What we'll look at:

References\PusherServer

Controllers\HomeController.cs

Views\Home\Pusher.cshtml

Script\chat\PusherChat.js

Pusher Debug Console

89 / 121

@leggetter

Page 146: Real-Time Web Apps & .NET - What are your options?

Pros

Simple & powerfulInstantly scalableManaged & dedicatedDirect integration. No overhead.

Cons

3rd party relianceDifficult to influence functionality

Hosted - Pros & Cons

90 / 121

@leggetter

Page 147: Real-Time Web Apps & .NET - What are your options?

Why use a hosted service?

Scenario

1. Site average of 10,000 Users

91 / 121

@leggetter

Page 148: Real-Time Web Apps & .NET - What are your options?

Why use a hosted service?

Scenario

1. Site average of 10,000 Users2. Over 1 Hour, no polling

91 / 121

@leggetter

Page 149: Real-Time Web Apps & .NET - What are your options?

Why use a hosted service?

Scenario

1. Site average of 10,000 Users2. Over 1 Hour, no polling3. Requests from pages load + HTML, CSS, JS, Images for 10k users = 50,000

91 / 121

@leggetter

Page 150: Real-Time Web Apps & .NET - What are your options?

Why use a hosted service?

Scenario

1. Site average of 10,000 Users2. Over 1 Hour, no polling3. Requests from pages load + HTML, CSS, JS, Images for 10k users = 50,0004. That's it! Total: 50,000

91 / 121

@leggetter

Page 151: Real-Time Web Apps & .NET - What are your options?

Why use a hosted service?

Scenario

1. Site average of 10,000 Users2. Over 1 Hour, no polling3. Requests from pages load + HTML, CSS, JS, Images for 10k users = 50,0004. That's it! Total: 50,000

Your servers handle 50k requests per hour instead of 3.6M

You offload the polling or persistent connections to the service

91 / 121

@leggetter

Page 152: Real-Time Web Apps & .NET - What are your options?

7. Self-Hosted v Hosted

"Build vs. Buy"

92 / 121

@leggetter

Page 153: Real-Time Web Apps & .NET - What are your options?

Build vs. Buy - Costs

baremetrics.com/calculator

93 / 121

@leggetter

Page 154: Real-Time Web Apps & .NET - What are your options?

How do you choose?

7 Realtime Framework Considerations

1. Should you keep on polling?2. Use an Existing Solution3. Use a language you're comfortable with4. Do you need native mobile support?5. Simple Messaging, PubSub/Evented, RMI or DataSync6. Architectural considerations7. Hosted v Self-Hosted (Build vs. Buy)

94 / 121

@leggetter

Page 155: Real-Time Web Apps & .NET - What are your options?

Future

95 / 121

@leggetter

Page 156: Real-Time Web Apps & .NET - What are your options?

Network Infrastructure & Protocols

ReliabilitySpeedBeyond HTTPHTTP2

96 / 121

@leggetter

Page 158: Real-Time Web Apps & .NET - What are your options?

98 / 121

@leggetter

Page 159: Real-Time Web Apps & .NET - What are your options?

FirebaseGitHubIron.ioMailChimp

MailJetPagerDutyNexmoSendGrid

Real-Time APIs

99 / 121

@leggetter

Page 160: Real-Time Web Apps & .NET - What are your options?

100 / 121

@leggetter

Page 161: Real-Time Web Apps & .NET - What are your options?

More "Things"!

101 / 121

@leggetter

Page 162: Real-Time Web Apps & .NET - What are your options?

The Physical Web

102 / 121

@leggetter

Page 163: Real-Time Web Apps & .NET - What are your options?

IoT, Apps & Developers

103 / 121

@leggetter

Page 164: Real-Time Web Apps & .NET - What are your options?

A thing can be anything

104 / 121

@leggetter

Page 165: Real-Time Web Apps & .NET - What are your options?

A thing can be anything

SensorsAppliancesVehiclesSmart PhonesDevices (Arduino, Electric Imp, Raspberry Pi etc.)

104 / 121

@leggetter

Page 166: Real-Time Web Apps & .NET - What are your options?

A thing can be anything

SensorsAppliancesVehiclesSmart PhonesDevices (Arduino, Electric Imp, Raspberry Pi etc.)ServersBrowsersApps: Native, Web, running anywhere

104 / 121

@leggetter

Page 167: Real-Time Web Apps & .NET - What are your options?

The Majority of code we'll write will still be

for "Apps"

ConfiguringMonitoringInteractingApp Logic

105 / 121

@leggetter

Page 168: Real-Time Web Apps & .NET - What are your options?

Real-Time Use Case Evolution

Notifications & SignallingActivity StreamsData Viz & PollsChatCollaborationMultiplayer Games

106 / 121

@leggetter

Page 169: Real-Time Web Apps & .NET - What are your options?

Notifications/Activity Streams -> Actions

107 / 121

@leggetterThe end of apps as we know it - Intercom

Page 170: Real-Time Web Apps & .NET - What are your options?

Subscriptions

108 / 121

@leggetter

Page 171: Real-Time Web Apps & .NET - What are your options?

Personalised Event Streams

109 / 121

@leggetter

Page 172: Real-Time Web Apps & .NET - What are your options?

Unified UIs

110 / 121

@leggetter

Page 173: Real-Time Web Apps & .NET - What are your options?

Chat & Bots for Everything and the rise of the .ai domain 111 / 121

@leggetter

Page 174: Real-Time Web Apps & .NET - What are your options?

600M MAUs10M integrationsapp-within-an-app modeltaxi, order food, tickets, games etc.

WeChat

112 / 121

@leggetter

Page 175: Real-Time Web Apps & .NET - What are your options?

Chat Integrations

113 / 121

@leggetter

Page 176: Real-Time Web Apps & .NET - What are your options?

SiriGoogle Now

Microso� CortanaFacebook M

Chat "Virtual Assistants"

114 / 121

@leggetter

Page 177: Real-Time Web Apps & .NET - What are your options?

115 / 121

@leggetter

Page 178: Real-Time Web Apps & .NET - What are your options?

Chat has evolved. Chat is now a platform!

116 / 121

@leggetter

Page 179: Real-Time Web Apps & .NET - What are your options?

Multi-Device Experiences

117 / 121

@leggetter

Page 180: Real-Time Web Apps & .NET - What are your options?

Ben Foxall - A conceptual future for the multi-device web (FutureJS 2014)

118 / 121

@leggetter

Page 181: Real-Time Web Apps & .NET - What are your options?

You need Real-Time!

There are lots of options.

Make the choice that's right for you.

I hope this helps!

119 / 121

@leggetter

Page 182: Real-Time Web Apps & .NET - What are your options?

Resources

Real-time Tech Guidegithub.com/leggetter/realtime-dotnet-examplesTools, Tips and Techniques for Developing Real-time AppsNexmo

120 / 121

@leggetter

Page 183: Real-Time Web Apps & .NET - What are your options?

Real-time Web Apps & .NET

What are your options?

Questions?

PHIL @LEGGETTERHead of Developer Relations

121 / 121

@leggetter