in process-rest

Post on 05-Apr-2017

147 Views

Category:

Software

0 Downloads

Preview:

Click to see full reader

TRANSCRIPT

In-process RESTMarcel Weiher @mpweiher

In-process REST

Simplify code by applying REST principles

In-process REST

Simplify code by applying REST principles

without distribution

SportStats

Polymorphic Identifiers / Objective-Smalltalk

Wunderlist

In-process REST

In-process REST

SportStats

Polymorphic Identifiers / Objective-Smalltalk

Wunderlist

BBC SportStats

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

Fixtures, Live Scores/Coverage, Results, Tables

Replace existing system

BBC SportStats: Before

Slow

Lots of machines

>100 processes

Fragile

No traceability

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

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

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

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

BBC SportStats Generator URLs

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

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

machine process

page-type arguments

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)

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)

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)

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

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

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

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

BBC SportStats Reflection

Simplified: “forgot” to implement the DB

Simplified: from SOA to REST

Simplified: REST servers brought In-process

Simplicity, performance, reliability, …

But…

BBC SportStats Stringly referenced

SportStats

Polymorphic Identifiers / Objective-Smalltalk

Wunderlist

In-process REST

Objective-Smalltalk & Polymorphic Identifiers

Objective-Smalltalk: Architectural Programming

Stringly-referenced programming: everywhere

Polymorphic Identifiers: custom identifiers / URIs in programs

Objective-SmalltalkCustom connectors instead of fixed meta-level

Messaging → Higher Order Messages

Assignment → Dataflow and Constraints (Friday!)

Identifiers → Polymorphic Identifiers

http://objective.st

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

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

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

Polymorphic Identifiers

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

textField/intValue ← defaults:celsius

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

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.

Polymorphic Identifiers $HOME HTTP Server

#!/usr/local/bin/stsh

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

(source ! server) start:nil.

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.

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.

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

SportStats

Polymorphic Identifiers / Objective-Smalltalk

Wunderlist

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

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

Wunderlist

Model(REST-Server)

BackendServers

Persistence

UI

URI-Queue URI-Queue

URI-Queue

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

In-process REST Wunderlist 3

Reliability: 10x

Performance: animations, 60 fps under heavy load

Simplicity

But…

In-process REST Wunderlist UI Code

23%

77%

Clean?

ios+mac core/sdk/etc

In-process REST Wunderlist UI

Apple MVC: Massive ViewController

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

In-process REST Wunderlist UI

Generic views: parametrised with URI

Controllers

Model: composite stores evaluate URIs

In-process REST Wunderlist UI

Generic views: parametrised with URI

Model: composite stores evaluate URIs

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

In-process REST Wunderlist UI

Client-specific UI code reduced by at least 10x

Virtually no glue code

MVc

In-process REST: Q&AURIs + storage

Reduces code (10x-20x)

Language support

Friday 15:50: Reactive Dataflow Constraints

http://objective.st/ @mpweiher

top related