Download - In process-REST
![Page 1: In process-REST](https://reader031.vdocuments.us/reader031/viewer/2022022410/58e51f1f1a28ab624e8b58fd/html5/thumbnails/1.jpg)
In-process RESTMarcel Weiher @mpweiher
![Page 2: In process-REST](https://reader031.vdocuments.us/reader031/viewer/2022022410/58e51f1f1a28ab624e8b58fd/html5/thumbnails/2.jpg)
In-process REST
Simplify code by applying REST principles
![Page 3: In process-REST](https://reader031.vdocuments.us/reader031/viewer/2022022410/58e51f1f1a28ab624e8b58fd/html5/thumbnails/3.jpg)
In-process REST
Simplify code by applying REST principles
without distribution
![Page 4: In process-REST](https://reader031.vdocuments.us/reader031/viewer/2022022410/58e51f1f1a28ab624e8b58fd/html5/thumbnails/4.jpg)
SportStats
Polymorphic Identifiers / Objective-Smalltalk
Wunderlist
In-process REST
![Page 5: In process-REST](https://reader031.vdocuments.us/reader031/viewer/2022022410/58e51f1f1a28ab624e8b58fd/html5/thumbnails/5.jpg)
In-process REST
SportStats
Polymorphic Identifiers / Objective-Smalltalk
Wunderlist
![Page 6: In process-REST](https://reader031.vdocuments.us/reader031/viewer/2022022410/58e51f1f1a28ab624e8b58fd/html5/thumbnails/6.jpg)
BBC SportStats
XML Provider → BBC web-site (Ceefax, Mobile)
Fixtures, Live Scores/Coverage, Results, Tables
Replace existing system
![Page 7: In process-REST](https://reader031.vdocuments.us/reader031/viewer/2022022410/58e51f1f1a28ab624e8b58fd/html5/thumbnails/7.jpg)
BBC SportStats: Before
Slow
Lots of machines
>100 processes
Fragile
No traceability
![Page 8: In process-REST](https://reader031.vdocuments.us/reader031/viewer/2022022410/58e51f1f1a28ab624e8b58fd/html5/thumbnails/8.jpg)
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](https://reader031.vdocuments.us/reader031/viewer/2022022410/58e51f1f1a28ab624e8b58fd/html5/thumbnails/9.jpg)
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](https://reader031.vdocuments.us/reader031/viewer/2022022410/58e51f1f1a28ab624e8b58fd/html5/thumbnails/10.jpg)
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](https://reader031.vdocuments.us/reader031/viewer/2022022410/58e51f1f1a28ab624e8b58fd/html5/thumbnails/11.jpg)
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](https://reader031.vdocuments.us/reader031/viewer/2022022410/58e51f1f1a28ab624e8b58fd/html5/thumbnails/12.jpg)
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](https://reader031.vdocuments.us/reader031/viewer/2022022410/58e51f1f1a28ab624e8b58fd/html5/thumbnails/13.jpg)
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](https://reader031.vdocuments.us/reader031/viewer/2022022410/58e51f1f1a28ab624e8b58fd/html5/thumbnails/14.jpg)
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](https://reader031.vdocuments.us/reader031/viewer/2022022410/58e51f1f1a28ab624e8b58fd/html5/thumbnails/15.jpg)
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](https://reader031.vdocuments.us/reader031/viewer/2022022410/58e51f1f1a28ab624e8b58fd/html5/thumbnails/16.jpg)
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](https://reader031.vdocuments.us/reader031/viewer/2022022410/58e51f1f1a28ab624e8b58fd/html5/thumbnails/17.jpg)
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](https://reader031.vdocuments.us/reader031/viewer/2022022410/58e51f1f1a28ab624e8b58fd/html5/thumbnails/18.jpg)
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](https://reader031.vdocuments.us/reader031/viewer/2022022410/58e51f1f1a28ab624e8b58fd/html5/thumbnails/19.jpg)
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](https://reader031.vdocuments.us/reader031/viewer/2022022410/58e51f1f1a28ab624e8b58fd/html5/thumbnails/20.jpg)
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](https://reader031.vdocuments.us/reader031/viewer/2022022410/58e51f1f1a28ab624e8b58fd/html5/thumbnails/21.jpg)
BBC SportStats Stringly referenced
![Page 22: In process-REST](https://reader031.vdocuments.us/reader031/viewer/2022022410/58e51f1f1a28ab624e8b58fd/html5/thumbnails/22.jpg)
SportStats
Polymorphic Identifiers / Objective-Smalltalk
Wunderlist
In-process REST
![Page 23: In process-REST](https://reader031.vdocuments.us/reader031/viewer/2022022410/58e51f1f1a28ab624e8b58fd/html5/thumbnails/23.jpg)
Objective-Smalltalk & Polymorphic Identifiers
Objective-Smalltalk: Architectural Programming
Stringly-referenced programming: everywhere
Polymorphic Identifiers: custom identifiers / URIs in programs
![Page 24: In process-REST](https://reader031.vdocuments.us/reader031/viewer/2022022410/58e51f1f1a28ab624e8b58fd/html5/thumbnails/24.jpg)
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](https://reader031.vdocuments.us/reader031/viewer/2022022410/58e51f1f1a28ab624e8b58fd/html5/thumbnails/25.jpg)
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](https://reader031.vdocuments.us/reader031/viewer/2022022410/58e51f1f1a28ab624e8b58fd/html5/thumbnails/26.jpg)
Polymorphic Identifiers
html ← http://www.amazon.com/ file:/tmp/{name} ← “Hello World”
textField/intValue ← defaults:celsius
![Page 27: In process-REST](https://reader031.vdocuments.us/reader031/viewer/2022022410/58e51f1f1a28ab624e8b58fd/html5/thumbnails/27.jpg)
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](https://reader031.vdocuments.us/reader031/viewer/2022022410/58e51f1f1a28ab624e8b58fd/html5/thumbnails/28.jpg)
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](https://reader031.vdocuments.us/reader031/viewer/2022022410/58e51f1f1a28ab624e8b58fd/html5/thumbnails/29.jpg)
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](https://reader031.vdocuments.us/reader031/viewer/2022022410/58e51f1f1a28ab624e8b58fd/html5/thumbnails/30.jpg)
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](https://reader031.vdocuments.us/reader031/viewer/2022022410/58e51f1f1a28ab624e8b58fd/html5/thumbnails/31.jpg)
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](https://reader031.vdocuments.us/reader031/viewer/2022022410/58e51f1f1a28ab624e8b58fd/html5/thumbnails/32.jpg)
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](https://reader031.vdocuments.us/reader031/viewer/2022022410/58e51f1f1a28ab624e8b58fd/html5/thumbnails/33.jpg)
SportStats
Polymorphic Identifiers / Objective-Smalltalk
Wunderlist
In-process REST
![Page 34: In process-REST](https://reader031.vdocuments.us/reader031/viewer/2022022410/58e51f1f1a28ab624e8b58fd/html5/thumbnails/34.jpg)
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](https://reader031.vdocuments.us/reader031/viewer/2022022410/58e51f1f1a28ab624e8b58fd/html5/thumbnails/35.jpg)
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](https://reader031.vdocuments.us/reader031/viewer/2022022410/58e51f1f1a28ab624e8b58fd/html5/thumbnails/36.jpg)
Wunderlist
Model(REST-Server)
BackendServers
Persistence
UI
URI-Queue URI-Queue
URI-Queue
![Page 37: In process-REST](https://reader031.vdocuments.us/reader031/viewer/2022022410/58e51f1f1a28ab624e8b58fd/html5/thumbnails/37.jpg)
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](https://reader031.vdocuments.us/reader031/viewer/2022022410/58e51f1f1a28ab624e8b58fd/html5/thumbnails/38.jpg)
In-process REST Wunderlist 3
Reliability: 10x
Performance: animations, 60 fps under heavy load
Simplicity
But…
![Page 39: In process-REST](https://reader031.vdocuments.us/reader031/viewer/2022022410/58e51f1f1a28ab624e8b58fd/html5/thumbnails/39.jpg)
In-process REST Wunderlist UI Code
23%
77%
Clean?
ios+mac core/sdk/etc
![Page 40: In process-REST](https://reader031.vdocuments.us/reader031/viewer/2022022410/58e51f1f1a28ab624e8b58fd/html5/thumbnails/40.jpg)
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](https://reader031.vdocuments.us/reader031/viewer/2022022410/58e51f1f1a28ab624e8b58fd/html5/thumbnails/41.jpg)
In-process REST Wunderlist UI
Generic views: parametrised with URI
Controllers
Model: composite stores evaluate URIs
![Page 42: In process-REST](https://reader031.vdocuments.us/reader031/viewer/2022022410/58e51f1f1a28ab624e8b58fd/html5/thumbnails/42.jpg)
In-process REST Wunderlist UI
Generic views: parametrised with URI
Model: composite stores evaluate URIs
![Page 43: In process-REST](https://reader031.vdocuments.us/reader031/viewer/2022022410/58e51f1f1a28ab624e8b58fd/html5/thumbnails/43.jpg)
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](https://reader031.vdocuments.us/reader031/viewer/2022022410/58e51f1f1a28ab624e8b58fd/html5/thumbnails/44.jpg)
In-process REST Wunderlist UI
Client-specific UI code reduced by at least 10x
Virtually no glue code
MVc
![Page 45: In process-REST](https://reader031.vdocuments.us/reader031/viewer/2022022410/58e51f1f1a28ab624e8b58fd/html5/thumbnails/45.jpg)
In-process REST: Q&AURIs + storage
Reduces code (10x-20x)
Language support
Friday 15:50: Reactive Dataflow Constraints
http://objective.st/ @mpweiher