Slide 1

Slide 1 text

SERVERLESS SWIFT WITH OPENWHISK JAMES THOMAS, IBM @THOMASJ

Slide 2

Slide 2 text

SERVERS KILL YOUR PRODUCTIVITY @THOMASJ

Slide 3

Slide 3 text

WHAT CAN WE DO? @THOMASJ

Slide 4

Slide 4 text

Introducing… SERVERLESS PLATFORMS @THOMASJ

Slide 5

Slide 5 text

“RUNS CODE IN RESPONSE TO EVENTS, MANAGES COMPUTE RESOURCES” …WHY IS THIS DIFFERENT? @THOMASJ

Slide 6

Slide 6 text

FUNCTIONS-AS-A-SERVICE @THOMASJ

Slide 7

Slide 7 text

SCALING: 0 to N @THOMASJ

Slide 8

Slide 8 text

PAY-AS-YOU-GO flickr photo by a loves dc https://flickr.com/photos/alovesdc/3466740007 CC (BY) license @THOMASJ

Slide 9

Slide 9 text

ENOUGH TALKING…
 SHOW ME THE CODE. @THOMASJ

Slide 10

Slide 10 text

PROVIDERS @THOMASJ

Slide 11

Slide 11 text

@THOMASJ

Slide 12

Slide 12 text

OPEN SOURCE @THOMASJ

Slide 13

Slide 13 text

RUNTIMES @THOMASJ

Slide 14

Slide 14 text

} guard let amount = args["amount"] as? Int else { return [ "error": "Missing mandatory argument: amount" ] } guard let prices = currentBitcoinPricesJson() else { return [ "error": "Unable to retrieve Bitcoin prices" ] } guard let rate = prices["bpi"][currency]["rate_float"].double else { return [ "error": "Currency not listed in Bitcoin prices" ] } let converted = Double(amount) / rate let bitcoins = converted.truncate(places: 6) return ["amount": bitcoins, "label": "\(amount) \(currency) is worth \ (bitcoins) bitcoins."] } my_code.swift @THOMASJ

Slide 15

Slide 15 text

func main(args: [String:Any]) -> [String:Any] { if let name = args["name"] as? String { return [ "greeting" : "Hello \(name)!" ] } else { return [ "greeting" : "Hello anonymous!" ] } } Entry Point Event Parameters Service Response Swift 3

Slide 16

Slide 16 text

struct Person: Codable { let name: String? } struct Message: Codable { let greeting: String } func main(p: Person, callback: (Message?, Error?) -> Void) -> Void { if let name = p.name { callback(Message(greeting: "Hello \(name)"), nil) } else { callback(Message(greeting: "Hello anonymous!"), nil) } } Swift 4 Event Parameters Service Result Callback Response

Slide 17

Slide 17 text

ACTIONS @THOMASJ

Slide 18

Slide 18 text

Platform API HTTP Request Microservice @THOMASJ

Slide 19

Slide 19 text

$ wsk action create —help create a new action Usage: wsk action create ACTION_NAME ACTION [flags] Flags: --web string treat ACTION as a web action
 @THOMASJ

Slide 20

Slide 20 text

Platform API HTTP Request Microservice @THOMASJ

Slide 21

Slide 21 text

WHAT ABOUT… API ROUTING? 
 RATE LIMITING? AUTHENTICATION? DEPLOYMENTS? @THOMASJ

Slide 22

Slide 22 text

Platform API API Gateway Microservice @THOMASJ

Slide 23

Slide 23 text

TRIGGERS @THOMASJ

Slide 24

Slide 24 text

External Events Trigger @THOMASJ

Slide 25

Slide 25 text

EVENT SOURCES @THOMASJ

Slide 26

Slide 26 text

Rules Rules @THOMASJ

Slide 27

Slide 27 text

CHALLENGES @THOMASJ

Slide 28

Slide 28 text

“WARM” vs “COLD” ⛄ @THOMASJ

Slide 29

Slide 29 text

$ time wsk action invoke bitcoin -p amount 1000 -p currency USD -r { "amount": 0.246287, "label": "1000.0 USD is worth 0.246287 bitcoins." } real 0m4.638s user 0m0.095s sys 0m0.054s
 $ time wsk action invoke bitcoin -p amount 1000 -p currency USD -r { "amount": 0.246287, "label": "1000.0 USD is worth 0.246287 bitcoins." } real 0m1.003s user 0m0.093s sys 0m0.045s @THOMASJ

Slide 30

Slide 30 text

$ time wsk action invoke … { "amount": 0.246287, "label": “...” } real 0m4.638s user 0m0.095s sys 0m0.054s ——> start container ——> inject code ——> swift build ——> call main() ——> pause container $ time wsk action invoke … { "amount": 0.246287, "label": “...” } real 0m1.003s user 0m0.093s sys 0m0.045s ——> resume container ——> inject code ——> swift build ——> call main() ——> pause container @THOMASJ

Slide 31

Slide 31 text

$ time wsk action invoke … { "amount": 0.246287, "label": “...” } real 0m1.438s user 0m0.095s sys 0m0.054s ——> start container ——> inject code ——> swift build ——> call main() ——> pause container $ time wsk action invoke … { "amount": 0.246287, "label": “...” } real 0m1.003s user 0m0.093s sys 0m0.045s ——> resume container ——> inject code ——> swift build ——> call main() ——> pause container @THOMASJ

Slide 32

Slide 32 text

COMPUTE LIMITS flickr photo by zund https://flickr.com/photos/zund/12202485675 CC (BY-NC-ND) license @THOMASJ

Slide 33

Slide 33 text

@THOMASJ

Slide 34

Slide 34 text

SERVERS KILL YOUR PRODUCTIVITY @THOMASJ

Slide 35

Slide 35 text

FIRE YOUR SERVERS + = UPGRADE PRODUCTIVITY @THOMASJ

Slide 36

Slide 36 text

http://bit.ly/burn_your_servers slack.openwhisk.org #openwhisk @thomasj or @openwhisk

Slide 37

Slide 37 text

QUESTIONS? @THOMASJ