Serverless by Example: Building a Real-Time Chat System

Post on 21-Jan-2018

342 views 3 download

Transcript of Serverless by Example: Building a Real-Time Chat System

© 2017, Amazon Web Services, Inc. or its Affiliates. All rights reserved.

Danilo Poccia, Technical Evangelist

danilop@amazon.com

Serverless by Example: Building A Real-Time Chat System

@danilopdanilop

“Where” is Serverless?

Client Back End

AWS Lambda

CDNClient Back End Devices

Sensors

Actuators

AWS Lambda

Gateway

AWS Greengrass

Lambda Functions on a Raspberry Pi

AWS Greengrass

Lambda Function

AWS Snowball Edge100TB + Greengrass Core (≃ EC2 m4.4xlarge instance)

Snowball Edge Use Cases

“Snowball Edge enables us to extend the innovative capabilities of HealthSuite, our cloud-enabled connected health ecosystem of devices, applications and digital tools supported by AWS, even when there is no network support.”

Embedded Applications

—Dale Wiggins, Business Leader, HealthSuite digital platform,

Philips

Snowball Edge Use Cases

“With AWS Snowball Edge, we can now collect 100 TB of data with no intermediate steps, and we can also analyze the images immediately using the onboard compute capabilities.”

Remote Locations for data collection and analysis

— Bob Cowen, Director of Hatfield Marine Research Center,

Oregon State University

AWS Lambda@Edge

Customize content delivery while reducing load on the origin

Events / Triggers

Take serverless to your users

Lambda@Edge Use Cases

Demo build of a CloudFront+S3 distribution,

using Lambda@Edge to secure its HTTP headers

Lambda@Edge Use Cases

These processes include applying transactional labels to purchases so

Blockbuster can track customer activity, and providing personalized recommendations

based on previous purchases.

Blockbuster runs serverless compute processes across AWS Regions and

Amazon CloudFront edge locations (using Lambda@Edge) without provisioning or

managing servers.

Let’s build a Web Chat…

Web Browser

Web Browser

CloudFront Edge Location

S3 Bucket

HTTPS

Static Content (HTML, CSS, JS)

Web Browser

CloudFront Edge Location

S3 Bucket

HTTPS

Amazon Cognito

Authentication (AWS Temporary

Credentials)Static Content

(HTML, CSS, JS)

Web Browser

CloudFront Edge Location

S3 Bucket

Amazon API Gateway

Lambda Function(s)

DynamoDB Table(s)

HTTPS Dynamic Content

Database Access

Execute Functions

Amazon Cognito

Authentication (AWS Temporary

Credentials)Static Content

(HTML, CSS, JS)

Let’s make it more interactive…

Web Browser

CloudFront Edge Location

S3 Bucket

Amazon API Gateway

Lambda Function(s)

DynamoDB Table(s)

AWS IoT Topic(s)

HTTPS Dynamic Content

Database Access

MQTT over Secure WebSockets (Publish, Subscribe)

Execute Functions

Amazon Cognito

Authentication (AWS Temporary

Credentials)Static Content

(HTML, CSS, JS)

Web Browser

CloudFront Edge Location

S3 Bucket

Amazon API Gateway

Lambda Function(s)

DynamoDB Table(s)

AWS IoT Topic(s) AWS IoT

Rule(s)

HTTPS Dynamic Content

Database Access

MQTT over Secure WebSockets (Publish, Subscribe)

Subscribe

Republish

Execute Functions

Amazon Cognito

Authentication (AWS Temporary

Credentials)Static Content

(HTML, CSS, JS)

Web Browser

CloudFront Edge Location

S3 Bucket

Amazon API Gateway

Lambda Function(s)

DynamoDB Table(s)

AWS IoT Topic(s) AWS IoT

Rule(s)

HTTPS Dynamic Content

Database Access

MQTT over Secure WebSockets (Publish, Subscribe)

Subscribe

Republish

Execute Functions

Execute Functions

Amazon Cognito

Authentication (AWS Temporary

Credentials)Static Content

(HTML, CSS, JS)

Publish

Web Browser

CloudFront Edge Location

S3 Bucket

Amazon API Gateway

Lambda Function(s)

DynamoDB Table(s)

AWS IoT Topic(s) AWS IoT

Rule(s)

HTTPS Dynamic Content

Database Access

MQTT over Secure WebSockets (Publish, Subscribe)

Subscribe

Republish

Execute Functions

Write to DynamoDB

Execute Functions

Amazon Cognito

Authentication (AWS Temporary

Credentials)Static Content

(HTML, CSS, JS)

Publish

Web Browser

CloudFront Edge Location

S3 Bucket

Amazon API Gateway

Lambda Function(s)

DynamoDB Table(s)

AWS IoT Topic(s) AWS IoT

Rule(s)

Kinesis Stream(s)

HTTPS Dynamic Content

Database Access

MQTT over Secure WebSockets (Publish, Subscribe)

Subscribe

Republish

Execute Functions

Streaming Data

Write to DynamoDB

Execute Functions

Execute Functions

(Micro-Batches)

Amazon Cognito

Authentication (AWS Temporary

Credentials)Static Content

(HTML, CSS, JS)

Publish

Web Browser

CloudFront Edge Location

S3 Bucket

Amazon API Gateway

Lambda Function(s)

DynamoDB Table(s)

AWS IoT Topic(s) AWS IoT

Rule(s)

Kinesis Stream(s)

HTTPS Dynamic Content

Database Access

MQTT over Secure WebSockets (Publish, Subscribe)

Subscribe

Republish

Execute Functions

Streaming Data

Write to DynamoDB

Execute Functions

Execute Functions

(Micro-Batches)

Amazon Cognito

Authentication (AWS Temporary

Credentials)Static Content

(HTML, CSS, JS)

Publish

What about Topics & Rules?

Web Browser

AWS IoT Topics

chat/in/${iot:ClientId}

chat/out

chat/pub/${room}

chat/stream

$aws/events/#

Each client has a secure “input” topic to receive content from the back end

All client can publish on an “output” topic, they are recognizable by their clientId

All client can subscribe and receive from “public” topics

Another “output” topic optimized for high volumes

AWS IoT Lifecycle Events

Web Browser

AWS IoT Topics

AWS IoT Rules

chat/in/${iot:ClientId}

chat/out

chat/pub/${room}

chat/stream

$aws/events/#

Each client has a secure “input” topic to receive content from the back end

All client can publish on an “output” topic, they are recognizable by their clientId

All client can subscribe and receive from “public” topics

Another “output” topic optimized for high volumes

AWS IoT Lifecycle Events

Lambda function to process important messages, such as a new client connection

Republish rule to send messages to the corresponding room public topic

Lambda function to process high volume dreaming data

Kinesis Stream to manage high volume streaming data

Lambda function to process AWS IoT Lifecycle Events

Store all messages in a database, to be sent to the client on connection

Web Browser

AWS IoT Topics

AWS IoT Rules

chat/in/${iot:ClientId}

chat/out

chat/pub/${room}

chat/stream

$aws/events/#

Each client has a secure “input” topic to receive content from the back end

All client can publish on an “output” topic, they are recognizable by their clientId

All client can subscribe and receive from “public” topics

Another “output” topic optimized for high volumes

AWS IoT Lifecycle Events

Lambda function to process important messages, such as a new client connection

Republish rule to send messages to the corresponding room public topic

Lambda function to process high volume dreaming data

Kinesis Stream to manage high volume streaming data

Lambda function to process AWS IoT Lifecycle Events

Store all messages in a database, to be sent to the client on connection

You can use this topic to inject JavaScript code

in the browser

So how does the flow look like?

Demo

https://chat.danilop.net/websummit

Code

https://github.com/danilop/serverless-chat

More Info

http://docs.aws.amazon.com/iot/latest/developerguide/protocols.html

http://docs.aws.amazon.com/iot/latest/developerguide/life-cycle-events.html

http://docs.aws.amazon.com/AWSJavaScriptSDK/latest/AWS/DynamoDB/DocumentClient.html

From Event-Driven Architectures…

…To Functional Programming?

Functional Programming

Transforming Data Using Expressions (Functions)

Without Side Effects

Immutable Data Pure Functions

Higher-Order Functions

From “Research Topics in Functional Programming” ed. D. Turner, Addison-Wesley, 1990, pp 17–42. 1

Why

Functional Programming

Matters

John HughesThe University, Glasgow

Abstract

As software becomes more and more complex, it is more and more

important to structure it well. Well-structured software is easy to write

and to debug, and provides a collection of modules that can be reused

to reduce future programming costs. In this paper we show that two fea-

tures of functional languages in particular, higher-order functions and lazy

evaluation, can contribute significantly to modularity. As examples, we

manipulate lists and trees, program several numerical algorithms, and im-

plement the alpha-beta heuristic (an algorithm from Artificial Intelligence

used in game-playing programs). We conclude that since modularity is the

key to successful programming, functional programming o↵ers important

advantages for software development.

1 Introduction

This paper is an attempt to demonstrate to the larger community of (non-functional) programmers the significance of functional programming, and alsoto help functional programmers exploit its advantages to the full by making itclear what those advantages are.

Functional programming is so called because its fundamental operation isthe application of functions to arguments. A main program itself is written asa function that receives the program’s input as its argument and delivers theprogram’s output as its result. Typically the main function is defined in terms ofother functions, which in turn are defined in terms of still more functions, untilat the bottom level the functions are language primitives. All of these functionsare much like ordinary mathematical functions, and in this paper they will be

1An earlier version of this paper appeared in the The Computer Journal , 32(2):98–107,

April 1989. Copyright belongs to The British Computer Society, who grant permission to

copy for educational purposes only without fee provided the copies are not made for direct

commercial advantage and this BCS copyright notice appears.

https://www.cs.kent.ac.uk/people/staff/dat/miranda/whyfp90.pdf

Let’s build a “Tag Cloud” from Your Pictures

images

getLabelsgroupBy

+ renderHtml

images

Amazon Rekognition

browser

Event-Driven ArchitectureLet’s build a “Tag Cloud” from Your Pictures

renderHtml(groupBy(getLabels([images])), htmlParams)

Functional ViewLet’s build a “Tag Cloud” from Your Pictures

renderHtml(groupBy(getLabels([images])), htmlParams)

Functional ViewLet’s build a “Tag Cloud” from Your Pictures

renderHtml(groupBy(getLabels([images])), htmlParams)

Functional ViewLet’s build a “Tag Cloud” from Your Pictures

renderHtml(groupBy(getLabels([images])), htmlParams)

Functional ViewLet’s build a “Tag Cloud” from Your Pictures

map(f, [x1, x2, …, xn]) = [f(x1), f(x2), …, f(xn)]

Higher-Order Functions

filter(f, [x1, x2, …, xn]) = [xi if f(xi) is true]

count([a, b, a, c, a, b]) = {a: 3, b: 2, c: 1}

renderHtml(groupBy(getLabels([images])), htmlParams)

renderHtml(count(map(getLabel, [images]))), htmlParams)

Reusable More reusable

Lambda Functions + Step Functions

Lambda Function

Input

State Machine

Outputtranslate create

executeTasks

State passing (Immutable Data)

Tasks are performed only if required (Lazy Evaluation)

A Lambda Function dynamically creating a State Machine executing the logic

Event-Driven Architectures +

Functional Programming +

Standard Serverless Library

Happy to get your feedback on this!

What is Serverless?

“Build and run applications

without thinking about servers”

© 2017, Amazon Web Services, Inc. or its Affiliates. All rights reserved.

Danilo Poccia, Technical Evangelist

danilop@amazon.com

Serverless by Example: Building A Real-Time Chat System

@danilopdanilop