in process-rest

45
In-process REST Marcel Weiher @mpweiher

Upload: marcel-weiher

Post on 05-Apr-2017

147 views

Category:

Software


0 download

TRANSCRIPT

Page 1: In process-REST

In-process RESTMarcel Weiher @mpweiher

Page 2: In process-REST

In-process REST

Simplify code by applying REST principles

Page 3: In process-REST

In-process REST

Simplify code by applying REST principles

without distribution

Page 4: In process-REST

SportStats

Polymorphic Identifiers / Objective-Smalltalk

Wunderlist

In-process REST

Page 5: In process-REST

In-process REST

SportStats

Polymorphic Identifiers / Objective-Smalltalk

Wunderlist

Page 6: In process-REST

BBC SportStats

XML Provider → BBC web-site (Ceefax, Mobile)

Fixtures, Live Scores/Coverage, Results, Tables

Replace existing system

Page 7: In process-REST

BBC SportStats: Before

Slow

Lots of machines

>100 processes

Fragile

No traceability

Page 8: In process-REST

BBC SportStats v1 Architecture Diagram (SOA)

Populator

Sport DB(SQL)

DiskDirectory

Feed Ingest

FTPDirectory

Generator

Renderer

WebServer

Directory

pollpollpoll

HTTP GET (RPC URLs)

read

write

processes

storage

Page 9: In process-REST

BBC SportStats v1 Architecture Diagram (SOA)

Populator

Sport DB(SQL)

DiskDirectory

Feed Ingest

FTPDirectory

Generator

Renderer

WebServer

Directory

pollpollpoll

HTTP GET (RPC URLs)

read

write

processes

storage

Page 10: In process-REST

BBC SportStats v1 Architecture Diagram (SOA)

Populator

Sport DB(SQL)

DiskDirectory

Feed Ingest

FTPDirectory

Generator

Renderer

WebServer

Directory

pollpollpoll

HTTP GET (RPC URLs)

read

write

processes

storage

Page 11: In process-REST

BBC SportStats v1 Architecture Diagram (SOA)

Populator

Sport DB(SQL)

DiskDirectory

Feed Ingest

FTPDirectory

Generator

Renderer

WebServer

Directory

pollpollpoll

HTTP GET (RPC URLs)

read

write

processes

storage

Page 12: In process-REST

BBC SportStats Generator URLs

/wa/SOLRugbyCompResultsSmall?Competition=7331&type=Competition

http://nolparser07/scripts/WebObjects.exe/SOLPageRenderer.woa

machine process

page-type arguments

Page 13: In process-REST

BBC SportStats RESTful re-imagining (µ-services)

Site Server

Site

Sport Server

SportData HTTP GET

Ingest/Generator/Populator

FTPDirectory

poll

WebServer

Directory

writeHTTP PUT HTTP GET (Document URLs)

Page 14: In process-REST

BBC SportStats RESTful re-imagining (µ-services)

Site Server

Site

Sport Server

SportData HTTP GET

Ingest/Generator/Populator

FTPDirectory

poll

WebServer

Directory

writeHTTP PUT HTTP GET (Document URLs)

Page 15: In process-REST

BBC SportStats RESTful re-imagining (µ-services)

Site Server

Site

Sport Server

SportData HTTP GET

Ingest/Generator/Populator

FTPDirectory

poll

WebServer

Directory

writeHTTP PUT HTTP GET (Document URLs)

Page 16: In process-REST

BBC SportStats v2 In-process REST

Sport:Football

SiteMap:Football

Site

siteUpdate(PUT)

FeedProcessors

FeedLoop andFeedTransaction

sportUpdate(PUT)

OutputBridge:HTML

GET

FTPDirectory

pollWeb

ServerDirectory

write

Page 17: In process-REST

BBC SportStats v2 In-process REST

Sport:Football

SiteMap:Football

Site

siteUpdate(PUT)

FeedProcessors

FeedLoop andFeedTransaction

sportUpdate(PUT)

OutputBridge:HTML

GET

FTPDirectory

pollWeb

ServerDirectory

write

Page 18: In process-REST

BBC SportStats v2 In-process REST

Sport:Football

SiteMap:Football

Site

siteUpdate(PUT)

FeedProcessors

FeedLoop andFeedTransaction

sportUpdate(PUT)

OutputBridge:HTML

GET

FTPDirectory

pollWeb

ServerDirectory

write

Page 19: In process-REST

BBC SportStats After

0

15

30

45

60

75

90

105

120

135

150

Sports Output Media KLOC Machines Processes Pages/s CPU % Failures/year

V1 V2

Code (KLOC): 45 vs 12

Sports: 4 vs 7

Output Media: 1 vs 3

Machines: 10 vs 1

Pages/s: 0.5 vs 150

Failuers/year: 52 vs 1

Page 20: In process-REST

BBC SportStats Reflection

Simplified: “forgot” to implement the DB

Simplified: from SOA to REST

Simplified: REST servers brought In-process

Simplicity, performance, reliability, …

But…

Page 21: In process-REST

BBC SportStats Stringly referenced

Page 22: In process-REST

SportStats

Polymorphic Identifiers / Objective-Smalltalk

Wunderlist

In-process REST

Page 23: In process-REST

Objective-Smalltalk & Polymorphic Identifiers

Objective-Smalltalk: Architectural Programming

Stringly-referenced programming: everywhere

Polymorphic Identifiers: custom identifiers / URIs in programs

Page 24: In process-REST

Objective-SmalltalkCustom connectors instead of fixed meta-level

Messaging → Higher Order Messages

Assignment → Dataflow and Constraints (Friday!)

Identifiers → Polymorphic Identifiers

http://objective.st

Page 25: In process-REST

Stringly-Referencedhtml = [NSData dataWithContentsOfURL:[NSURL URLWithString:@“http://www.amazon.com"];

[@“Hello World” writeToFile:[@“/tmp/ stringByAppendingPathComponent:name];

textField.intValue = [[NSDefaults standardUserDefaults] integerForKey:@“celsius”];

Page 26: In process-REST

Polymorphic Identifiers

html ← http://www.amazon.com/ file:/tmp/{name} ← “Hello World”

textField/intValue ← defaults:celsius

Page 27: In process-REST

Polymorphic Identifiers

schemehandlers file httpvar

web libweb server

stackslot[1]slot[2]slot[3]42

polymorphic identifier

value

2

reference

value(ref(identifier))

http: //deepthought.org/theAnswervar: theAnswer

server store

theAnswerslot[1]

slot[3]

42

value

deepthought.org/theAnswerreference

value(ref(identifier))

2

1

3

4

1

2

3

4

Page 28: In process-REST

Polymorphic Identifiers Http Server Example 1

#!/usr/local/bin/stsh

scheme:site ← MemoryStore scheme.server ← SchemeHttpServer serverOnPort:8081site:/hi ← 'Hello World!'.

(scheme:site ! server) start:nil.

Page 29: In process-REST

Polymorphic Identifiers $HOME HTTP Server

#!/usr/local/bin/stsh

server ← SchemeHttpServer serverOnPort:8081source ← ref:file:{env:HOME}/Sites asScheme.

(source ! server) start:nil.

Page 30: In process-REST

Polymorphic Identifiers $HOME HTTP Server, Cached

#!/usr/local/bin/stsh

server ← SchemeHttpServer serverOnPort:8081source ← ref:file:{env:HOME}/Sites asScheme.cache ← MemoryStore scheme.

(source ! cache ! server) start:nil.

Page 31: In process-REST

Polymorphic Identifiers $HOME HTTP Server, Cached

#!/usr/local/bin/stsh

server ← SchemeHttpServer serverOnPort:8081source ← ref:file:{env:HOME}/Sites asScheme.cache ← MemoryStore scheme.

(source ! cache ! server) start:nil.

Page 32: In process-REST

Polymorphic Identifiers Storage Combinators

Cache: caches one scheme using another

Sequential: searches a list of schemes

Filter: transforms identifiers and/or values

Switcher: use one of a set of schemes

Page 33: In process-REST

SportStats

Polymorphic Identifiers / Objective-Smalltalk

Wunderlist

In-process REST

Page 34: In process-REST

In-process REST Wunderlist

Task management application

Native clients for iOS, Mac, Android, Windows + Web

5 million active users

Acquired 2015 by Microsoft

Page 35: In process-REST

In-process REST Wunderlist

URIs (ObjectReference) refer to model objects

URIs can reference non-existent objects

URIs can be persisted

URIs are structured:

wlstore:task/container/1/object/1wlstore:task/container/1

Page 36: In process-REST

Wunderlist

Model(REST-Server)

BackendServers

Persistence

UI

URI-Queue URI-Queue

URI-Queue

Page 37: In process-REST

URI-Queues

A queue of references

Asynchronous

Persistable (network)

Uniqued (network)

“Bucketized” (storage)

Dynamic coalescing/throttling (UI)

Model(REST-Server)

BackendServers

Persistence

UI

URI-Queue URI-Queue

URI-Queue

Page 38: In process-REST

In-process REST Wunderlist 3

Reliability: 10x

Performance: animations, 60 fps under heavy load

Simplicity

But…

Page 39: In process-REST

In-process REST Wunderlist UI Code

23%

77%

Clean?

ios+mac core/sdk/etc

Page 40: In process-REST

In-process REST Wunderlist UI

Apple MVC: Massive ViewController

Glue code: C is unique for every combination of V + M

Page 41: In process-REST

In-process REST Wunderlist UI

Generic views: parametrised with URI

Controllers

Model: composite stores evaluate URIs

Page 42: In process-REST

In-process REST Wunderlist UI

Generic views: parametrised with URI

Model: composite stores evaluate URIs

Page 43: In process-REST

In-process REST Wunderlist Store Hierarchy

core

id-redirector

UI notifications

switcher1 filter

suggestions

sidebar

day

timeline

search

caching store

switcher2

memory-store

json-store

microsoft-manager

disk-store

Page 44: In process-REST

In-process REST Wunderlist UI

Client-specific UI code reduced by at least 10x

Virtually no glue code

MVc

Page 45: In process-REST

In-process REST: Q&AURIs + storage

Reduces code (10x-20x)

Language support

Friday 15:50: Reactive Dataflow Constraints

http://objective.st/ @mpweiher