SlideShare a Scribd company logo
1 of 46
Download to read offline
MILAN November 28th/29th, 2014 
Ian Robinson 
REST in Practice, in Practice 
@iansrobinson
MILAN November 28th/29th, 2014 – Ian Robinson 
Work 
in 
the 
1950s 
Office 
Internal Mail 
Business
MILAN November 28th/29th, 2014 – Ian Robinson 
RESTful 
Web 
App 
Domain Model 
Web Technologies 
http://app 
http://app/abc 
http://app/xyz 
HTTP 
HTTP
MILAN November 28th/29th, 2014 – Ian Robinson 
Protocols 
Coordinate 
Processes 
HTTP v 
? v
MILAN November 28th/29th, 2014 – Ian Robinson 
Protocols
MILAN November 28th/29th, 2014 – Ian Robinson 
Protocol 
SpecificaBon
MILAN November 28th/29th, 2014 – Ian Robinson 
Protocol 
Discovery
MILAN November 28th/29th, 2014 – Ian Robinson 
Everyday 
Protocol 
Discovery
MILAN November 28th/29th, 2014 – Ian Robinson 
Hypermedia 
Constraint 
Hypermedia 
As 
The 
Engine 
Of 
Application 
State
MILAN November 28th/29th, 2014 – Ian Robinson 
Graph database 
Clustered
MILAN November 28th/29th, 2014 – Ian Robinson 
Infrastructure 
and 
Tooling 
• Performance 
tesBng 
• Soak 
tesBng 
• Stress 
tesBng 
• Proof 
of 
concept 
• Reproduce 
customer 
issues 
http://www.danzigergallery.com/artists/yuji-obata/7
MILAN November 28th/29th, 2014 – Ian Robinson
MILAN November 28th/29th, 2014 – Ian Robinson 
TestLab 
Manager 
Workflows 
Application State
MILAN November 28th/29th, 2014 – Ian Robinson 
1. 
Design 
Around 
CapabiliBes 
Provision 
Estate 
Install 
Database 
Configure 
Database 
Install 
Dataset 
Install 
Extension 
Start 
Database 
Archive 
Logs 
Backup 
Database 
Check 
Database 
Status 
Capture 
Heap 
Dump 
Install 
Workload 
Execute 
Workload 
Publish 
Results 
Analyze 
Results
MILAN November 28th/29th, 2014 – Ian Robinson 
Implement 
as 
Resource 
Families 
Provision 
Estate 
Install 
Database 
Configure 
Database 
Install 
Dataset 
Install 
Extension 
Start 
Database 
Archive 
Logs 
Backup 
Database 
Check 
Database 
Status 
Capture 
Heap 
Dump 
Install 
Workload 
Execute 
Workload 
Publish 
Results 
Analyze 
Results
MILAN November 28th/29th, 2014 – Ian Robinson 
Deploy 
in 
Services 
Provision 
Estate 
Database 
Agent 
Install 
Database 
Configure 
Database 
Install 
Dataset 
Backup 
Database 
Check 
Database 
Status 
Capture 
Heap 
Dump 
Install 
Extension 
Start 
Database 
Archive 
Logs 
Load 
Generator 
Install 
Workload 
Execute 
Workload 
Results 
Service 
Publish 
Results 
Analyze 
Results
MILAN November 28th/29th, 2014 – Ian Robinson 
Client 
Creates 
an 
ApplicaBon 
• Client-­‐specific 
applicaBon 
goal 
• Applies 
resources 
to 
saBsfy 
this 
goal 
• Intelligence 
at 
the 
edges 
• Client 
understands/reconstructs 
state 
of 
the 
applicaBon
MILAN November 28th/29th, 2014 – Ian Robinson 
Database 
Agent 
Neo-­‐Workbench 
Java 
SDK 
Database 
Agent 
Command-­‐Line 
Tools 
Tests 
(e.g. 
Soak 
Tests) 
Database 
Agent 
Servers 
Clients
MILAN November 28th/29th, 2014 – Ian Robinson 
Database 
Agent 
Demo 
• Browser 
• Command-­‐line 
• Code
MILAN November 28th/29th, 2014 – Ian Robinson 
2. 
Choose 
a 
Hypermedia 
Format 
<table> 
<tr> 
<td> 
<a href="http://localhost:38000/database-agent/001" 
rel="database-admin">001</a> 
</td> 
</tr> 
... 
</table> 
<form class="install-database" 
method="POST" 
action="http://localhost:38000/database-agent/" 
enctype="application/x-www-form-urlencoded"> 
<input type="hidden" name="_redirect_" 
value="http://localhost:38000/database-agent/"></input> 
<input type="text" name="installUri"></input> 
<button type="submit" id="submit-form-install-database">Install</button> 
</form>
MILAN November 28th/29th, 2014 – Ian Robinson 
<table> 
<tr> 
<td> 
<a href="http://localhost:38000/database-agent/001" 
rel="database-admin">001</a> 
</td> 
</tr> 
... 
</table> 
<form class="install-database" 
method="POST" 
action="http://localhost:38000/database-agent/" 
enctype="application/x-www-form-urlencoded"> 
<input type="hidden" name="_redirect_" 
value="http://localhost:38000/database-agent/"></input> 
<input type="text" name="installUri"></input> 
<button type="submit" id="submit-form-install-database">Install</button> 
</form> 
Link 
– 
Safe 
OperaBons 
SemanBc 
context
MILAN November 28th/29th, 2014 – Ian Robinson 
<table> 
<tr> 
<td> 
<a href="http://localhost:38000/database-agent/001" 
rel="database-admin">001</a> 
</td> 
</tr> 
... 
</table> 
<form class="install-database" 
method="POST" 
action="http://localhost:38000/database-agent/" 
enctype="application/x-www-form-urlencoded"> 
<input type="hidden" name="_redirect_" 
value="http://localhost:38000/database-agent/"></input> 
<input type="text" name="installUri"></input> 
<button type="submit" id="submit-form-install-database">Install</button> 
</form> 
Form 
– 
Unsafe 
OperaBons 
SemanBc 
context
MILAN November 28th/29th, 2014 – Ian Robinson 
<table> 
<tr> 
<td> 
<a href="http://localhost:38000/database-agent/001" 
rel="database-admin">001</a> 
</td> 
</tr> 
... 
</table> 
<form class="install-database" 
method="POST" 
action="http://localhost:38000/database-agent/" 
enctype="application/x-www-form-urlencoded"> 
<input type="hidden" name="_redirect_" 
value="http://localhost:38000/database-agent/"></input> 
<input type="text" name="installUri"></input> 
<button type="submit" id="submit-form-install-database">Install</button> 
</form> 
Program 
the 
Client
MILAN November 28th/29th, 2014 – Ian Robinson 
Machines 
First, 
Browsers 
Second 
<table> 
<tr> 
<td> 
<a href="http://localhost:38000/database-agent/001" 
rel="database-admin">001</a> 
</td> 
</tr> 
... 
</table> 
<form class="install-database" 
method="POST" 
action="http://localhost:38000/database-agent/" 
enctype="application/x-www-form-urlencoded"> 
<input type="hidden" name="_redirect_" 
value="http://localhost:38000/database-agent/"></input> 
<input type="text" name="installUri"></input> 
<button type="submit" id="submit-form-install-database">Install</button> 
</form> 
Conven&on 
Fields 
with 
_underscores_ 
target 
the 
browser
MILAN November 28th/29th, 2014 – Ian Robinson 
POST /database-agent 
installUri=file:///neo4j-enterprise-2.1.5-unix.tar.gz 
Client 
Database 
Agent 
ProgrammaBc 
Client 
201 CREATED 
Location: /database-agent/001/
MILAN November 28th/29th, 2014 – Ian Robinson 
Database 
Agent 
Browser 
Client 
POST /database-agent 
installUri=file:///neo4j-enterprise-2.1.5-unix.tar.gz 
_redirect_=/database-agent 
303 SEE OTHER 
Location: /database-agent 
GET/database-agent 
200 OK 
Content-Type: text/html
MILAN November 28th/29th, 2014 – Ian Robinson 
3. 
Long-­‐Running 
Processes 
• Request 
triggers 
long-­‐running 
operaBon 
(e.g. 
backup) 
• Client 
waits 
for 
response: 
• What 
happens 
if 
the 
connecBon 
breaks?
MILAN November 28th/29th, 2014 – Ian Robinson 
202 
Accepted 
• Indicates 
request 
has 
been 
accepted 
for 
processing 
• Response 
includes 
URI 
of 
status 
monitor 
• Client 
polls 
status 
monitor
MILAN November 28th/29th, 2014 – Ian Robinson 
Client 
Database 
Agent 
202 
Accepted 
POST /database-agent/001/stores 
installUri=s3://.../graph.db.zip 
202 ACCEPTED 
Location: /database-agent/jobs/3e4d0 
GET /database-agent/jobs/3e4d0 
202 ACCEPTED 
Location: /database-agent/jobs/3e4d0 
GET /database-agent/jobs/3e4d0 
201 CREATED 
Location: /database-agent/002/stores/graph.db 
Install 
Store
MILAN November 28th/29th, 2014 – Ian Robinson 
Polling 
Demo
MILAN November 28th/29th, 2014 – Ian Robinson 
4. 
Client-­‐Side 
OrchestraBon 
Neo-­‐Workbench 
Java 
APIs 
Command-­‐Line 
Tools 
Tests 
(e.g. 
Soak 
Tests) 
Servers 
Clients 
Sequential = Slow 
1. Install Database 1 
2. Install Database 2 
3. Install Database 3 
4. Upload Store 1-A 
5. Upload Store 2-A 
6. Upload Store 3-A 
7. Start Database 1 
8. Start Database 2 
9. Start Database 3 
10. etc…
MILAN November 28th/29th, 2014 – Ian Robinson 
Client 
Database 
Agent 
Database 
Agent 
Database 
Agent 
Install 
Database 
Install 
Database 
Install 
Database 
Upload 
Dataset 
Upload 
Dataset 
Upload 
Dataset
MILAN November 28th/29th, 2014 – Ian Robinson 
ReacBve 
Extensions 
Iterables 
Observables 
Synchronous 
Asynchronous 
Pull 
Push 
for ( Integer integer : stats.counters() ) 
{ 
System.out.println( integer ); 
} 
stats.counters().subscribe( 
new Action1<Integer>() 
{ 
@Override 
public void call( Integer integer ) 
{ 
System.out.println( integer ); 
} 
}); 
h^ps://github.com/Ne`lix/RxJava/wiki
MILAN November 28th/29th, 2014 – Ian Robinson 
new StartCluster() 
.execute( cluster ) 
.subscribe( new Action1<URI>() 
{ 
@Override 
public void call( URI uri ) 
{ 
System.out.println( 
format( "Database started: %s", uri ) ); 
} 
} ); 
Client-­‐Side 
OrchestraBon
MILAN November 28th/29th, 2014 – Ian Robinson 
new StartCluster() 
.execute( cluster ) 
.subscribe( new Action1<URI>() 
{ 
@Override 
public void call( URI uri ) 
{ 
System.out.println( 
format( "Database started: %s", uri ) ); 
} 
} ); 
Client-­‐Side 
OrchestraBon
MILAN November 28th/29th, 2014 – Ian Robinson 
5. 
Bookmark 
ApplicaBon 
State 
{ 
"estate" : { 
"estateId" : "est51b65", 
"owner" : "neo-workbench", 
"scenario" : "soak-test", 
"blocks" : [ { 
"blockId" : "blke16a8", 
"name" : "db-cluster", 
"size" : 3, 
"machines" : [ { 
"id" : "mace5508", 
"publicIpAddress" : "127.0.0.1", 
"publicDnsName" : "localhost", 
"links" : [ { 
"rel" : "database-agent", 
"uri" : "http://localhost:38001/database-agent" 
}, { 
"rel" : "database-admin", 
"uri" : "http://localhost:38001/database-agent/003" 
}, { 
"rel" : "database", 
"uri" : "http://localhost:7475" 
} ],
MILAN November 28th/29th, 2014 – Ian Robinson 
5. 
Bookmark 
ApplicaBon 
State 
{ 
"estate" : { 
"estateId" : "est51b65", 
"owner" : "neo-workbench", 
"scenario" : "soak-test", 
"blocks" : [ { 
"blockId" : "blke16a8", 
"name" : "db-cluster", 
"size" : 3, 
"machines" : [ { 
"id" : "mace5508", 
"publicIpAddress" : "127.0.0.1", 
"publicDnsName" : "localhost", 
"links" : [ { 
"rel" : "database-agent", 
"uri" : "http://localhost:38001/database-agent" 
}, { 
"rel" : "database-admin", 
"uri" : "http://localhost:38001/database-agent/003" 
}, { 
"rel" : "database", 
"uri" : "http://localhost:7475" 
} ],
MILAN November 28th/29th, 2014 – Ian Robinson 
6. 
Automate 
Deployment 
Load 
Database 
Results
MILAN November 28th/29th, 2014 – Ian Robinson 
Automated 
Provisioning 
Provisioning 
API 
AWS 
CloudFormation 
SDK 
Local 
Provisioning 
Provider 
Vagrant 
Azure 
SDK
MILAN November 28th/29th, 2014 – Ian Robinson 
Fluent 
API 
Estate estate = new Estate() 
.addBlock( new Block<>( 
"results", 1, 
ResultsServiceConfig.DEFAULT, 
AwsPlatformConfig.DEFAULT ) 
.addBlock( new Block<>( 
"db-cluster", 3, 
DatabaseAgentConfig.builder().withPackageDownloadUri( 
URI.create( "http://dist.neo4j.org/neo4j-enterprise-2.1.2-unix.tar.gz" ) ).build(), 
AwsPlatformConfig.DEFAULT ) ) 
.addBlock( new Block<>( 
"load-generator", 1, 
LoadGeneratorConfig.DEFAULT, 
LocalPlatformConfig.DEFAULT ) ); 
EstateProvisioning provisioning = new EstateProvisioning(); 
provisioning.provision( estate );
MILAN November 28th/29th, 2014 – Ian Robinson 
Graphite 
Block 
in 
AWS 
Estate estate = new Estate() 
.addBlock( new Block<>( 
"results", 1, 
ResultsServiceConfig.DEFAULT, 
AwsPlatformConfig.DEFAULT ) 
.addBlock( new Block<>( 
"db-cluster", 3, 
DatabaseAgentConfig.builder().withPackageDownloadUri( 
URI.create( "http://dist.neo4j.org/neo4j-enterprise-2.1.2-unix.tar.gz" ) ).build(), 
AwsPlatformConfig.DEFAULT ) ) 
.addBlock( new Block<>( 
"load-generator", 1, 
LoadGeneratorConfig.DEFAULT, 
LocalPlatformConfig.DEFAULT ) ); 
EstateProvisioning provisioning = new EstateProvisioning(); 
provisioning.provision( estate );
MILAN November 28th/29th, 2014 – Ian Robinson 
Database 
Block 
in 
AWS 
Estate estate = new Estate() 
.addBlock( new Block<>( 
"results", 1, 
ResultsServiceConfig.DEFAULT, 
AwsPlatformConfig.DEFAULT ) 
.addBlock( new Block<>( 
"db-cluster", 3, 
DatabaseAgentConfig.builder().withPackageDownloadUri( 
URI.create( "http://dist.neo4j.org/neo4j-enterprise-2.1.2-unix.tar.gz" ) ).build(), 
AwsPlatformConfig.DEFAULT ) ) 
.addBlock( new Block<>( 
"load-generator", 1, 
LoadGeneratorConfig.DEFAULT, 
LocalPlatformConfig.DEFAULT ) ); 
EstateProvisioning provisioning = new EstateProvisioning(); 
provisioning.provision( estate );
MILAN November 28th/29th, 2014 – Ian Robinson 
Local 
Load 
Generator 
Block 
Estate estate = new Estate() 
.addBlock( new Block<>( 
"results", 1, 
ResultsServiceConfig.DEFAULT, 
AwsPlatformConfig.DEFAULT ) 
.addBlock( new Block<>( 
"db-cluster", 3, 
DatabaseAgentConfig.builder().withPackageDownloadUri( 
URI.create( "http://dist.neo4j.org/neo4j-enterprise-2.1.2-unix.tar.gz" ) ).build(), 
AwsPlatformConfig.DEFAULT ) ) 
.addBlock( new Block<>( 
"load-generator", 1, 
LoadGeneratorConfig.DEFAULT, 
LocalPlatformConfig.DEFAULT ) ); 
EstateProvisioning provisioning = new EstateProvisioning(); 
provisioning.provision( estate );
MILAN November 28th/29th, 2014 – Ian Robinson 
Fluent 
API 
Estate estate = new Estate() 
.addBlock( new Block<>( 
"results", 1, 
ResultsServiceConfig.DEFAULT, 
AwsPlatformConfig.DEFAULT ) 
.addBlock( new Block<>( 
"db-cluster", 3, 
DatabaseAgentConfig.builder().withPackageDownloadUri( 
URI.create( "http://dist.neo4j.org/neo4j-enterprise-2.1.2-unix.tar.gz" ) ).build(), 
AwsPlatformConfig.DEFAULT ) ) 
.addBlock( new Block<>( 
"load-generator", 1, 
LoadGeneratorConfig.DEFAULT, 
LocalPlatformConfig.DEFAULT ) ); 
EstateProvisioning provisioning = new EstateProvisioning(); 
provisioning.provision( estate );
MILAN November 28th/29th, 2014 – Ian Robinson 
Compliments 
of Neo Technology 
Graph 
Databases 
Ian Robinson, 
h 
Jim Webber & Emil Eifrem 
@iansrobinson
MILAN November 28th/29th, 2014 – Ian Robinson 
Database 
Agent 
Soak 
Test 
Database 
Agent 
Database 
Agent 
Load 
Server 
Results 
Server 
Graphite 
Graphite 
Database 
Cluster 
Estate 
Workload

More Related Content

What's hot

New features in Rails 6 - Nihad Abbasov (RUS) | Ruby Meditation 26
New features in Rails 6 -  Nihad Abbasov (RUS) | Ruby Meditation 26New features in Rails 6 -  Nihad Abbasov (RUS) | Ruby Meditation 26
New features in Rails 6 - Nihad Abbasov (RUS) | Ruby Meditation 26Ruby Meditation
 
Web Development with Laravel 5
Web Development with Laravel 5Web Development with Laravel 5
Web Development with Laravel 5Soheil Khodayari
 
SharePoint On-Premises Nirvana
SharePoint On-Premises NirvanaSharePoint On-Premises Nirvana
SharePoint On-Premises NirvanaJohn Calvert
 
Getting to know Laravel 5
Getting to know Laravel 5Getting to know Laravel 5
Getting to know Laravel 5Bukhori Aqid
 
Introduction to laravel framework
Introduction to laravel frameworkIntroduction to laravel framework
Introduction to laravel frameworkAhmad Fatoni
 
Araport Workshop Tutorial 2: Authentication and the Agave Profiles Service
Araport Workshop Tutorial 2: Authentication and the Agave Profiles ServiceAraport Workshop Tutorial 2: Authentication and the Agave Profiles Service
Araport Workshop Tutorial 2: Authentication and the Agave Profiles Servicestevemock
 
In The Trenches With Tomster, Upgrading Ember.js & Ember Data
In The Trenches With Tomster, Upgrading Ember.js & Ember DataIn The Trenches With Tomster, Upgrading Ember.js & Ember Data
In The Trenches With Tomster, Upgrading Ember.js & Ember DataStacy London
 
What IT professionals need to know about SharePoint 2013 Apps
What IT professionals need to know about SharePoint 2013 AppsWhat IT professionals need to know about SharePoint 2013 Apps
What IT professionals need to know about SharePoint 2013 AppsMike Henthorn
 
10 Laravel packages everyone should know
10 Laravel packages everyone should know10 Laravel packages everyone should know
10 Laravel packages everyone should knowPovilas Korop
 
Chef - managing yours servers with Code
Chef - managing yours servers with CodeChef - managing yours servers with Code
Chef - managing yours servers with Codem_richardson
 
Laravel Starter Kit | Laravel Admin Template-ChandraAdmin
Laravel Starter Kit | Laravel Admin Template-ChandraAdmin Laravel Starter Kit | Laravel Admin Template-ChandraAdmin
Laravel Starter Kit | Laravel Admin Template-ChandraAdmin Lorvent56
 
Introduction to Laravel Framework (5.2)
Introduction to Laravel Framework (5.2)Introduction to Laravel Framework (5.2)
Introduction to Laravel Framework (5.2)Viral Solani
 
Adventures in Laravel 5 SunshinePHP 2016 Tutorial
Adventures in Laravel 5 SunshinePHP 2016 TutorialAdventures in Laravel 5 SunshinePHP 2016 Tutorial
Adventures in Laravel 5 SunshinePHP 2016 TutorialJoe Ferguson
 

What's hot (19)

New features in Rails 6 - Nihad Abbasov (RUS) | Ruby Meditation 26
New features in Rails 6 -  Nihad Abbasov (RUS) | Ruby Meditation 26New features in Rails 6 -  Nihad Abbasov (RUS) | Ruby Meditation 26
New features in Rails 6 - Nihad Abbasov (RUS) | Ruby Meditation 26
 
Web Development with Laravel 5
Web Development with Laravel 5Web Development with Laravel 5
Web Development with Laravel 5
 
Laravel 5.4
Laravel 5.4 Laravel 5.4
Laravel 5.4
 
SharePoint On-Premises Nirvana
SharePoint On-Premises NirvanaSharePoint On-Premises Nirvana
SharePoint On-Premises Nirvana
 
Getting to know Laravel 5
Getting to know Laravel 5Getting to know Laravel 5
Getting to know Laravel 5
 
Presentation laravel 5 4
Presentation laravel 5 4Presentation laravel 5 4
Presentation laravel 5 4
 
Introduction to laravel framework
Introduction to laravel frameworkIntroduction to laravel framework
Introduction to laravel framework
 
Araport Workshop Tutorial 2: Authentication and the Agave Profiles Service
Araport Workshop Tutorial 2: Authentication and the Agave Profiles ServiceAraport Workshop Tutorial 2: Authentication and the Agave Profiles Service
Araport Workshop Tutorial 2: Authentication and the Agave Profiles Service
 
Intro to Laravel
Intro to LaravelIntro to Laravel
Intro to Laravel
 
In The Trenches With Tomster, Upgrading Ember.js & Ember Data
In The Trenches With Tomster, Upgrading Ember.js & Ember DataIn The Trenches With Tomster, Upgrading Ember.js & Ember Data
In The Trenches With Tomster, Upgrading Ember.js & Ember Data
 
Laravel Introduction
Laravel IntroductionLaravel Introduction
Laravel Introduction
 
Workshop Laravel 5.2
Workshop Laravel 5.2Workshop Laravel 5.2
Workshop Laravel 5.2
 
What IT professionals need to know about SharePoint 2013 Apps
What IT professionals need to know about SharePoint 2013 AppsWhat IT professionals need to know about SharePoint 2013 Apps
What IT professionals need to know about SharePoint 2013 Apps
 
Laravel 5
Laravel 5Laravel 5
Laravel 5
 
10 Laravel packages everyone should know
10 Laravel packages everyone should know10 Laravel packages everyone should know
10 Laravel packages everyone should know
 
Chef - managing yours servers with Code
Chef - managing yours servers with CodeChef - managing yours servers with Code
Chef - managing yours servers with Code
 
Laravel Starter Kit | Laravel Admin Template-ChandraAdmin
Laravel Starter Kit | Laravel Admin Template-ChandraAdmin Laravel Starter Kit | Laravel Admin Template-ChandraAdmin
Laravel Starter Kit | Laravel Admin Template-ChandraAdmin
 
Introduction to Laravel Framework (5.2)
Introduction to Laravel Framework (5.2)Introduction to Laravel Framework (5.2)
Introduction to Laravel Framework (5.2)
 
Adventures in Laravel 5 SunshinePHP 2016 Tutorial
Adventures in Laravel 5 SunshinePHP 2016 TutorialAdventures in Laravel 5 SunshinePHP 2016 Tutorial
Adventures in Laravel 5 SunshinePHP 2016 Tutorial
 

Viewers also liked

Tech Webinar: Firefox Developer Tool
Tech Webinar: Firefox Developer ToolTech Webinar: Firefox Developer Tool
Tech Webinar: Firefox Developer ToolCodemotion
 
Swift Programming
Swift ProgrammingSwift Programming
Swift ProgrammingCodemotion
 
Don't make me think. There's no need.
Don't make me think. There's no need.Don't make me think. There's no need.
Don't make me think. There's no need.Codemotion
 
NodeJS for .NET web developers
NodeJS for .NET web developersNodeJS for .NET web developers
NodeJS for .NET web developersCodemotion
 
Release Responsibly
Release ResponsiblyRelease Responsibly
Release ResponsiblyCodemotion
 
Polymer - Lego for the web!
Polymer - Lego for the web!Polymer - Lego for the web!
Polymer - Lego for the web!Codemotion
 
Tech Webinar: Come ottimizzare il workflow nello sviluppo di Web App
Tech Webinar: Come ottimizzare il workflow nello sviluppo di Web AppTech Webinar: Come ottimizzare il workflow nello sviluppo di Web App
Tech Webinar: Come ottimizzare il workflow nello sviluppo di Web AppCodemotion
 
TechDay: Functional DDD - Alessandro Melchiori
TechDay: Functional DDD - Alessandro MelchioriTechDay: Functional DDD - Alessandro Melchiori
TechDay: Functional DDD - Alessandro MelchioriCodemotion
 
Tech Webinar: Offline First: Creare un'app Phonegap che funzioni offline e si...
Tech Webinar: Offline First: Creare un'app Phonegap che funzioni offline e si...Tech Webinar: Offline First: Creare un'app Phonegap che funzioni offline e si...
Tech Webinar: Offline First: Creare un'app Phonegap che funzioni offline e si...Codemotion
 
Meglio Kanban o Scrum? (Prossima domanda, prego...) - Carlo Beschi - Codemoti...
Meglio Kanban o Scrum? (Prossima domanda, prego...) - Carlo Beschi - Codemoti...Meglio Kanban o Scrum? (Prossima domanda, prego...) - Carlo Beschi - Codemoti...
Meglio Kanban o Scrum? (Prossima domanda, prego...) - Carlo Beschi - Codemoti...Codemotion
 

Viewers also liked (10)

Tech Webinar: Firefox Developer Tool
Tech Webinar: Firefox Developer ToolTech Webinar: Firefox Developer Tool
Tech Webinar: Firefox Developer Tool
 
Swift Programming
Swift ProgrammingSwift Programming
Swift Programming
 
Don't make me think. There's no need.
Don't make me think. There's no need.Don't make me think. There's no need.
Don't make me think. There's no need.
 
NodeJS for .NET web developers
NodeJS for .NET web developersNodeJS for .NET web developers
NodeJS for .NET web developers
 
Release Responsibly
Release ResponsiblyRelease Responsibly
Release Responsibly
 
Polymer - Lego for the web!
Polymer - Lego for the web!Polymer - Lego for the web!
Polymer - Lego for the web!
 
Tech Webinar: Come ottimizzare il workflow nello sviluppo di Web App
Tech Webinar: Come ottimizzare il workflow nello sviluppo di Web AppTech Webinar: Come ottimizzare il workflow nello sviluppo di Web App
Tech Webinar: Come ottimizzare il workflow nello sviluppo di Web App
 
TechDay: Functional DDD - Alessandro Melchiori
TechDay: Functional DDD - Alessandro MelchioriTechDay: Functional DDD - Alessandro Melchiori
TechDay: Functional DDD - Alessandro Melchiori
 
Tech Webinar: Offline First: Creare un'app Phonegap che funzioni offline e si...
Tech Webinar: Offline First: Creare un'app Phonegap che funzioni offline e si...Tech Webinar: Offline First: Creare un'app Phonegap che funzioni offline e si...
Tech Webinar: Offline First: Creare un'app Phonegap che funzioni offline e si...
 
Meglio Kanban o Scrum? (Prossima domanda, prego...) - Carlo Beschi - Codemoti...
Meglio Kanban o Scrum? (Prossima domanda, prego...) - Carlo Beschi - Codemoti...Meglio Kanban o Scrum? (Prossima domanda, prego...) - Carlo Beschi - Codemoti...
Meglio Kanban o Scrum? (Prossima domanda, prego...) - Carlo Beschi - Codemoti...
 

Similar to REST in-practice, in practice!

Puppet Performance Profiling
Puppet Performance ProfilingPuppet Performance Profiling
Puppet Performance Profilingripienaar
 
Designing a RESTful web service
Designing a RESTful web serviceDesigning a RESTful web service
Designing a RESTful web serviceFilip Blondeel
 
Rest experience-report
Rest experience-reportRest experience-report
Rest experience-reportJim Barritt
 
Your App deserves more – The Art of App Modernization
Your App deserves more – The Art of App ModernizationYour App deserves more – The Art of App Modernization
Your App deserves more – The Art of App ModernizationChristian Güdemann
 
Mum, I want to be a Groovy full-stack developer
Mum, I want to be a Groovy full-stack developerMum, I want to be a Groovy full-stack developer
Mum, I want to be a Groovy full-stack developerGR8Conf
 
GR8Conf 2016 - Mum, I want to be a Groovy full-stack developer
GR8Conf 2016 - Mum, I want to be a Groovy full-stack developerGR8Conf 2016 - Mum, I want to be a Groovy full-stack developer
GR8Conf 2016 - Mum, I want to be a Groovy full-stack developerIván López Martín
 
REST API Best Practices & Implementing in Codeigniter
REST API Best Practices & Implementing in CodeigniterREST API Best Practices & Implementing in Codeigniter
REST API Best Practices & Implementing in CodeigniterSachin G Kulkarni
 
RESTful API を Chalice で紐解く 〜 Python Serverless Microframework for AWS 〜
RESTful API を Chalice で紐解く 〜 Python Serverless Microframework for AWS 〜RESTful API を Chalice で紐解く 〜 Python Serverless Microframework for AWS 〜
RESTful API を Chalice で紐解く 〜 Python Serverless Microframework for AWS 〜崇之 清水
 
Puppet Performance Profiling - CM Camp 2015
Puppet Performance Profiling - CM Camp 2015Puppet Performance Profiling - CM Camp 2015
Puppet Performance Profiling - CM Camp 2015ripienaar
 
Your App Deserves More – The Art of App Modernization
Your App Deserves More – The Art of App ModernizationYour App Deserves More – The Art of App Modernization
Your App Deserves More – The Art of App ModernizationKlaus Bild
 
Behavior Driven Development and Automation Testing Using Cucumber
Behavior Driven Development and Automation Testing Using CucumberBehavior Driven Development and Automation Testing Using Cucumber
Behavior Driven Development and Automation Testing Using CucumberKMS Technology
 
マイクロサービスに必要な技術要素はすべてSpring Cloudにある #DO07
マイクロサービスに必要な技術要素はすべてSpring Cloudにある #DO07マイクロサービスに必要な技術要素はすべてSpring Cloudにある #DO07
マイクロサービスに必要な技術要素はすべてSpring Cloudにある #DO07Toshiaki Maki
 
Powering Content Driven Applications with the World’s Most Popular CMS #ngconf
Powering Content Driven Applications with the World’s Most Popular CMS #ngconfPowering Content Driven Applications with the World’s Most Popular CMS #ngconf
Powering Content Driven Applications with the World’s Most Popular CMS #ngconfRoy Sivan
 
Me and my importers
Me and my importersMe and my importers
Me and my importersDonny Wals
 
SharePoint and Office Development Workshop
SharePoint and Office Development WorkshopSharePoint and Office Development Workshop
SharePoint and Office Development WorkshopEric Shupps
 
Code First with Serverless Azure Functions
Code First with Serverless Azure FunctionsCode First with Serverless Azure Functions
Code First with Serverless Azure FunctionsJeremy Likness
 
Migrating Speedment to Java 9
Migrating Speedment to Java 9Migrating Speedment to Java 9
Migrating Speedment to Java 9C4Media
 
The Truth About Your Web App's Performance
The Truth About Your Web App's PerformanceThe Truth About Your Web App's Performance
The Truth About Your Web App's PerformanceJohn Riviello
 

Similar to REST in-practice, in practice! (20)

Puppet Performance Profiling
Puppet Performance ProfilingPuppet Performance Profiling
Puppet Performance Profiling
 
Designing a RESTful web service
Designing a RESTful web serviceDesigning a RESTful web service
Designing a RESTful web service
 
Rest experience-report
Rest experience-reportRest experience-report
Rest experience-report
 
Your App deserves more – The Art of App Modernization
Your App deserves more – The Art of App ModernizationYour App deserves more – The Art of App Modernization
Your App deserves more – The Art of App Modernization
 
Mum, I want to be a Groovy full-stack developer
Mum, I want to be a Groovy full-stack developerMum, I want to be a Groovy full-stack developer
Mum, I want to be a Groovy full-stack developer
 
GR8Conf 2016 - Mum, I want to be a Groovy full-stack developer
GR8Conf 2016 - Mum, I want to be a Groovy full-stack developerGR8Conf 2016 - Mum, I want to be a Groovy full-stack developer
GR8Conf 2016 - Mum, I want to be a Groovy full-stack developer
 
REST API Best Practices & Implementing in Codeigniter
REST API Best Practices & Implementing in CodeigniterREST API Best Practices & Implementing in Codeigniter
REST API Best Practices & Implementing in Codeigniter
 
RESTful API を Chalice で紐解く 〜 Python Serverless Microframework for AWS 〜
RESTful API を Chalice で紐解く 〜 Python Serverless Microframework for AWS 〜RESTful API を Chalice で紐解く 〜 Python Serverless Microframework for AWS 〜
RESTful API を Chalice で紐解く 〜 Python Serverless Microframework for AWS 〜
 
Puppet Performance Profiling - CM Camp 2015
Puppet Performance Profiling - CM Camp 2015Puppet Performance Profiling - CM Camp 2015
Puppet Performance Profiling - CM Camp 2015
 
Your App Deserves More – The Art of App Modernization
Your App Deserves More – The Art of App ModernizationYour App Deserves More – The Art of App Modernization
Your App Deserves More – The Art of App Modernization
 
Behavior Driven Development and Automation Testing Using Cucumber
Behavior Driven Development and Automation Testing Using CucumberBehavior Driven Development and Automation Testing Using Cucumber
Behavior Driven Development and Automation Testing Using Cucumber
 
マイクロサービスに必要な技術要素はすべてSpring Cloudにある #DO07
マイクロサービスに必要な技術要素はすべてSpring Cloudにある #DO07マイクロサービスに必要な技術要素はすべてSpring Cloudにある #DO07
マイクロサービスに必要な技術要素はすべてSpring Cloudにある #DO07
 
Powering Content Driven Applications with the World’s Most Popular CMS #ngconf
Powering Content Driven Applications with the World’s Most Popular CMS #ngconfPowering Content Driven Applications with the World’s Most Popular CMS #ngconf
Powering Content Driven Applications with the World’s Most Popular CMS #ngconf
 
Deploying the Graph
Deploying the GraphDeploying the Graph
Deploying the Graph
 
Me and my importers
Me and my importersMe and my importers
Me and my importers
 
ApacheCon 2005
ApacheCon 2005ApacheCon 2005
ApacheCon 2005
 
SharePoint and Office Development Workshop
SharePoint and Office Development WorkshopSharePoint and Office Development Workshop
SharePoint and Office Development Workshop
 
Code First with Serverless Azure Functions
Code First with Serverless Azure FunctionsCode First with Serverless Azure Functions
Code First with Serverless Azure Functions
 
Migrating Speedment to Java 9
Migrating Speedment to Java 9Migrating Speedment to Java 9
Migrating Speedment to Java 9
 
The Truth About Your Web App's Performance
The Truth About Your Web App's PerformanceThe Truth About Your Web App's Performance
The Truth About Your Web App's Performance
 

More from Codemotion

Fuzz-testing: A hacker's approach to making your code more secure | Pascal Ze...
Fuzz-testing: A hacker's approach to making your code more secure | Pascal Ze...Fuzz-testing: A hacker's approach to making your code more secure | Pascal Ze...
Fuzz-testing: A hacker's approach to making your code more secure | Pascal Ze...Codemotion
 
Pompili - From hero to_zero: The FatalNoise neverending story
Pompili - From hero to_zero: The FatalNoise neverending storyPompili - From hero to_zero: The FatalNoise neverending story
Pompili - From hero to_zero: The FatalNoise neverending storyCodemotion
 
Pastore - Commodore 65 - La storia
Pastore - Commodore 65 - La storiaPastore - Commodore 65 - La storia
Pastore - Commodore 65 - La storiaCodemotion
 
Pennisi - Essere Richard Altwasser
Pennisi - Essere Richard AltwasserPennisi - Essere Richard Altwasser
Pennisi - Essere Richard AltwasserCodemotion
 
Michel Schudel - Let's build a blockchain... in 40 minutes! - Codemotion Amst...
Michel Schudel - Let's build a blockchain... in 40 minutes! - Codemotion Amst...Michel Schudel - Let's build a blockchain... in 40 minutes! - Codemotion Amst...
Michel Schudel - Let's build a blockchain... in 40 minutes! - Codemotion Amst...Codemotion
 
Richard Süselbeck - Building your own ride share app - Codemotion Amsterdam 2019
Richard Süselbeck - Building your own ride share app - Codemotion Amsterdam 2019Richard Süselbeck - Building your own ride share app - Codemotion Amsterdam 2019
Richard Süselbeck - Building your own ride share app - Codemotion Amsterdam 2019Codemotion
 
Eward Driehuis - What we learned from 20.000 attacks - Codemotion Amsterdam 2019
Eward Driehuis - What we learned from 20.000 attacks - Codemotion Amsterdam 2019Eward Driehuis - What we learned from 20.000 attacks - Codemotion Amsterdam 2019
Eward Driehuis - What we learned from 20.000 attacks - Codemotion Amsterdam 2019Codemotion
 
Francesco Baldassarri - Deliver Data at Scale - Codemotion Amsterdam 2019 -
Francesco Baldassarri  - Deliver Data at Scale - Codemotion Amsterdam 2019 - Francesco Baldassarri  - Deliver Data at Scale - Codemotion Amsterdam 2019 -
Francesco Baldassarri - Deliver Data at Scale - Codemotion Amsterdam 2019 - Codemotion
 
Martin Förtsch, Thomas Endres - Stereoscopic Style Transfer AI - Codemotion A...
Martin Förtsch, Thomas Endres - Stereoscopic Style Transfer AI - Codemotion A...Martin Förtsch, Thomas Endres - Stereoscopic Style Transfer AI - Codemotion A...
Martin Förtsch, Thomas Endres - Stereoscopic Style Transfer AI - Codemotion A...Codemotion
 
Melanie Rieback, Klaus Kursawe - Blockchain Security: Melting the "Silver Bul...
Melanie Rieback, Klaus Kursawe - Blockchain Security: Melting the "Silver Bul...Melanie Rieback, Klaus Kursawe - Blockchain Security: Melting the "Silver Bul...
Melanie Rieback, Klaus Kursawe - Blockchain Security: Melting the "Silver Bul...Codemotion
 
Angelo van der Sijpt - How well do you know your network stack? - Codemotion ...
Angelo van der Sijpt - How well do you know your network stack? - Codemotion ...Angelo van der Sijpt - How well do you know your network stack? - Codemotion ...
Angelo van der Sijpt - How well do you know your network stack? - Codemotion ...Codemotion
 
Lars Wolff - Performance Testing for DevOps in the Cloud - Codemotion Amsterd...
Lars Wolff - Performance Testing for DevOps in the Cloud - Codemotion Amsterd...Lars Wolff - Performance Testing for DevOps in the Cloud - Codemotion Amsterd...
Lars Wolff - Performance Testing for DevOps in the Cloud - Codemotion Amsterd...Codemotion
 
Sascha Wolter - Conversational AI Demystified - Codemotion Amsterdam 2019
Sascha Wolter - Conversational AI Demystified - Codemotion Amsterdam 2019Sascha Wolter - Conversational AI Demystified - Codemotion Amsterdam 2019
Sascha Wolter - Conversational AI Demystified - Codemotion Amsterdam 2019Codemotion
 
Michele Tonutti - Scaling is caring - Codemotion Amsterdam 2019
Michele Tonutti - Scaling is caring - Codemotion Amsterdam 2019Michele Tonutti - Scaling is caring - Codemotion Amsterdam 2019
Michele Tonutti - Scaling is caring - Codemotion Amsterdam 2019Codemotion
 
Pat Hermens - From 100 to 1,000+ deployments a day - Codemotion Amsterdam 2019
Pat Hermens - From 100 to 1,000+ deployments a day - Codemotion Amsterdam 2019Pat Hermens - From 100 to 1,000+ deployments a day - Codemotion Amsterdam 2019
Pat Hermens - From 100 to 1,000+ deployments a day - Codemotion Amsterdam 2019Codemotion
 
James Birnie - Using Many Worlds of Compute Power with Quantum - Codemotion A...
James Birnie - Using Many Worlds of Compute Power with Quantum - Codemotion A...James Birnie - Using Many Worlds of Compute Power with Quantum - Codemotion A...
James Birnie - Using Many Worlds of Compute Power with Quantum - Codemotion A...Codemotion
 
Don Goodman-Wilson - Chinese food, motor scooters, and open source developmen...
Don Goodman-Wilson - Chinese food, motor scooters, and open source developmen...Don Goodman-Wilson - Chinese food, motor scooters, and open source developmen...
Don Goodman-Wilson - Chinese food, motor scooters, and open source developmen...Codemotion
 
Pieter Omvlee - The story behind Sketch - Codemotion Amsterdam 2019
Pieter Omvlee - The story behind Sketch - Codemotion Amsterdam 2019Pieter Omvlee - The story behind Sketch - Codemotion Amsterdam 2019
Pieter Omvlee - The story behind Sketch - Codemotion Amsterdam 2019Codemotion
 
Dave Farley - Taking Back “Software Engineering” - Codemotion Amsterdam 2019
Dave Farley - Taking Back “Software Engineering” - Codemotion Amsterdam 2019Dave Farley - Taking Back “Software Engineering” - Codemotion Amsterdam 2019
Dave Farley - Taking Back “Software Engineering” - Codemotion Amsterdam 2019Codemotion
 
Joshua Hoffman - Should the CTO be Coding? - Codemotion Amsterdam 2019
Joshua Hoffman - Should the CTO be Coding? - Codemotion Amsterdam 2019Joshua Hoffman - Should the CTO be Coding? - Codemotion Amsterdam 2019
Joshua Hoffman - Should the CTO be Coding? - Codemotion Amsterdam 2019Codemotion
 

More from Codemotion (20)

Fuzz-testing: A hacker's approach to making your code more secure | Pascal Ze...
Fuzz-testing: A hacker's approach to making your code more secure | Pascal Ze...Fuzz-testing: A hacker's approach to making your code more secure | Pascal Ze...
Fuzz-testing: A hacker's approach to making your code more secure | Pascal Ze...
 
Pompili - From hero to_zero: The FatalNoise neverending story
Pompili - From hero to_zero: The FatalNoise neverending storyPompili - From hero to_zero: The FatalNoise neverending story
Pompili - From hero to_zero: The FatalNoise neverending story
 
Pastore - Commodore 65 - La storia
Pastore - Commodore 65 - La storiaPastore - Commodore 65 - La storia
Pastore - Commodore 65 - La storia
 
Pennisi - Essere Richard Altwasser
Pennisi - Essere Richard AltwasserPennisi - Essere Richard Altwasser
Pennisi - Essere Richard Altwasser
 
Michel Schudel - Let's build a blockchain... in 40 minutes! - Codemotion Amst...
Michel Schudel - Let's build a blockchain... in 40 minutes! - Codemotion Amst...Michel Schudel - Let's build a blockchain... in 40 minutes! - Codemotion Amst...
Michel Schudel - Let's build a blockchain... in 40 minutes! - Codemotion Amst...
 
Richard Süselbeck - Building your own ride share app - Codemotion Amsterdam 2019
Richard Süselbeck - Building your own ride share app - Codemotion Amsterdam 2019Richard Süselbeck - Building your own ride share app - Codemotion Amsterdam 2019
Richard Süselbeck - Building your own ride share app - Codemotion Amsterdam 2019
 
Eward Driehuis - What we learned from 20.000 attacks - Codemotion Amsterdam 2019
Eward Driehuis - What we learned from 20.000 attacks - Codemotion Amsterdam 2019Eward Driehuis - What we learned from 20.000 attacks - Codemotion Amsterdam 2019
Eward Driehuis - What we learned from 20.000 attacks - Codemotion Amsterdam 2019
 
Francesco Baldassarri - Deliver Data at Scale - Codemotion Amsterdam 2019 -
Francesco Baldassarri  - Deliver Data at Scale - Codemotion Amsterdam 2019 - Francesco Baldassarri  - Deliver Data at Scale - Codemotion Amsterdam 2019 -
Francesco Baldassarri - Deliver Data at Scale - Codemotion Amsterdam 2019 -
 
Martin Förtsch, Thomas Endres - Stereoscopic Style Transfer AI - Codemotion A...
Martin Förtsch, Thomas Endres - Stereoscopic Style Transfer AI - Codemotion A...Martin Förtsch, Thomas Endres - Stereoscopic Style Transfer AI - Codemotion A...
Martin Förtsch, Thomas Endres - Stereoscopic Style Transfer AI - Codemotion A...
 
Melanie Rieback, Klaus Kursawe - Blockchain Security: Melting the "Silver Bul...
Melanie Rieback, Klaus Kursawe - Blockchain Security: Melting the "Silver Bul...Melanie Rieback, Klaus Kursawe - Blockchain Security: Melting the "Silver Bul...
Melanie Rieback, Klaus Kursawe - Blockchain Security: Melting the "Silver Bul...
 
Angelo van der Sijpt - How well do you know your network stack? - Codemotion ...
Angelo van der Sijpt - How well do you know your network stack? - Codemotion ...Angelo van der Sijpt - How well do you know your network stack? - Codemotion ...
Angelo van der Sijpt - How well do you know your network stack? - Codemotion ...
 
Lars Wolff - Performance Testing for DevOps in the Cloud - Codemotion Amsterd...
Lars Wolff - Performance Testing for DevOps in the Cloud - Codemotion Amsterd...Lars Wolff - Performance Testing for DevOps in the Cloud - Codemotion Amsterd...
Lars Wolff - Performance Testing for DevOps in the Cloud - Codemotion Amsterd...
 
Sascha Wolter - Conversational AI Demystified - Codemotion Amsterdam 2019
Sascha Wolter - Conversational AI Demystified - Codemotion Amsterdam 2019Sascha Wolter - Conversational AI Demystified - Codemotion Amsterdam 2019
Sascha Wolter - Conversational AI Demystified - Codemotion Amsterdam 2019
 
Michele Tonutti - Scaling is caring - Codemotion Amsterdam 2019
Michele Tonutti - Scaling is caring - Codemotion Amsterdam 2019Michele Tonutti - Scaling is caring - Codemotion Amsterdam 2019
Michele Tonutti - Scaling is caring - Codemotion Amsterdam 2019
 
Pat Hermens - From 100 to 1,000+ deployments a day - Codemotion Amsterdam 2019
Pat Hermens - From 100 to 1,000+ deployments a day - Codemotion Amsterdam 2019Pat Hermens - From 100 to 1,000+ deployments a day - Codemotion Amsterdam 2019
Pat Hermens - From 100 to 1,000+ deployments a day - Codemotion Amsterdam 2019
 
James Birnie - Using Many Worlds of Compute Power with Quantum - Codemotion A...
James Birnie - Using Many Worlds of Compute Power with Quantum - Codemotion A...James Birnie - Using Many Worlds of Compute Power with Quantum - Codemotion A...
James Birnie - Using Many Worlds of Compute Power with Quantum - Codemotion A...
 
Don Goodman-Wilson - Chinese food, motor scooters, and open source developmen...
Don Goodman-Wilson - Chinese food, motor scooters, and open source developmen...Don Goodman-Wilson - Chinese food, motor scooters, and open source developmen...
Don Goodman-Wilson - Chinese food, motor scooters, and open source developmen...
 
Pieter Omvlee - The story behind Sketch - Codemotion Amsterdam 2019
Pieter Omvlee - The story behind Sketch - Codemotion Amsterdam 2019Pieter Omvlee - The story behind Sketch - Codemotion Amsterdam 2019
Pieter Omvlee - The story behind Sketch - Codemotion Amsterdam 2019
 
Dave Farley - Taking Back “Software Engineering” - Codemotion Amsterdam 2019
Dave Farley - Taking Back “Software Engineering” - Codemotion Amsterdam 2019Dave Farley - Taking Back “Software Engineering” - Codemotion Amsterdam 2019
Dave Farley - Taking Back “Software Engineering” - Codemotion Amsterdam 2019
 
Joshua Hoffman - Should the CTO be Coding? - Codemotion Amsterdam 2019
Joshua Hoffman - Should the CTO be Coding? - Codemotion Amsterdam 2019Joshua Hoffman - Should the CTO be Coding? - Codemotion Amsterdam 2019
Joshua Hoffman - Should the CTO be Coding? - Codemotion Amsterdam 2019
 

REST in-practice, in practice!

  • 1. MILAN November 28th/29th, 2014 Ian Robinson REST in Practice, in Practice @iansrobinson
  • 2. MILAN November 28th/29th, 2014 – Ian Robinson Work in the 1950s Office Internal Mail Business
  • 3. MILAN November 28th/29th, 2014 – Ian Robinson RESTful Web App Domain Model Web Technologies http://app http://app/abc http://app/xyz HTTP HTTP
  • 4. MILAN November 28th/29th, 2014 – Ian Robinson Protocols Coordinate Processes HTTP v ? v
  • 5. MILAN November 28th/29th, 2014 – Ian Robinson Protocols
  • 6. MILAN November 28th/29th, 2014 – Ian Robinson Protocol SpecificaBon
  • 7. MILAN November 28th/29th, 2014 – Ian Robinson Protocol Discovery
  • 8. MILAN November 28th/29th, 2014 – Ian Robinson Everyday Protocol Discovery
  • 9. MILAN November 28th/29th, 2014 – Ian Robinson Hypermedia Constraint Hypermedia As The Engine Of Application State
  • 10. MILAN November 28th/29th, 2014 – Ian Robinson Graph database Clustered
  • 11. MILAN November 28th/29th, 2014 – Ian Robinson Infrastructure and Tooling • Performance tesBng • Soak tesBng • Stress tesBng • Proof of concept • Reproduce customer issues http://www.danzigergallery.com/artists/yuji-obata/7
  • 12. MILAN November 28th/29th, 2014 – Ian Robinson
  • 13. MILAN November 28th/29th, 2014 – Ian Robinson TestLab Manager Workflows Application State
  • 14. MILAN November 28th/29th, 2014 – Ian Robinson 1. Design Around CapabiliBes Provision Estate Install Database Configure Database Install Dataset Install Extension Start Database Archive Logs Backup Database Check Database Status Capture Heap Dump Install Workload Execute Workload Publish Results Analyze Results
  • 15. MILAN November 28th/29th, 2014 – Ian Robinson Implement as Resource Families Provision Estate Install Database Configure Database Install Dataset Install Extension Start Database Archive Logs Backup Database Check Database Status Capture Heap Dump Install Workload Execute Workload Publish Results Analyze Results
  • 16. MILAN November 28th/29th, 2014 – Ian Robinson Deploy in Services Provision Estate Database Agent Install Database Configure Database Install Dataset Backup Database Check Database Status Capture Heap Dump Install Extension Start Database Archive Logs Load Generator Install Workload Execute Workload Results Service Publish Results Analyze Results
  • 17. MILAN November 28th/29th, 2014 – Ian Robinson Client Creates an ApplicaBon • Client-­‐specific applicaBon goal • Applies resources to saBsfy this goal • Intelligence at the edges • Client understands/reconstructs state of the applicaBon
  • 18. MILAN November 28th/29th, 2014 – Ian Robinson Database Agent Neo-­‐Workbench Java SDK Database Agent Command-­‐Line Tools Tests (e.g. Soak Tests) Database Agent Servers Clients
  • 19. MILAN November 28th/29th, 2014 – Ian Robinson Database Agent Demo • Browser • Command-­‐line • Code
  • 20. MILAN November 28th/29th, 2014 – Ian Robinson 2. Choose a Hypermedia Format <table> <tr> <td> <a href="http://localhost:38000/database-agent/001" rel="database-admin">001</a> </td> </tr> ... </table> <form class="install-database" method="POST" action="http://localhost:38000/database-agent/" enctype="application/x-www-form-urlencoded"> <input type="hidden" name="_redirect_" value="http://localhost:38000/database-agent/"></input> <input type="text" name="installUri"></input> <button type="submit" id="submit-form-install-database">Install</button> </form>
  • 21. MILAN November 28th/29th, 2014 – Ian Robinson <table> <tr> <td> <a href="http://localhost:38000/database-agent/001" rel="database-admin">001</a> </td> </tr> ... </table> <form class="install-database" method="POST" action="http://localhost:38000/database-agent/" enctype="application/x-www-form-urlencoded"> <input type="hidden" name="_redirect_" value="http://localhost:38000/database-agent/"></input> <input type="text" name="installUri"></input> <button type="submit" id="submit-form-install-database">Install</button> </form> Link – Safe OperaBons SemanBc context
  • 22. MILAN November 28th/29th, 2014 – Ian Robinson <table> <tr> <td> <a href="http://localhost:38000/database-agent/001" rel="database-admin">001</a> </td> </tr> ... </table> <form class="install-database" method="POST" action="http://localhost:38000/database-agent/" enctype="application/x-www-form-urlencoded"> <input type="hidden" name="_redirect_" value="http://localhost:38000/database-agent/"></input> <input type="text" name="installUri"></input> <button type="submit" id="submit-form-install-database">Install</button> </form> Form – Unsafe OperaBons SemanBc context
  • 23. MILAN November 28th/29th, 2014 – Ian Robinson <table> <tr> <td> <a href="http://localhost:38000/database-agent/001" rel="database-admin">001</a> </td> </tr> ... </table> <form class="install-database" method="POST" action="http://localhost:38000/database-agent/" enctype="application/x-www-form-urlencoded"> <input type="hidden" name="_redirect_" value="http://localhost:38000/database-agent/"></input> <input type="text" name="installUri"></input> <button type="submit" id="submit-form-install-database">Install</button> </form> Program the Client
  • 24. MILAN November 28th/29th, 2014 – Ian Robinson Machines First, Browsers Second <table> <tr> <td> <a href="http://localhost:38000/database-agent/001" rel="database-admin">001</a> </td> </tr> ... </table> <form class="install-database" method="POST" action="http://localhost:38000/database-agent/" enctype="application/x-www-form-urlencoded"> <input type="hidden" name="_redirect_" value="http://localhost:38000/database-agent/"></input> <input type="text" name="installUri"></input> <button type="submit" id="submit-form-install-database">Install</button> </form> Conven&on Fields with _underscores_ target the browser
  • 25. MILAN November 28th/29th, 2014 – Ian Robinson POST /database-agent installUri=file:///neo4j-enterprise-2.1.5-unix.tar.gz Client Database Agent ProgrammaBc Client 201 CREATED Location: /database-agent/001/
  • 26. MILAN November 28th/29th, 2014 – Ian Robinson Database Agent Browser Client POST /database-agent installUri=file:///neo4j-enterprise-2.1.5-unix.tar.gz _redirect_=/database-agent 303 SEE OTHER Location: /database-agent GET/database-agent 200 OK Content-Type: text/html
  • 27. MILAN November 28th/29th, 2014 – Ian Robinson 3. Long-­‐Running Processes • Request triggers long-­‐running operaBon (e.g. backup) • Client waits for response: • What happens if the connecBon breaks?
  • 28. MILAN November 28th/29th, 2014 – Ian Robinson 202 Accepted • Indicates request has been accepted for processing • Response includes URI of status monitor • Client polls status monitor
  • 29. MILAN November 28th/29th, 2014 – Ian Robinson Client Database Agent 202 Accepted POST /database-agent/001/stores installUri=s3://.../graph.db.zip 202 ACCEPTED Location: /database-agent/jobs/3e4d0 GET /database-agent/jobs/3e4d0 202 ACCEPTED Location: /database-agent/jobs/3e4d0 GET /database-agent/jobs/3e4d0 201 CREATED Location: /database-agent/002/stores/graph.db Install Store
  • 30. MILAN November 28th/29th, 2014 – Ian Robinson Polling Demo
  • 31. MILAN November 28th/29th, 2014 – Ian Robinson 4. Client-­‐Side OrchestraBon Neo-­‐Workbench Java APIs Command-­‐Line Tools Tests (e.g. Soak Tests) Servers Clients Sequential = Slow 1. Install Database 1 2. Install Database 2 3. Install Database 3 4. Upload Store 1-A 5. Upload Store 2-A 6. Upload Store 3-A 7. Start Database 1 8. Start Database 2 9. Start Database 3 10. etc…
  • 32. MILAN November 28th/29th, 2014 – Ian Robinson Client Database Agent Database Agent Database Agent Install Database Install Database Install Database Upload Dataset Upload Dataset Upload Dataset
  • 33. MILAN November 28th/29th, 2014 – Ian Robinson ReacBve Extensions Iterables Observables Synchronous Asynchronous Pull Push for ( Integer integer : stats.counters() ) { System.out.println( integer ); } stats.counters().subscribe( new Action1<Integer>() { @Override public void call( Integer integer ) { System.out.println( integer ); } }); h^ps://github.com/Ne`lix/RxJava/wiki
  • 34. MILAN November 28th/29th, 2014 – Ian Robinson new StartCluster() .execute( cluster ) .subscribe( new Action1<URI>() { @Override public void call( URI uri ) { System.out.println( format( "Database started: %s", uri ) ); } } ); Client-­‐Side OrchestraBon
  • 35. MILAN November 28th/29th, 2014 – Ian Robinson new StartCluster() .execute( cluster ) .subscribe( new Action1<URI>() { @Override public void call( URI uri ) { System.out.println( format( "Database started: %s", uri ) ); } } ); Client-­‐Side OrchestraBon
  • 36. MILAN November 28th/29th, 2014 – Ian Robinson 5. Bookmark ApplicaBon State { "estate" : { "estateId" : "est51b65", "owner" : "neo-workbench", "scenario" : "soak-test", "blocks" : [ { "blockId" : "blke16a8", "name" : "db-cluster", "size" : 3, "machines" : [ { "id" : "mace5508", "publicIpAddress" : "127.0.0.1", "publicDnsName" : "localhost", "links" : [ { "rel" : "database-agent", "uri" : "http://localhost:38001/database-agent" }, { "rel" : "database-admin", "uri" : "http://localhost:38001/database-agent/003" }, { "rel" : "database", "uri" : "http://localhost:7475" } ],
  • 37. MILAN November 28th/29th, 2014 – Ian Robinson 5. Bookmark ApplicaBon State { "estate" : { "estateId" : "est51b65", "owner" : "neo-workbench", "scenario" : "soak-test", "blocks" : [ { "blockId" : "blke16a8", "name" : "db-cluster", "size" : 3, "machines" : [ { "id" : "mace5508", "publicIpAddress" : "127.0.0.1", "publicDnsName" : "localhost", "links" : [ { "rel" : "database-agent", "uri" : "http://localhost:38001/database-agent" }, { "rel" : "database-admin", "uri" : "http://localhost:38001/database-agent/003" }, { "rel" : "database", "uri" : "http://localhost:7475" } ],
  • 38. MILAN November 28th/29th, 2014 – Ian Robinson 6. Automate Deployment Load Database Results
  • 39. MILAN November 28th/29th, 2014 – Ian Robinson Automated Provisioning Provisioning API AWS CloudFormation SDK Local Provisioning Provider Vagrant Azure SDK
  • 40. MILAN November 28th/29th, 2014 – Ian Robinson Fluent API Estate estate = new Estate() .addBlock( new Block<>( "results", 1, ResultsServiceConfig.DEFAULT, AwsPlatformConfig.DEFAULT ) .addBlock( new Block<>( "db-cluster", 3, DatabaseAgentConfig.builder().withPackageDownloadUri( URI.create( "http://dist.neo4j.org/neo4j-enterprise-2.1.2-unix.tar.gz" ) ).build(), AwsPlatformConfig.DEFAULT ) ) .addBlock( new Block<>( "load-generator", 1, LoadGeneratorConfig.DEFAULT, LocalPlatformConfig.DEFAULT ) ); EstateProvisioning provisioning = new EstateProvisioning(); provisioning.provision( estate );
  • 41. MILAN November 28th/29th, 2014 – Ian Robinson Graphite Block in AWS Estate estate = new Estate() .addBlock( new Block<>( "results", 1, ResultsServiceConfig.DEFAULT, AwsPlatformConfig.DEFAULT ) .addBlock( new Block<>( "db-cluster", 3, DatabaseAgentConfig.builder().withPackageDownloadUri( URI.create( "http://dist.neo4j.org/neo4j-enterprise-2.1.2-unix.tar.gz" ) ).build(), AwsPlatformConfig.DEFAULT ) ) .addBlock( new Block<>( "load-generator", 1, LoadGeneratorConfig.DEFAULT, LocalPlatformConfig.DEFAULT ) ); EstateProvisioning provisioning = new EstateProvisioning(); provisioning.provision( estate );
  • 42. MILAN November 28th/29th, 2014 – Ian Robinson Database Block in AWS Estate estate = new Estate() .addBlock( new Block<>( "results", 1, ResultsServiceConfig.DEFAULT, AwsPlatformConfig.DEFAULT ) .addBlock( new Block<>( "db-cluster", 3, DatabaseAgentConfig.builder().withPackageDownloadUri( URI.create( "http://dist.neo4j.org/neo4j-enterprise-2.1.2-unix.tar.gz" ) ).build(), AwsPlatformConfig.DEFAULT ) ) .addBlock( new Block<>( "load-generator", 1, LoadGeneratorConfig.DEFAULT, LocalPlatformConfig.DEFAULT ) ); EstateProvisioning provisioning = new EstateProvisioning(); provisioning.provision( estate );
  • 43. MILAN November 28th/29th, 2014 – Ian Robinson Local Load Generator Block Estate estate = new Estate() .addBlock( new Block<>( "results", 1, ResultsServiceConfig.DEFAULT, AwsPlatformConfig.DEFAULT ) .addBlock( new Block<>( "db-cluster", 3, DatabaseAgentConfig.builder().withPackageDownloadUri( URI.create( "http://dist.neo4j.org/neo4j-enterprise-2.1.2-unix.tar.gz" ) ).build(), AwsPlatformConfig.DEFAULT ) ) .addBlock( new Block<>( "load-generator", 1, LoadGeneratorConfig.DEFAULT, LocalPlatformConfig.DEFAULT ) ); EstateProvisioning provisioning = new EstateProvisioning(); provisioning.provision( estate );
  • 44. MILAN November 28th/29th, 2014 – Ian Robinson Fluent API Estate estate = new Estate() .addBlock( new Block<>( "results", 1, ResultsServiceConfig.DEFAULT, AwsPlatformConfig.DEFAULT ) .addBlock( new Block<>( "db-cluster", 3, DatabaseAgentConfig.builder().withPackageDownloadUri( URI.create( "http://dist.neo4j.org/neo4j-enterprise-2.1.2-unix.tar.gz" ) ).build(), AwsPlatformConfig.DEFAULT ) ) .addBlock( new Block<>( "load-generator", 1, LoadGeneratorConfig.DEFAULT, LocalPlatformConfig.DEFAULT ) ); EstateProvisioning provisioning = new EstateProvisioning(); provisioning.provision( estate );
  • 45. MILAN November 28th/29th, 2014 – Ian Robinson Compliments of Neo Technology Graph Databases Ian Robinson, h Jim Webber & Emil Eifrem @iansrobinson
  • 46. MILAN November 28th/29th, 2014 – Ian Robinson Database Agent Soak Test Database Agent Database Agent Load Server Results Server Graphite Graphite Database Cluster Estate Workload