SlideShare una empresa de Scribd logo
1 de 163
Descargar para leer sin conexión
Real-Time Web Apps & .NET
What are Your Options?
NDC { Oslo } 10-June-2016
@leggetter
PHIL @LEGGETTER
Head of Developer Relations
leggetter@nexmo.com
3 / 105
@leggetter
4 / 105
@leggetter
What we'll cover
1. Why Real-Time?
2. Common Real-Time Use Cases
3. What are your options?
How do you choose? inc. Communication Patterns
.NET examples
Pros & Cons
4. Q&A
5 / 105
@leggetter
When do we need Realtime?
6 / 105
@leggetter
WCaaS
7 / 105
@leggetter
WCaaS
Data: Is there a timely nature to the data?
7 / 105
@leggetter
8 / 105
@leggetter
User Experience: Is there a timely nature to the
experience?
8 / 105
@leggetter
Realtime is required when there's a Need or
Demand for:
Up to date information
Interaction to maintain engagement (UX)
9 / 105
@leggetter
Common Real-Time Use Cases
10 / 105
@leggetter
Notifications & Activity Streams
11 / 105
@leggetter
Data Visualizations
12 / 105
@leggetter
13 / 105
Chat & Bots
@leggetter
13 / 105
Chat & Bots
@leggetter
14 / 105
@leggetter
Real-Time Location Tracking
15 / 105
@leggetter
Multi-User Collaboration
16 / 105
@leggetter
WebRTC Powered AV Chat
17 / 105
@leggetter
18 / 105
@leggetter
Users expect a real-time UX
18 / 105
@leggetter
Users expect a real-time UX
Without a real-time UX your app appears
broken
18 / 105
@leggetter
You All Have Real-Time Data in Your Apps
Every Single Event
Data Changes
System Interactions
User Interactions
19 / 105
@leggetter
Real-time Web Apps & .NET
What are your options?
20 / 105
@leggetter
7 Factors to Consider
21 / 105
@leggetter
1. Should you keep on polling?
22 / 105
@leggetter
Polling Calculations
Scenario
1. Site average of 10,000 Users
23 / 105
@leggetter
Polling Calculations
Scenario
1. Site average of 10,000 Users
2. Over 1 Hour, with a 10 second polling interval
23 / 105
@leggetter
Polling Calculations
Scenario
1. Site average of 10,000 Users
2. Over 1 Hour, with a 10 second polling interval
3. Requests from pages load + HTML, CSS, JS, Images for 10k users = 50,000
23 / 105
@leggetter
Polling Calculations
Scenario
1. Site average of 10,000 Users
2. Over 1 Hour, with a 10 second polling interval
3. Requests from pages load + HTML, CSS, JS, Images for 10k users = 50,000
4. Poll requests per user/minute = (60 / 10) = 6
23 / 105
@leggetter
Polling Calculations
Scenario
1. Site average of 10,000 Users
2. Over 1 Hour, with a 10 second polling interval
3. Requests from pages load + HTML, CSS, JS, Images for 10k users = 50,000
4. Poll requests per user/minute = (60 / 10) = 6
5. Poll requests per user/hour = (6 * 60) = 360
23 / 105
@leggetter
Polling Calculations
Scenario
1. Site average of 10,000 Users
2. Over 1 Hour, with a 10 second polling interval
3. Requests from pages load + HTML, CSS, JS, Images for 10k users = 50,000
4. Poll requests per user/minute = (60 / 10) = 6
5. Poll requests per user/hour = (6 * 60) = 360
6. Poll requests site wide per hour = (360 * 10,000) = 3,600,000
23 / 105
@leggetter
Polling Calculations
Scenario
1. Site average of 10,000 Users
2. Over 1 Hour, with a 10 second polling interval
3. Requests from pages load + HTML, CSS, JS, Images for 10k users = 50,000
4. Poll requests per user/minute = (60 / 10) = 6
5. Poll requests per user/hour = (6 * 60) = 360
6. 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?
23 / 105
@leggetter
Cache - clients keep polling
Push Proxy solutions
fanout.io
streamdata.io
Quick Win solutions
24 / 105
@leggetter
2. Use an existing solution
Don't reinvent the wheel
Unless you've a unique use case
25 / 105
@leggetter
Why use an existing solution?
Connection fallback/upgrade hacks still required
WebSocket: 91% of connections
HTTP fallback: 9% of connections
26 / 105
@leggetter
Why use an existing solution?
Connection fallback/upgrade hacks still required
WebSocket: 91% of connections
HTTP fallback: 9% of connections
Support/Community
26 / 105
@leggetter
Why use an existing solution?
Connection fallback/upgrade hacks still required
WebSocket: 91% of connections
HTTP fallback: 9% of connections
Support/Community
Maintenance
26 / 105
@leggetter
Why use an existing solution?
Connection fallback/upgrade hacks still required
WebSocket: 91% of connections
HTTP fallback: 9% of connections
Support/Community
Maintenance
Future features
26 / 105
@leggetter
Why use an existing solution?
Connection fallback/upgrade hacks still required
WebSocket: 91% of connections
HTTP fallback: 9% of connections
Support/Community
Maintenance
Future features
Scaling
26 / 105
@leggetter
27 / 105
@leggetter
j.mp/realtime-tech-guide
27 / 105
@leggetter
3. Use languages you're comfortable
with
28 / 105
@leggetter
3. Use languages you're comfortable
with
28 / 105
@leggetter
Solutions by language
PHP: Ratchet, dNode-php
Java: Netty, Jetty
JavaScript (Node.JS): Faye, Socket.IO (Engine.IO), Primus.io
.NET (C#): SignalR, XSockets
Python: Lots of options built on Tornado
Ruby: em-websocket, Faye
Language agnostic: most hosted services
29 / 105
@leggetter
4. Client Device Support?
30 / 105
@leggetter
Client Device Support
Only some have a selection of client libraries
31 / 105
@leggetter
Client Device Support
Only some have a selection of client libraries
Supported connection transports
31 / 105
@leggetter
Client Device Support
Only some have a selection of client libraries
Supported connection transports
How much data are you sending?
31 / 105
@leggetter
Client Device Support
Only some have a selection of client libraries
Supported connection transports
How much data are you sending?
SSL required on 3/4G networks
31 / 105
@leggetter
5. Application/Solution
Communication Patterns
32 / 105
@leggetter
5. Application/Solution
Communication Patterns
How does the client/server & client/client communicate
32 / 105
@leggetter
Simple Messaging
33 / 105
@leggetter
0:00 34 / 105
@leggetter
Internet ^5 Machine
0:00 34 / 105
@leggetter
Internet ^5 Machine
Simple Messaging
// client
var ws = new WebSocket('wss://localhost/');
35 / 105
@leggetter
Simple Messaging
// client
var ws = new WebSocket('wss://localhost/');
ws.onmessage = function(evt) {
var data = JSON.parse(evt.data);
35 / 105
@leggetter
Simple Messaging
// client
var ws = new WebSocket('wss://localhost/');
ws.onmessage = function(evt) {
var data = JSON.parse(evt.data);
// ^5
performHighFive();
};
35 / 105
@leggetter
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){
35 / 105
@leggetter
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'}));
});
35 / 105
@leggetter
Simple Messaging
using Nexmo.Api;
// SMS
var results = SMS.Send(new SMS.SMSRequest
{
from = "15555551212",
to = "17775551212",
text = "this is a test"
});
// Voice
var result = Voice.TextToSpeech(new Voice.TextToSpeechCallCommand
{
to = "17775551212",
from = "15555551212",
text = "Hello from Nexmo"
});
36 / 105
@leggetter
PubSub
37 / 105
@leggetter
38 / 105
@leggetter
PubSub
// client
var client = new Faye.Client('http://localhost:8000/faye');
39 / 105
@leggetter
PubSub
// client
var client = new Faye.Client('http://localhost:8000/faye');
client.subscribe('/leggetter-updates', function(data) {
39 / 105
@leggetter
PubSub
// client
var client = new Faye.Client('http://localhost:8000/faye');
client.subscribe('/leggetter-updates', function(data) {
console.log(data.text);
});
39 / 105
@leggetter
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);
});
39 / 105
@leggetter
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!'});
39 / 105
@leggetter
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});
39 / 105
@leggetter
Evented PubSub
40 / 105
@leggetter
Evented PubSub
// client
var updates = io('/leggetter-updates');
41 / 105
@leggetter
Evented PubSub
// client
var updates = io('/leggetter-updates');
updates.on('created', function (data) {
// Add activity to UI
});
41 / 105
@leggetter
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
});
41 / 105
@leggetter
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');
41 / 105
@leggetter
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});
41 / 105
@leggetter
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});
41 / 105
@leggetter
PubSub vs. Evented PubSub
42 / 105
@leggetter
43 / 105
@leggetter
44 / 105
@leggetter
PubSub
client.subscribe('devexp-channel', function(data) {
if(data.eventType === 'chat-message') {
addMessage(data.message);
}
45 / 105
@leggetter
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 */) {
}
})
45 / 105
@leggetter
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);
45 / 105
@leggetter
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);
45 / 105
@leggetter
DataSync
46 / 105
@leggetter
47 / 105
@leggetter
Data Sync
// client
var ref = new Firebase("https://app.firebaseio.com/doc1/lines");
48 / 105
@leggetter
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.
});
48 / 105
@leggetter
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.
});
48 / 105
@leggetter
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.
});
48 / 105
@leggetter
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!' });
48 / 105
@leggetter
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
48 / 105
@leggetter
RMI (aka RPC)
49 / 105
@leggetter
50 / 105
@leggetter
RMI
// client
var chat = $.connection.chatHub;
51 / 105
@leggetter
RMI
// client
var chat = $.connection.chatHub;
chat.client.broadcastMessage = function (name, message) {
// handle message
};
51 / 105
@leggetter
RMI
// client
var chat = $.connection.chatHub;
chat.client.broadcastMessage = function (name, message) {
// handle message
};
chat.server.send( 'me', 'hello world' );
51 / 105
@leggetter
RMI
// client
var chat = $.connection.chatHub;
chat.client.broadcastMessage = function (name, message) {
// handle message
};
chat.server.send( 'me', 'hello world' );
$.connection.hub.start(); // async
51 / 105
@leggetter
RMI
// client
var chat = $.connection.chatHub;
chat.client.broadcastMessage = function (name, message) {
// handle message
};
chat.server.send( 'me', 'hello world' );
$.connection.hub.start(); // async
// server
public class ChatHub : Hub
{
51 / 105
@leggetter
RMI
// client
var chat = $.connection.chatHub;
chat.client.broadcastMessage = function (name, message) {
// handle message
};
chat.server.send( 'me', 'hello world' );
$.connection.hub.start(); // async
// server
public class ChatHub : Hub
{
public void Send(string name, string message)
{
51 / 105
@leggetter
RMI
// client
var chat = $.connection.chatHub;
chat.client.broadcastMessage = function (name, message) {
// handle message
};
chat.server.send( 'me', 'hello world' );
$.connection.hub.start(); // async
// server
public class ChatHub : Hub
{
public void Send(string name, string message)
{
// Call the broadcastMessage method to update clients.
Clients.All.broadcastMessage(name, message);
}
}
51 / 105
@leggetter
52 / 105
@leggetter
53 / 105
@leggetter
54 / 105
@leggetter
55 / 105
@leggetter
56 / 105
@leggetter
6. Deployment & Architecture
Considerations
57 / 105
@leggetter
Code
https://github.com/leggetter/realtime-dotnet-examples
Short link: http://j.mp/rt-dotnet-ex
58 / 105
@leggetter
Self Hosted (Tightly Coupled) 59 / 105
@leggetter
.NET Self-Hosted Real-Time options
SignalR
XSockets
60 / 105
@leggetter
61 / 105
@leggetter
Self-Hosted Demo 1: ASP.NET + SignalR (Tightly Coupled)
61 / 105
@leggetter
What we'll look at:
PM> Install-Package Microsoft.AspNet.SignalR
Scriptsjquery.signalR*.js
App_StartSignalRStartup.cs
ControllersHomeController.cs
HubsChatHub.cs
ViewsHomeSignalR.cshtml
ScriptchatSignalRChat.js
62 / 105
@leggetter
Pros
.NET
Simple integration
MS Supported
jQuery Dependency
Cons
Tightly coupled
RMI only
Self-Scaling
Scaling (realtime + HTTP)
Self-Hosted Demo 1: Pro & Cons
63 / 105
@leggetter
64 / 105
@leggetter
Self-Hosted Demo 2: ASP.NET + XSockets (Tightly Coupled)
64 / 105
@leggetter
What we'll look at:
PM> Install-Package XSockets
App_StartXSocketsStartup.cs
ControllersHomeController.cs
XSocketsChatController.cs
ViewsHomeXSockets.cshtml
ScriptsXSockets.latest.js
ScriptchatXSocketsChat.cs
65 / 105
@leggetter
Pros
.NET
Simple integration
Communication patterns
PubSub/Evented
RMI
Licensed
Cons
Tightly coupled
Self-Scaling
Scaling (realtime + HTTP)
Licensed
Self-Hosted Demo 2: Pro & Cons
66 / 105
@leggetter
Self-Hosted: .NET + Message Queue (Loosely Coupled)
67 / 105
@leggetter
68 / 105
@leggetter
Pros
.NET
Maps well to PubSub
Loosely coupled
Could use another runtime
Cons
How does it fit with RMI/SignalR?
Multiple components
Self-scaling
Queue routing questions
In: HTTP. Out: WebSocket
Self-Hosted: .NET + Message Queue - Pro &
Cons
69 / 105
@leggetter
If SignalR or XSockets aren't a good fit
you may have to look at a non-.NET solution
70 / 105
@leggetter
.NET Hosted Real-Time options
Ably
Firebase
Fanout
PubNub
Pusher
Realtime.co
Syncano
71 / 105
@leggetter
72 / 105
@leggetter
Hosted Demo: PubNub
72 / 105
@leggetter
What we'll look at:
PM> Install-Package Pubnub
ControllersChatController.cs
ViewsHomePubNub.cshtml
ScriptchatPubNub.js
PubNub Real-Time Analytics
73 / 105
@leggetter
Pros
Simple & powerful
Instantly scalable
Managed & dedicated
Direct integration. No overhead.
Cons
3rd party reliance
Difficult to influence functionality
Hosted - Pros & Cons
74 / 105
@leggetter
Why use a hosted service?
Scenario
1. Site average of 10,000 Users
75 / 105
@leggetter
Why use a hosted service?
Scenario
1. Site average of 10,000 Users
2. Over 1 Hour, no polling
75 / 105
@leggetter
Why use a hosted service?
Scenario
1. Site average of 10,000 Users
2. Over 1 Hour, no polling
3. Requests from pages load + HTML, CSS, JS, Images for 10k users = 50,000
75 / 105
@leggetter
Why use a hosted service?
Scenario
1. Site average of 10,000 Users
2. Over 1 Hour, no polling
3. Requests from pages load + HTML, CSS, JS, Images for 10k users = 50,000
4. That's it! Total: 50,000
75 / 105
@leggetter
Why use a hosted service?
Scenario
1. Site average of 10,000 Users
2. Over 1 Hour, no polling
3. Requests from pages load + HTML, CSS, JS, Images for 10k users = 50,000
4. 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
75 / 105
@leggetter
7. Self-Hosted v Hosted
"Build vs. Buy"
76 / 105
@leggetter
Build vs. Buy - Costs
baremetrics.com/calculator
77 / 105
@leggetter
How do you choose?
7 Realtime Framework Considerations
1. Should you keep on polling?
2. Use an Existing Solution
3. Use a language you're comfortable with
4. Do you need multiple client device support?
5. Simple Messaging, PubSub/Evented, RMI or DataSync
6. Architectural considerations
7. Hosted v Self-Hosted (Build vs. Buy)
78 / 105
@leggetter
You need Real-Time!
There are lots of options.
Make the choice that's right for you.
I hope this helps!
79 / 105
@leggetter
Resources
Real-time Tech Guide
github.com/leggetter/realtime-dotnet-examples
Tools, Tips and Techniques for Developing Real-
time Apps
Nexmo
80 / 105
@leggetter
Real-time Web Apps & .NET
What are your options?
Questions?
PHIL @LEGGETTER
Head of Developer Relations
81 / 105
@leggetter
Future (If Time)
82 / 105
@leggetter
Network Infrastructure & Protocols
Reliability
Speed
Beyond HTTP
HTTP2
83 / 105
@leggetter
Bayeux
DDP
dNode
EPCP
GRIP
gRPC
MQTT
Pusher Protocol
STOMP
SignalR Protocol
WAMP (Web App Messaging Protocol)
XMPP (various)
Communication Pattern Protocol
Standardisation
84 / 105
@leggetter
85 / 105
@leggetter
Firebase
GitHub
Iron.io
MailChimp
MailJet
PagerDuty
Nexmo
SendGrid
Real-Time APIs
86 / 105
@leggetter
87 / 105
@leggetter
More "Things"!
88 / 105
@leggetter
The Physical Web
89 / 105
@leggetter
IoT, Apps & Developers
90 / 105
@leggetter
A thing can be anything
91 / 105
@leggetter
A thing can be anything
Sensors
Appliances
Vehicles
Smart Phones
Devices (Arduino, Electric Imp, Raspberry Pi etc.)
91 / 105
@leggetter
A thing can be anything
Sensors
Appliances
Vehicles
Smart Phones
Devices (Arduino, Electric Imp, Raspberry Pi etc.)
Servers
Browsers
Apps: Native, Web, running anywhere
91 / 105
@leggetter
The Majority of code we'll write will still be
for "Apps"
Configuring
Monitoring
Interacting
App Logic
92 / 105
@leggetter
Real-Time Use Case Evolution
Notifications & Signalling
Activity Streams
Data Viz & Polls
Chat
Collaboration
Multiplayer Games
93 / 105
@leggetter
Notifications/Activity Streams -> Actions
94 / 105
@leggetter
The end of apps as we know it - Intercom
Subscriptions
95 / 105
@leggetter
Personalised Event Streams
96 / 105
@leggetter
Unified UIs
97 / 105
@leggetter
Chat & Bots for Everything and the rise of the .ai domain 98 / 105
@leggetter
600M MAUs
10M integrations
app-within-an-app model
taxi, order food, tickets, games etc.
WeChat
99 / 105
@leggetter
Chat Integrations
100 / 105
@leggetter
Siri
Google Now
Microso Cortana
Facebook M
Chat "Virtual Assistants"
101 / 105
@leggetter
102 / 105
@leggetter
Chat has evolved. Chat is now a platform!
103 / 105
@leggetter
Multi-Device Experiences
104 / 105
@leggetter
Ben Foxall - A conceptual future for the multi-device web (FutureJS 2014)
105 / 105
@leggetter

Más contenido relacionado

Destacado

iLearning Forum : les principales tendances par Sally-Ann Moore
iLearning Forum : les principales tendances par Sally-Ann MooreiLearning Forum : les principales tendances par Sally-Ann Moore
iLearning Forum : les principales tendances par Sally-Ann MooreFFFOD
 
Planification des travaux de réfection et d'entretien majeur des structures P...
Planification des travaux de réfection et d'entretien majeur des structures P...Planification des travaux de réfection et d'entretien majeur des structures P...
Planification des travaux de réfection et d'entretien majeur des structures P...Ponts Jacques Cartier + Champlain Bridges
 
Italy: VAT Alert - Tax Decree
Italy: VAT Alert - Tax DecreeItaly: VAT Alert - Tax Decree
Italy: VAT Alert - Tax DecreeAlex Baulf
 
Best practices in deploying IBM Operation Decision Manager Standard 8.8.0
Best practices in deploying IBM Operation Decision Manager Standard 8.8.0Best practices in deploying IBM Operation Decision Manager Standard 8.8.0
Best practices in deploying IBM Operation Decision Manager Standard 8.8.0Pierre Feillet
 
ITIL Service Management
ITIL Service ManagementITIL Service Management
ITIL Service ManagementMarvin Sirait
 
IT Quality Testing and the Defect Management Process
IT Quality Testing and the Defect Management ProcessIT Quality Testing and the Defect Management Process
IT Quality Testing and the Defect Management ProcessYolanda Williams
 
Incident and Problem management simplified
Incident and Problem management simplifiedIncident and Problem management simplified
Incident and Problem management simplifiedValentyn Barmak
 
Continual Improvement Process-Basic Idea
Continual Improvement Process-Basic IdeaContinual Improvement Process-Basic Idea
Continual Improvement Process-Basic IdeaSheikh Khawar Qayyum
 
Toolkits Overview for IBM Streams V4.2
Toolkits Overview for IBM Streams V4.2Toolkits Overview for IBM Streams V4.2
Toolkits Overview for IBM Streams V4.2lisanl
 

Destacado (11)

job01
job01job01
job01
 
iLearning Forum : les principales tendances par Sally-Ann Moore
iLearning Forum : les principales tendances par Sally-Ann MooreiLearning Forum : les principales tendances par Sally-Ann Moore
iLearning Forum : les principales tendances par Sally-Ann Moore
 
Planification des travaux de réfection et d'entretien majeur des structures P...
Planification des travaux de réfection et d'entretien majeur des structures P...Planification des travaux de réfection et d'entretien majeur des structures P...
Planification des travaux de réfection et d'entretien majeur des structures P...
 
Italy: VAT Alert - Tax Decree
Italy: VAT Alert - Tax DecreeItaly: VAT Alert - Tax Decree
Italy: VAT Alert - Tax Decree
 
Best practices in deploying IBM Operation Decision Manager Standard 8.8.0
Best practices in deploying IBM Operation Decision Manager Standard 8.8.0Best practices in deploying IBM Operation Decision Manager Standard 8.8.0
Best practices in deploying IBM Operation Decision Manager Standard 8.8.0
 
Votorantim S.A
Votorantim S.AVotorantim S.A
Votorantim S.A
 
ITIL Service Management
ITIL Service ManagementITIL Service Management
ITIL Service Management
 
IT Quality Testing and the Defect Management Process
IT Quality Testing and the Defect Management ProcessIT Quality Testing and the Defect Management Process
IT Quality Testing and the Defect Management Process
 
Incident and Problem management simplified
Incident and Problem management simplifiedIncident and Problem management simplified
Incident and Problem management simplified
 
Continual Improvement Process-Basic Idea
Continual Improvement Process-Basic IdeaContinual Improvement Process-Basic Idea
Continual Improvement Process-Basic Idea
 
Toolkits Overview for IBM Streams V4.2
Toolkits Overview for IBM Streams V4.2Toolkits Overview for IBM Streams V4.2
Toolkits Overview for IBM Streams V4.2
 

Similar a Real-Time Web Apps & .NET. What Are Your Options? NDC Oslo 2016

Real-Time Web Apps & .NET - What are your options?
Real-Time Web Apps & .NET - What are your options?Real-Time Web Apps & .NET - What are your options?
Real-Time Web Apps & .NET - What are your options?Phil Leggetter
 
The Past, Present and Future of Real-Time Apps and Communications
The Past, Present and Future of Real-Time Apps and CommunicationsThe Past, Present and Future of Real-Time Apps and Communications
The Past, Present and Future of Real-Time Apps and CommunicationsPhil Leggetter
 
Websocket vs SSE - Paris.js - 24/06/15
Websocket vs SSE - Paris.js - 24/06/15Websocket vs SSE - Paris.js - 24/06/15
Websocket vs SSE - Paris.js - 24/06/15streamdata.io
 
V2 peter-lubbers-sf-jug-websocket
V2 peter-lubbers-sf-jug-websocketV2 peter-lubbers-sf-jug-websocket
V2 peter-lubbers-sf-jug-websocketbrent bucci
 
Realtime Web Apps in 2014 & Beyond
Realtime Web Apps in 2014 & BeyondRealtime Web Apps in 2014 & Beyond
Realtime Web Apps in 2014 & BeyondPhil Leggetter
 
Taking a Quantum Leap with Html 5 WebSocket
Taking a Quantum Leap with Html 5 WebSocketTaking a Quantum Leap with Html 5 WebSocket
Taking a Quantum Leap with Html 5 WebSocketShahriar Hyder
 
Web of Things - Connecting People and Objects on the Web
Web of Things - Connecting People and Objects on the WebWeb of Things - Connecting People and Objects on the Web
Web of Things - Connecting People and Objects on the WebDominique Guinard
 
HTML5 WebSocket: The New Network Stack for the Web
HTML5 WebSocket: The New Network Stack for the WebHTML5 WebSocket: The New Network Stack for the Web
HTML5 WebSocket: The New Network Stack for the WebPeter Lubbers
 
Web browsers & the realtime web
Web browsers & the realtime webWeb browsers & the realtime web
Web browsers & the realtime webPhil Leggetter
 
5 x HTML5 worth using in APEX (5)
5 x HTML5 worth using in APEX (5)5 x HTML5 worth using in APEX (5)
5 x HTML5 worth using in APEX (5)Christian Rokitta
 
WebRTC Webinar & Q&A - Debugging Networking Issues in WebRTC
WebRTC Webinar & Q&A - Debugging Networking Issues in WebRTCWebRTC Webinar & Q&A - Debugging Networking Issues in WebRTC
WebRTC Webinar & Q&A - Debugging Networking Issues in WebRTCAmir Zmora
 
Implementing Comet using PHP
Implementing Comet using PHPImplementing Comet using PHP
Implementing Comet using PHPKing Foo
 
Get Ahead with HTML5 on Moible
Get Ahead with HTML5 on MoibleGet Ahead with HTML5 on Moible
Get Ahead with HTML5 on Moiblemarkuskobler
 
20190516 web security-basic
20190516 web security-basic20190516 web security-basic
20190516 web security-basicMksYi
 
112 portfpres.pdf
112 portfpres.pdf112 portfpres.pdf
112 portfpres.pdfsash236
 
Evolution of a big data project
Evolution of a big data projectEvolution of a big data project
Evolution of a big data projectMichael Peacock
 

Similar a Real-Time Web Apps & .NET. What Are Your Options? NDC Oslo 2016 (20)

Real-Time Web Apps & .NET - What are your options?
Real-Time Web Apps & .NET - What are your options?Real-Time Web Apps & .NET - What are your options?
Real-Time Web Apps & .NET - What are your options?
 
The Past, Present and Future of Real-Time Apps and Communications
The Past, Present and Future of Real-Time Apps and CommunicationsThe Past, Present and Future of Real-Time Apps and Communications
The Past, Present and Future of Real-Time Apps and Communications
 
The HTML5 WebSocket API
The HTML5 WebSocket APIThe HTML5 WebSocket API
The HTML5 WebSocket API
 
Websocket vs SSE - Paris.js - 24/06/15
Websocket vs SSE - Paris.js - 24/06/15Websocket vs SSE - Paris.js - 24/06/15
Websocket vs SSE - Paris.js - 24/06/15
 
V2 peter-lubbers-sf-jug-websocket
V2 peter-lubbers-sf-jug-websocketV2 peter-lubbers-sf-jug-websocket
V2 peter-lubbers-sf-jug-websocket
 
Realtime Web Apps in 2014 & Beyond
Realtime Web Apps in 2014 & BeyondRealtime Web Apps in 2014 & Beyond
Realtime Web Apps in 2014 & Beyond
 
Taking a Quantum Leap with Html 5 WebSocket
Taking a Quantum Leap with Html 5 WebSocketTaking a Quantum Leap with Html 5 WebSocket
Taking a Quantum Leap with Html 5 WebSocket
 
WebSockets in JEE 7
WebSockets in JEE 7WebSockets in JEE 7
WebSockets in JEE 7
 
Web of Things - Connecting People and Objects on the Web
Web of Things - Connecting People and Objects on the WebWeb of Things - Connecting People and Objects on the Web
Web of Things - Connecting People and Objects on the Web
 
HTML5 WebSocket: The New Network Stack for the Web
HTML5 WebSocket: The New Network Stack for the WebHTML5 WebSocket: The New Network Stack for the Web
HTML5 WebSocket: The New Network Stack for the Web
 
Pushing the Web: Interesting things to Know
Pushing the Web: Interesting things to KnowPushing the Web: Interesting things to Know
Pushing the Web: Interesting things to Know
 
Web browsers & the realtime web
Web browsers & the realtime webWeb browsers & the realtime web
Web browsers & the realtime web
 
5 x HTML5 worth using in APEX (5)
5 x HTML5 worth using in APEX (5)5 x HTML5 worth using in APEX (5)
5 x HTML5 worth using in APEX (5)
 
Practical OData
Practical ODataPractical OData
Practical OData
 
WebRTC Webinar & Q&A - Debugging Networking Issues in WebRTC
WebRTC Webinar & Q&A - Debugging Networking Issues in WebRTCWebRTC Webinar & Q&A - Debugging Networking Issues in WebRTC
WebRTC Webinar & Q&A - Debugging Networking Issues in WebRTC
 
Implementing Comet using PHP
Implementing Comet using PHPImplementing Comet using PHP
Implementing Comet using PHP
 
Get Ahead with HTML5 on Moible
Get Ahead with HTML5 on MoibleGet Ahead with HTML5 on Moible
Get Ahead with HTML5 on Moible
 
20190516 web security-basic
20190516 web security-basic20190516 web security-basic
20190516 web security-basic
 
112 portfpres.pdf
112 portfpres.pdf112 portfpres.pdf
112 portfpres.pdf
 
Evolution of a big data project
Evolution of a big data projectEvolution of a big data project
Evolution of a big data project
 

Más de Phil Leggetter

An Introduction to AAARRRP: A framework for Defining Your Developer Relations...
An Introduction to AAARRRP: A framework for Defining Your Developer Relations...An Introduction to AAARRRP: A framework for Defining Your Developer Relations...
An Introduction to AAARRRP: A framework for Defining Your Developer Relations...Phil Leggetter
 
How APIs Enable Contextual Communications
How APIs Enable Contextual CommunicationsHow APIs Enable Contextual Communications
How APIs Enable Contextual CommunicationsPhil Leggetter
 
An Introduction to the AAARRRP Developer Relations Strategy Framework and How...
An Introduction to the AAARRRP Developer Relations Strategy Framework and How...An Introduction to the AAARRRP Developer Relations Strategy Framework and How...
An Introduction to the AAARRRP Developer Relations Strategy Framework and How...Phil Leggetter
 
An Introduction to the AAARRRP Developer Relations Strategy Framework and How...
An Introduction to the AAARRRP Developer Relations Strategy Framework and How...An Introduction to the AAARRRP Developer Relations Strategy Framework and How...
An Introduction to the AAARRRP Developer Relations Strategy Framework and How...Phil Leggetter
 
Contextual Communications: What, Why and How? Bristol JS
Contextual Communications: What, Why and How? Bristol JSContextual Communications: What, Why and How? Bristol JS
Contextual Communications: What, Why and How? Bristol JSPhil Leggetter
 
What's the ROI of Developer Relations?
What's the ROI of Developer Relations?What's the ROI of Developer Relations?
What's the ROI of Developer Relations?Phil Leggetter
 
Real-Time Web Apps & Symfony. What are your options?
Real-Time Web Apps & Symfony. What are your options?Real-Time Web Apps & Symfony. What are your options?
Real-Time Web Apps & Symfony. What are your options?Phil Leggetter
 
Why You Should be Using Web Components Right Now. And How. ForwardJS July 2015
Why You Should be Using Web Components Right Now. And How. ForwardJS July 2015Why You Should be Using Web Components Right Now. And How. ForwardJS July 2015
Why You Should be Using Web Components Right Now. And How. ForwardJS July 2015Phil Leggetter
 
Real-Time Web Apps in 2015 & Beyond
Real-Time Web Apps in 2015 & BeyondReal-Time Web Apps in 2015 & Beyond
Real-Time Web Apps in 2015 & BeyondPhil Leggetter
 
Why you should be using Web Components. And How - DevWeek 2015
Why you should be using Web Components. And How - DevWeek 2015Why you should be using Web Components. And How - DevWeek 2015
Why you should be using Web Components. And How - DevWeek 2015Phil Leggetter
 
Patterns and practices for building enterprise-scale HTML5 apps
Patterns and practices for building enterprise-scale HTML5 appsPatterns and practices for building enterprise-scale HTML5 apps
Patterns and practices for building enterprise-scale HTML5 appsPhil Leggetter
 
Fed London - January 2015
Fed London - January 2015Fed London - January 2015
Fed London - January 2015Phil Leggetter
 
How to Build Single Page HTML5 Apps that Scale
How to Build Single Page HTML5 Apps that ScaleHow to Build Single Page HTML5 Apps that Scale
How to Build Single Page HTML5 Apps that ScalePhil Leggetter
 
BladeRunnerJS Show & Tell
BladeRunnerJS Show & TellBladeRunnerJS Show & Tell
BladeRunnerJS Show & TellPhil Leggetter
 
Testing Ginormous JavaScript Apps - ScotlandJS 2014
Testing Ginormous JavaScript Apps - ScotlandJS 2014Testing Ginormous JavaScript Apps - ScotlandJS 2014
Testing Ginormous JavaScript Apps - ScotlandJS 2014Phil Leggetter
 
How to Build Front-End Web Apps that Scale - FutureJS
How to Build Front-End Web Apps that Scale - FutureJSHow to Build Front-End Web Apps that Scale - FutureJS
How to Build Front-End Web Apps that Scale - FutureJSPhil Leggetter
 
Using BladeRunnerJS to Build Front-End Apps that Scale - Fluent 2014
Using BladeRunnerJS to Build Front-End Apps that Scale - Fluent 2014Using BladeRunnerJS to Build Front-End Apps that Scale - Fluent 2014
Using BladeRunnerJS to Build Front-End Apps that Scale - Fluent 2014Phil Leggetter
 
Building front-end apps that Scale - FOSDEM 2014
Building front-end apps that Scale - FOSDEM 2014Building front-end apps that Scale - FOSDEM 2014
Building front-end apps that Scale - FOSDEM 2014Phil Leggetter
 
What Developers Want - Developers Want Realtime - BAPI 2012
What Developers Want - Developers Want Realtime - BAPI 2012What Developers Want - Developers Want Realtime - BAPI 2012
What Developers Want - Developers Want Realtime - BAPI 2012Phil Leggetter
 
How the Realtime Web is influencing the future of communications
How the Realtime Web is influencing the future of communicationsHow the Realtime Web is influencing the future of communications
How the Realtime Web is influencing the future of communicationsPhil Leggetter
 

Más de Phil Leggetter (20)

An Introduction to AAARRRP: A framework for Defining Your Developer Relations...
An Introduction to AAARRRP: A framework for Defining Your Developer Relations...An Introduction to AAARRRP: A framework for Defining Your Developer Relations...
An Introduction to AAARRRP: A framework for Defining Your Developer Relations...
 
How APIs Enable Contextual Communications
How APIs Enable Contextual CommunicationsHow APIs Enable Contextual Communications
How APIs Enable Contextual Communications
 
An Introduction to the AAARRRP Developer Relations Strategy Framework and How...
An Introduction to the AAARRRP Developer Relations Strategy Framework and How...An Introduction to the AAARRRP Developer Relations Strategy Framework and How...
An Introduction to the AAARRRP Developer Relations Strategy Framework and How...
 
An Introduction to the AAARRRP Developer Relations Strategy Framework and How...
An Introduction to the AAARRRP Developer Relations Strategy Framework and How...An Introduction to the AAARRRP Developer Relations Strategy Framework and How...
An Introduction to the AAARRRP Developer Relations Strategy Framework and How...
 
Contextual Communications: What, Why and How? Bristol JS
Contextual Communications: What, Why and How? Bristol JSContextual Communications: What, Why and How? Bristol JS
Contextual Communications: What, Why and How? Bristol JS
 
What's the ROI of Developer Relations?
What's the ROI of Developer Relations?What's the ROI of Developer Relations?
What's the ROI of Developer Relations?
 
Real-Time Web Apps & Symfony. What are your options?
Real-Time Web Apps & Symfony. What are your options?Real-Time Web Apps & Symfony. What are your options?
Real-Time Web Apps & Symfony. What are your options?
 
Why You Should be Using Web Components Right Now. And How. ForwardJS July 2015
Why You Should be Using Web Components Right Now. And How. ForwardJS July 2015Why You Should be Using Web Components Right Now. And How. ForwardJS July 2015
Why You Should be Using Web Components Right Now. And How. ForwardJS July 2015
 
Real-Time Web Apps in 2015 & Beyond
Real-Time Web Apps in 2015 & BeyondReal-Time Web Apps in 2015 & Beyond
Real-Time Web Apps in 2015 & Beyond
 
Why you should be using Web Components. And How - DevWeek 2015
Why you should be using Web Components. And How - DevWeek 2015Why you should be using Web Components. And How - DevWeek 2015
Why you should be using Web Components. And How - DevWeek 2015
 
Patterns and practices for building enterprise-scale HTML5 apps
Patterns and practices for building enterprise-scale HTML5 appsPatterns and practices for building enterprise-scale HTML5 apps
Patterns and practices for building enterprise-scale HTML5 apps
 
Fed London - January 2015
Fed London - January 2015Fed London - January 2015
Fed London - January 2015
 
How to Build Single Page HTML5 Apps that Scale
How to Build Single Page HTML5 Apps that ScaleHow to Build Single Page HTML5 Apps that Scale
How to Build Single Page HTML5 Apps that Scale
 
BladeRunnerJS Show & Tell
BladeRunnerJS Show & TellBladeRunnerJS Show & Tell
BladeRunnerJS Show & Tell
 
Testing Ginormous JavaScript Apps - ScotlandJS 2014
Testing Ginormous JavaScript Apps - ScotlandJS 2014Testing Ginormous JavaScript Apps - ScotlandJS 2014
Testing Ginormous JavaScript Apps - ScotlandJS 2014
 
How to Build Front-End Web Apps that Scale - FutureJS
How to Build Front-End Web Apps that Scale - FutureJSHow to Build Front-End Web Apps that Scale - FutureJS
How to Build Front-End Web Apps that Scale - FutureJS
 
Using BladeRunnerJS to Build Front-End Apps that Scale - Fluent 2014
Using BladeRunnerJS to Build Front-End Apps that Scale - Fluent 2014Using BladeRunnerJS to Build Front-End Apps that Scale - Fluent 2014
Using BladeRunnerJS to Build Front-End Apps that Scale - Fluent 2014
 
Building front-end apps that Scale - FOSDEM 2014
Building front-end apps that Scale - FOSDEM 2014Building front-end apps that Scale - FOSDEM 2014
Building front-end apps that Scale - FOSDEM 2014
 
What Developers Want - Developers Want Realtime - BAPI 2012
What Developers Want - Developers Want Realtime - BAPI 2012What Developers Want - Developers Want Realtime - BAPI 2012
What Developers Want - Developers Want Realtime - BAPI 2012
 
How the Realtime Web is influencing the future of communications
How the Realtime Web is influencing the future of communicationsHow the Realtime Web is influencing the future of communications
How the Realtime Web is influencing the future of communications
 

Último

OpenChain - The Ramifications of ISO/IEC 5230 and ISO/IEC 18974 for Legal Pro...
OpenChain - The Ramifications of ISO/IEC 5230 and ISO/IEC 18974 for Legal Pro...OpenChain - The Ramifications of ISO/IEC 5230 and ISO/IEC 18974 for Legal Pro...
OpenChain - The Ramifications of ISO/IEC 5230 and ISO/IEC 18974 for Legal Pro...Shane Coughlan
 
Crypto Cloud Review - How To Earn Up To $500 Per DAY Of Bitcoin 100% On AutoP...
Crypto Cloud Review - How To Earn Up To $500 Per DAY Of Bitcoin 100% On AutoP...Crypto Cloud Review - How To Earn Up To $500 Per DAY Of Bitcoin 100% On AutoP...
Crypto Cloud Review - How To Earn Up To $500 Per DAY Of Bitcoin 100% On AutoP...SelfMade bd
 
Define the academic and professional writing..pdf
Define the academic and professional writing..pdfDefine the academic and professional writing..pdf
Define the academic and professional writing..pdfPearlKirahMaeRagusta1
 
The Real-World Challenges of Medical Device Cybersecurity- Mitigating Vulnera...
The Real-World Challenges of Medical Device Cybersecurity- Mitigating Vulnera...The Real-World Challenges of Medical Device Cybersecurity- Mitigating Vulnera...
The Real-World Challenges of Medical Device Cybersecurity- Mitigating Vulnera...ICS
 
Shapes for Sharing between Graph Data Spaces - and Epistemic Querying of RDF-...
Shapes for Sharing between Graph Data Spaces - and Epistemic Querying of RDF-...Shapes for Sharing between Graph Data Spaces - and Epistemic Querying of RDF-...
Shapes for Sharing between Graph Data Spaces - and Epistemic Querying of RDF-...Steffen Staab
 
Learn the Fundamentals of XCUITest Framework_ A Beginner's Guide.pdf
Learn the Fundamentals of XCUITest Framework_ A Beginner's Guide.pdfLearn the Fundamentals of XCUITest Framework_ A Beginner's Guide.pdf
Learn the Fundamentals of XCUITest Framework_ A Beginner's Guide.pdfkalichargn70th171
 
The Guide to Integrating Generative AI into Unified Continuous Testing Platfo...
The Guide to Integrating Generative AI into Unified Continuous Testing Platfo...The Guide to Integrating Generative AI into Unified Continuous Testing Platfo...
The Guide to Integrating Generative AI into Unified Continuous Testing Platfo...kalichargn70th171
 
Unlocking the Future of AI Agents with Large Language Models
Unlocking the Future of AI Agents with Large Language ModelsUnlocking the Future of AI Agents with Large Language Models
Unlocking the Future of AI Agents with Large Language Modelsaagamshah0812
 
Optimizing AI for immediate response in Smart CCTV
Optimizing AI for immediate response in Smart CCTVOptimizing AI for immediate response in Smart CCTV
Optimizing AI for immediate response in Smart CCTVshikhaohhpro
 
The Top App Development Trends Shaping the Industry in 2024-25 .pdf
The Top App Development Trends Shaping the Industry in 2024-25 .pdfThe Top App Development Trends Shaping the Industry in 2024-25 .pdf
The Top App Development Trends Shaping the Industry in 2024-25 .pdfayushiqss
 
Chinsurah Escorts ☎️8617697112 Starting From 5K to 15K High Profile Escorts ...
Chinsurah Escorts ☎️8617697112  Starting From 5K to 15K High Profile Escorts ...Chinsurah Escorts ☎️8617697112  Starting From 5K to 15K High Profile Escorts ...
Chinsurah Escorts ☎️8617697112 Starting From 5K to 15K High Profile Escorts ...Nitya salvi
 
Sector 18, Noida Call girls :8448380779 Model Escorts | 100% verified
Sector 18, Noida Call girls :8448380779 Model Escorts | 100% verifiedSector 18, Noida Call girls :8448380779 Model Escorts | 100% verified
Sector 18, Noida Call girls :8448380779 Model Escorts | 100% verifiedDelhi Call girls
 
+971565801893>>SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHAB...
+971565801893>>SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHAB...+971565801893>>SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHAB...
+971565801893>>SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHAB...Health
 
%in tembisa+277-882-255-28 abortion pills for sale in tembisa
%in tembisa+277-882-255-28 abortion pills for sale in tembisa%in tembisa+277-882-255-28 abortion pills for sale in tembisa
%in tembisa+277-882-255-28 abortion pills for sale in tembisamasabamasaba
 
AI & Machine Learning Presentation Template
AI & Machine Learning Presentation TemplateAI & Machine Learning Presentation Template
AI & Machine Learning Presentation TemplatePresentation.STUDIO
 
Direct Style Effect Systems - The Print[A] Example - A Comprehension Aid
Direct Style Effect Systems -The Print[A] Example- A Comprehension AidDirect Style Effect Systems -The Print[A] Example- A Comprehension Aid
Direct Style Effect Systems - The Print[A] Example - A Comprehension AidPhilip Schwarz
 
Payment Gateway Testing Simplified_ A Step-by-Step Guide for Beginners.pdf
Payment Gateway Testing Simplified_ A Step-by-Step Guide for Beginners.pdfPayment Gateway Testing Simplified_ A Step-by-Step Guide for Beginners.pdf
Payment Gateway Testing Simplified_ A Step-by-Step Guide for Beginners.pdfkalichargn70th171
 
%in Stilfontein+277-882-255-28 abortion pills for sale in Stilfontein
%in Stilfontein+277-882-255-28 abortion pills for sale in Stilfontein%in Stilfontein+277-882-255-28 abortion pills for sale in Stilfontein
%in Stilfontein+277-882-255-28 abortion pills for sale in Stilfonteinmasabamasaba
 
How To Troubleshoot Collaboration Apps for the Modern Connected Worker
How To Troubleshoot Collaboration Apps for the Modern Connected WorkerHow To Troubleshoot Collaboration Apps for the Modern Connected Worker
How To Troubleshoot Collaboration Apps for the Modern Connected WorkerThousandEyes
 

Último (20)

OpenChain - The Ramifications of ISO/IEC 5230 and ISO/IEC 18974 for Legal Pro...
OpenChain - The Ramifications of ISO/IEC 5230 and ISO/IEC 18974 for Legal Pro...OpenChain - The Ramifications of ISO/IEC 5230 and ISO/IEC 18974 for Legal Pro...
OpenChain - The Ramifications of ISO/IEC 5230 and ISO/IEC 18974 for Legal Pro...
 
Crypto Cloud Review - How To Earn Up To $500 Per DAY Of Bitcoin 100% On AutoP...
Crypto Cloud Review - How To Earn Up To $500 Per DAY Of Bitcoin 100% On AutoP...Crypto Cloud Review - How To Earn Up To $500 Per DAY Of Bitcoin 100% On AutoP...
Crypto Cloud Review - How To Earn Up To $500 Per DAY Of Bitcoin 100% On AutoP...
 
Define the academic and professional writing..pdf
Define the academic and professional writing..pdfDefine the academic and professional writing..pdf
Define the academic and professional writing..pdf
 
The Real-World Challenges of Medical Device Cybersecurity- Mitigating Vulnera...
The Real-World Challenges of Medical Device Cybersecurity- Mitigating Vulnera...The Real-World Challenges of Medical Device Cybersecurity- Mitigating Vulnera...
The Real-World Challenges of Medical Device Cybersecurity- Mitigating Vulnera...
 
Shapes for Sharing between Graph Data Spaces - and Epistemic Querying of RDF-...
Shapes for Sharing between Graph Data Spaces - and Epistemic Querying of RDF-...Shapes for Sharing between Graph Data Spaces - and Epistemic Querying of RDF-...
Shapes for Sharing between Graph Data Spaces - and Epistemic Querying of RDF-...
 
Learn the Fundamentals of XCUITest Framework_ A Beginner's Guide.pdf
Learn the Fundamentals of XCUITest Framework_ A Beginner's Guide.pdfLearn the Fundamentals of XCUITest Framework_ A Beginner's Guide.pdf
Learn the Fundamentals of XCUITest Framework_ A Beginner's Guide.pdf
 
The Guide to Integrating Generative AI into Unified Continuous Testing Platfo...
The Guide to Integrating Generative AI into Unified Continuous Testing Platfo...The Guide to Integrating Generative AI into Unified Continuous Testing Platfo...
The Guide to Integrating Generative AI into Unified Continuous Testing Platfo...
 
Unlocking the Future of AI Agents with Large Language Models
Unlocking the Future of AI Agents with Large Language ModelsUnlocking the Future of AI Agents with Large Language Models
Unlocking the Future of AI Agents with Large Language Models
 
Optimizing AI for immediate response in Smart CCTV
Optimizing AI for immediate response in Smart CCTVOptimizing AI for immediate response in Smart CCTV
Optimizing AI for immediate response in Smart CCTV
 
The Top App Development Trends Shaping the Industry in 2024-25 .pdf
The Top App Development Trends Shaping the Industry in 2024-25 .pdfThe Top App Development Trends Shaping the Industry in 2024-25 .pdf
The Top App Development Trends Shaping the Industry in 2024-25 .pdf
 
Chinsurah Escorts ☎️8617697112 Starting From 5K to 15K High Profile Escorts ...
Chinsurah Escorts ☎️8617697112  Starting From 5K to 15K High Profile Escorts ...Chinsurah Escorts ☎️8617697112  Starting From 5K to 15K High Profile Escorts ...
Chinsurah Escorts ☎️8617697112 Starting From 5K to 15K High Profile Escorts ...
 
Sector 18, Noida Call girls :8448380779 Model Escorts | 100% verified
Sector 18, Noida Call girls :8448380779 Model Escorts | 100% verifiedSector 18, Noida Call girls :8448380779 Model Escorts | 100% verified
Sector 18, Noida Call girls :8448380779 Model Escorts | 100% verified
 
+971565801893>>SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHAB...
+971565801893>>SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHAB...+971565801893>>SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHAB...
+971565801893>>SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHAB...
 
%in tembisa+277-882-255-28 abortion pills for sale in tembisa
%in tembisa+277-882-255-28 abortion pills for sale in tembisa%in tembisa+277-882-255-28 abortion pills for sale in tembisa
%in tembisa+277-882-255-28 abortion pills for sale in tembisa
 
AI & Machine Learning Presentation Template
AI & Machine Learning Presentation TemplateAI & Machine Learning Presentation Template
AI & Machine Learning Presentation Template
 
Direct Style Effect Systems - The Print[A] Example - A Comprehension Aid
Direct Style Effect Systems -The Print[A] Example- A Comprehension AidDirect Style Effect Systems -The Print[A] Example- A Comprehension Aid
Direct Style Effect Systems - The Print[A] Example - A Comprehension Aid
 
Payment Gateway Testing Simplified_ A Step-by-Step Guide for Beginners.pdf
Payment Gateway Testing Simplified_ A Step-by-Step Guide for Beginners.pdfPayment Gateway Testing Simplified_ A Step-by-Step Guide for Beginners.pdf
Payment Gateway Testing Simplified_ A Step-by-Step Guide for Beginners.pdf
 
%in Stilfontein+277-882-255-28 abortion pills for sale in Stilfontein
%in Stilfontein+277-882-255-28 abortion pills for sale in Stilfontein%in Stilfontein+277-882-255-28 abortion pills for sale in Stilfontein
%in Stilfontein+277-882-255-28 abortion pills for sale in Stilfontein
 
How To Troubleshoot Collaboration Apps for the Modern Connected Worker
How To Troubleshoot Collaboration Apps for the Modern Connected WorkerHow To Troubleshoot Collaboration Apps for the Modern Connected Worker
How To Troubleshoot Collaboration Apps for the Modern Connected Worker
 
Microsoft AI Transformation Partner Playbook.pdf
Microsoft AI Transformation Partner Playbook.pdfMicrosoft AI Transformation Partner Playbook.pdf
Microsoft AI Transformation Partner Playbook.pdf
 

Real-Time Web Apps & .NET. What Are Your Options? NDC Oslo 2016

  • 1. Real-Time Web Apps & .NET What are Your Options? NDC { Oslo } 10-June-2016 @leggetter
  • 2. PHIL @LEGGETTER Head of Developer Relations leggetter@nexmo.com 3 / 105 @leggetter
  • 4. What we'll cover 1. Why Real-Time? 2. Common Real-Time Use Cases 3. What are your options? How do you choose? inc. Communication Patterns .NET examples Pros & Cons 4. Q&A 5 / 105 @leggetter
  • 5. When do we need Realtime? 6 / 105 @leggetter
  • 7. WCaaS Data: Is there a timely nature to the data? 7 / 105 @leggetter
  • 9. User Experience: Is there a timely nature to the experience? 8 / 105 @leggetter
  • 10. Realtime is required when there's a Need or Demand for: Up to date information Interaction to maintain engagement (UX) 9 / 105 @leggetter
  • 11. Common Real-Time Use Cases 10 / 105 @leggetter
  • 12. Notifications & Activity Streams 11 / 105 @leggetter
  • 13. Data Visualizations 12 / 105 @leggetter
  • 14. 13 / 105 Chat & Bots @leggetter
  • 15. 13 / 105 Chat & Bots @leggetter
  • 17. Real-Time Location Tracking 15 / 105 @leggetter
  • 19. WebRTC Powered AV Chat 17 / 105 @leggetter
  • 21. Users expect a real-time UX 18 / 105 @leggetter
  • 22. Users expect a real-time UX Without a real-time UX your app appears broken 18 / 105 @leggetter
  • 23. You All Have Real-Time Data in Your Apps Every Single Event Data Changes System Interactions User Interactions 19 / 105 @leggetter
  • 24. Real-time Web Apps & .NET What are your options? 20 / 105 @leggetter
  • 25. 7 Factors to Consider 21 / 105 @leggetter
  • 26. 1. Should you keep on polling? 22 / 105 @leggetter
  • 27. Polling Calculations Scenario 1. Site average of 10,000 Users 23 / 105 @leggetter
  • 28. Polling Calculations Scenario 1. Site average of 10,000 Users 2. Over 1 Hour, with a 10 second polling interval 23 / 105 @leggetter
  • 29. Polling Calculations Scenario 1. Site average of 10,000 Users 2. Over 1 Hour, with a 10 second polling interval 3. Requests from pages load + HTML, CSS, JS, Images for 10k users = 50,000 23 / 105 @leggetter
  • 30. Polling Calculations Scenario 1. Site average of 10,000 Users 2. Over 1 Hour, with a 10 second polling interval 3. Requests from pages load + HTML, CSS, JS, Images for 10k users = 50,000 4. Poll requests per user/minute = (60 / 10) = 6 23 / 105 @leggetter
  • 31. Polling Calculations Scenario 1. Site average of 10,000 Users 2. Over 1 Hour, with a 10 second polling interval 3. Requests from pages load + HTML, CSS, JS, Images for 10k users = 50,000 4. Poll requests per user/minute = (60 / 10) = 6 5. Poll requests per user/hour = (6 * 60) = 360 23 / 105 @leggetter
  • 32. Polling Calculations Scenario 1. Site average of 10,000 Users 2. Over 1 Hour, with a 10 second polling interval 3. Requests from pages load + HTML, CSS, JS, Images for 10k users = 50,000 4. Poll requests per user/minute = (60 / 10) = 6 5. Poll requests per user/hour = (6 * 60) = 360 6. Poll requests site wide per hour = (360 * 10,000) = 3,600,000 23 / 105 @leggetter
  • 33. Polling Calculations Scenario 1. Site average of 10,000 Users 2. Over 1 Hour, with a 10 second polling interval 3. Requests from pages load + HTML, CSS, JS, Images for 10k users = 50,000 4. Poll requests per user/minute = (60 / 10) = 6 5. Poll requests per user/hour = (6 * 60) = 360 6. 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? 23 / 105 @leggetter
  • 34. Cache - clients keep polling Push Proxy solutions fanout.io streamdata.io Quick Win solutions 24 / 105 @leggetter
  • 35. 2. Use an existing solution Don't reinvent the wheel Unless you've a unique use case 25 / 105 @leggetter
  • 36. Why use an existing solution? Connection fallback/upgrade hacks still required WebSocket: 91% of connections HTTP fallback: 9% of connections 26 / 105 @leggetter
  • 37. Why use an existing solution? Connection fallback/upgrade hacks still required WebSocket: 91% of connections HTTP fallback: 9% of connections Support/Community 26 / 105 @leggetter
  • 38. Why use an existing solution? Connection fallback/upgrade hacks still required WebSocket: 91% of connections HTTP fallback: 9% of connections Support/Community Maintenance 26 / 105 @leggetter
  • 39. Why use an existing solution? Connection fallback/upgrade hacks still required WebSocket: 91% of connections HTTP fallback: 9% of connections Support/Community Maintenance Future features 26 / 105 @leggetter
  • 40. Why use an existing solution? Connection fallback/upgrade hacks still required WebSocket: 91% of connections HTTP fallback: 9% of connections Support/Community Maintenance Future features Scaling 26 / 105 @leggetter
  • 43. 3. Use languages you're comfortable with 28 / 105 @leggetter
  • 44. 3. Use languages you're comfortable with 28 / 105 @leggetter
  • 45. Solutions by language PHP: Ratchet, dNode-php Java: Netty, Jetty JavaScript (Node.JS): Faye, Socket.IO (Engine.IO), Primus.io .NET (C#): SignalR, XSockets Python: Lots of options built on Tornado Ruby: em-websocket, Faye Language agnostic: most hosted services 29 / 105 @leggetter
  • 46. 4. Client Device Support? 30 / 105 @leggetter
  • 47. Client Device Support Only some have a selection of client libraries 31 / 105 @leggetter
  • 48. Client Device Support Only some have a selection of client libraries Supported connection transports 31 / 105 @leggetter
  • 49. Client Device Support Only some have a selection of client libraries Supported connection transports How much data are you sending? 31 / 105 @leggetter
  • 50. Client Device Support Only some have a selection of client libraries Supported connection transports How much data are you sending? SSL required on 3/4G networks 31 / 105 @leggetter
  • 52. 5. Application/Solution Communication Patterns How does the client/server & client/client communicate 32 / 105 @leggetter
  • 53. Simple Messaging 33 / 105 @leggetter
  • 54. 0:00 34 / 105 @leggetter Internet ^5 Machine
  • 55. 0:00 34 / 105 @leggetter Internet ^5 Machine
  • 56. Simple Messaging // client var ws = new WebSocket('wss://localhost/'); 35 / 105 @leggetter
  • 57. Simple Messaging // client var ws = new WebSocket('wss://localhost/'); ws.onmessage = function(evt) { var data = JSON.parse(evt.data); 35 / 105 @leggetter
  • 58. Simple Messaging // client var ws = new WebSocket('wss://localhost/'); ws.onmessage = function(evt) { var data = JSON.parse(evt.data); // ^5 performHighFive(); }; 35 / 105 @leggetter
  • 59. 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){ 35 / 105 @leggetter
  • 60. 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'})); }); 35 / 105 @leggetter
  • 61. Simple Messaging using Nexmo.Api; // SMS var results = SMS.Send(new SMS.SMSRequest { from = "15555551212", to = "17775551212", text = "this is a test" }); // Voice var result = Voice.TextToSpeech(new Voice.TextToSpeechCallCommand { to = "17775551212", from = "15555551212", text = "Hello from Nexmo" }); 36 / 105 @leggetter
  • 64. PubSub // client var client = new Faye.Client('http://localhost:8000/faye'); 39 / 105 @leggetter
  • 65. PubSub // client var client = new Faye.Client('http://localhost:8000/faye'); client.subscribe('/leggetter-updates', function(data) { 39 / 105 @leggetter
  • 66. PubSub // client var client = new Faye.Client('http://localhost:8000/faye'); client.subscribe('/leggetter-updates', function(data) { console.log(data.text); }); 39 / 105 @leggetter
  • 67. 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); }); 39 / 105 @leggetter
  • 68. 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!'}); 39 / 105 @leggetter
  • 69. 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}); 39 / 105 @leggetter
  • 70. Evented PubSub 40 / 105 @leggetter
  • 71. Evented PubSub // client var updates = io('/leggetter-updates'); 41 / 105 @leggetter
  • 72. Evented PubSub // client var updates = io('/leggetter-updates'); updates.on('created', function (data) { // Add activity to UI }); 41 / 105 @leggetter
  • 73. 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 }); 41 / 105 @leggetter
  • 74. 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'); 41 / 105 @leggetter
  • 75. 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}); 41 / 105 @leggetter
  • 76. 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}); 41 / 105 @leggetter
  • 77. PubSub vs. Evented PubSub 42 / 105 @leggetter
  • 80. PubSub client.subscribe('devexp-channel', function(data) { if(data.eventType === 'chat-message') { addMessage(data.message); } 45 / 105 @leggetter
  • 81. 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 */) { } }) 45 / 105 @leggetter
  • 82. 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); 45 / 105 @leggetter
  • 83. 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); 45 / 105 @leggetter
  • 86. Data Sync // client var ref = new Firebase("https://app.firebaseio.com/doc1/lines"); 48 / 105 @leggetter
  • 87. 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. }); 48 / 105 @leggetter
  • 88. 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. }); 48 / 105 @leggetter
  • 89. 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. }); 48 / 105 @leggetter
  • 90. 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!' }); 48 / 105 @leggetter
  • 91. 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 48 / 105 @leggetter
  • 92. RMI (aka RPC) 49 / 105 @leggetter
  • 94. RMI // client var chat = $.connection.chatHub; 51 / 105 @leggetter
  • 95. RMI // client var chat = $.connection.chatHub; chat.client.broadcastMessage = function (name, message) { // handle message }; 51 / 105 @leggetter
  • 96. RMI // client var chat = $.connection.chatHub; chat.client.broadcastMessage = function (name, message) { // handle message }; chat.server.send( 'me', 'hello world' ); 51 / 105 @leggetter
  • 97. RMI // client var chat = $.connection.chatHub; chat.client.broadcastMessage = function (name, message) { // handle message }; chat.server.send( 'me', 'hello world' ); $.connection.hub.start(); // async 51 / 105 @leggetter
  • 98. RMI // client var chat = $.connection.chatHub; chat.client.broadcastMessage = function (name, message) { // handle message }; chat.server.send( 'me', 'hello world' ); $.connection.hub.start(); // async // server public class ChatHub : Hub { 51 / 105 @leggetter
  • 99. RMI // client var chat = $.connection.chatHub; chat.client.broadcastMessage = function (name, message) { // handle message }; chat.server.send( 'me', 'hello world' ); $.connection.hub.start(); // async // server public class ChatHub : Hub { public void Send(string name, string message) { 51 / 105 @leggetter
  • 100. RMI // client var chat = $.connection.chatHub; chat.client.broadcastMessage = function (name, message) { // handle message }; chat.server.send( 'me', 'hello world' ); $.connection.hub.start(); // async // server public class ChatHub : Hub { public void Send(string name, string message) { // Call the broadcastMessage method to update clients. Clients.All.broadcastMessage(name, message); } } 51 / 105 @leggetter
  • 106. 6. Deployment & Architecture Considerations 57 / 105 @leggetter
  • 108. Self Hosted (Tightly Coupled) 59 / 105 @leggetter
  • 109. .NET Self-Hosted Real-Time options SignalR XSockets 60 / 105 @leggetter
  • 111. Self-Hosted Demo 1: ASP.NET + SignalR (Tightly Coupled) 61 / 105 @leggetter
  • 112. What we'll look at: PM> Install-Package Microsoft.AspNet.SignalR Scriptsjquery.signalR*.js App_StartSignalRStartup.cs ControllersHomeController.cs HubsChatHub.cs ViewsHomeSignalR.cshtml ScriptchatSignalRChat.js 62 / 105 @leggetter
  • 113. Pros .NET Simple integration MS Supported jQuery Dependency Cons Tightly coupled RMI only Self-Scaling Scaling (realtime + HTTP) Self-Hosted Demo 1: Pro & Cons 63 / 105 @leggetter
  • 115. Self-Hosted Demo 2: ASP.NET + XSockets (Tightly Coupled) 64 / 105 @leggetter
  • 116. What we'll look at: PM> Install-Package XSockets App_StartXSocketsStartup.cs ControllersHomeController.cs XSocketsChatController.cs ViewsHomeXSockets.cshtml ScriptsXSockets.latest.js ScriptchatXSocketsChat.cs 65 / 105 @leggetter
  • 117. Pros .NET Simple integration Communication patterns PubSub/Evented RMI Licensed Cons Tightly coupled Self-Scaling Scaling (realtime + HTTP) Licensed Self-Hosted Demo 2: Pro & Cons 66 / 105 @leggetter
  • 118. Self-Hosted: .NET + Message Queue (Loosely Coupled) 67 / 105 @leggetter
  • 120. Pros .NET Maps well to PubSub Loosely coupled Could use another runtime Cons How does it fit with RMI/SignalR? Multiple components Self-scaling Queue routing questions In: HTTP. Out: WebSocket Self-Hosted: .NET + Message Queue - Pro & Cons 69 / 105 @leggetter
  • 121. If SignalR or XSockets aren't a good fit you may have to look at a non-.NET solution 70 / 105 @leggetter
  • 122. .NET Hosted Real-Time options Ably Firebase Fanout PubNub Pusher Realtime.co Syncano 71 / 105 @leggetter
  • 124. Hosted Demo: PubNub 72 / 105 @leggetter
  • 125. What we'll look at: PM> Install-Package Pubnub ControllersChatController.cs ViewsHomePubNub.cshtml ScriptchatPubNub.js PubNub Real-Time Analytics 73 / 105 @leggetter
  • 126. Pros Simple & powerful Instantly scalable Managed & dedicated Direct integration. No overhead. Cons 3rd party reliance Difficult to influence functionality Hosted - Pros & Cons 74 / 105 @leggetter
  • 127. Why use a hosted service? Scenario 1. Site average of 10,000 Users 75 / 105 @leggetter
  • 128. Why use a hosted service? Scenario 1. Site average of 10,000 Users 2. Over 1 Hour, no polling 75 / 105 @leggetter
  • 129. Why use a hosted service? Scenario 1. Site average of 10,000 Users 2. Over 1 Hour, no polling 3. Requests from pages load + HTML, CSS, JS, Images for 10k users = 50,000 75 / 105 @leggetter
  • 130. Why use a hosted service? Scenario 1. Site average of 10,000 Users 2. Over 1 Hour, no polling 3. Requests from pages load + HTML, CSS, JS, Images for 10k users = 50,000 4. That's it! Total: 50,000 75 / 105 @leggetter
  • 131. Why use a hosted service? Scenario 1. Site average of 10,000 Users 2. Over 1 Hour, no polling 3. Requests from pages load + HTML, CSS, JS, Images for 10k users = 50,000 4. 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 75 / 105 @leggetter
  • 132. 7. Self-Hosted v Hosted "Build vs. Buy" 76 / 105 @leggetter
  • 133. Build vs. Buy - Costs baremetrics.com/calculator 77 / 105 @leggetter
  • 134. How do you choose? 7 Realtime Framework Considerations 1. Should you keep on polling? 2. Use an Existing Solution 3. Use a language you're comfortable with 4. Do you need multiple client device support? 5. Simple Messaging, PubSub/Evented, RMI or DataSync 6. Architectural considerations 7. Hosted v Self-Hosted (Build vs. Buy) 78 / 105 @leggetter
  • 135. You need Real-Time! There are lots of options. Make the choice that's right for you. I hope this helps! 79 / 105 @leggetter
  • 136. Resources Real-time Tech Guide github.com/leggetter/realtime-dotnet-examples Tools, Tips and Techniques for Developing Real- time Apps Nexmo 80 / 105 @leggetter
  • 137. Real-time Web Apps & .NET What are your options? Questions? PHIL @LEGGETTER Head of Developer Relations 81 / 105 @leggetter
  • 138. Future (If Time) 82 / 105 @leggetter
  • 139. Network Infrastructure & Protocols Reliability Speed Beyond HTTP HTTP2 83 / 105 @leggetter
  • 140. Bayeux DDP dNode EPCP GRIP gRPC MQTT Pusher Protocol STOMP SignalR Protocol WAMP (Web App Messaging Protocol) XMPP (various) Communication Pattern Protocol Standardisation 84 / 105 @leggetter
  • 144. More "Things"! 88 / 105 @leggetter
  • 145. The Physical Web 89 / 105 @leggetter
  • 146. IoT, Apps & Developers 90 / 105 @leggetter
  • 147. A thing can be anything 91 / 105 @leggetter
  • 148. A thing can be anything Sensors Appliances Vehicles Smart Phones Devices (Arduino, Electric Imp, Raspberry Pi etc.) 91 / 105 @leggetter
  • 149. A thing can be anything Sensors Appliances Vehicles Smart Phones Devices (Arduino, Electric Imp, Raspberry Pi etc.) Servers Browsers Apps: Native, Web, running anywhere 91 / 105 @leggetter
  • 150. The Majority of code we'll write will still be for "Apps" Configuring Monitoring Interacting App Logic 92 / 105 @leggetter
  • 151. Real-Time Use Case Evolution Notifications & Signalling Activity Streams Data Viz & Polls Chat Collaboration Multiplayer Games 93 / 105 @leggetter
  • 152. Notifications/Activity Streams -> Actions 94 / 105 @leggetter The end of apps as we know it - Intercom
  • 154. Personalised Event Streams 96 / 105 @leggetter
  • 155. Unified UIs 97 / 105 @leggetter
  • 156. Chat & Bots for Everything and the rise of the .ai domain 98 / 105 @leggetter
  • 157. 600M MAUs 10M integrations app-within-an-app model taxi, order food, tickets, games etc. WeChat 99 / 105 @leggetter
  • 158. Chat Integrations 100 / 105 @leggetter
  • 159. Siri Google Now Microso Cortana Facebook M Chat "Virtual Assistants" 101 / 105 @leggetter
  • 161. Chat has evolved. Chat is now a platform! 103 / 105 @leggetter
  • 163. Ben Foxall - A conceptual future for the multi-device web (FutureJS 2014) 105 / 105 @leggetter