83
Distributed Out of the Box! AWS Simple Workflow Serhiy Batyuk JEEConf May 21, 2016

AWS Simple Workflow: Distributed Out of the Box! - JEEConf 2016

Embed Size (px)

Citation preview

Distributed Out of the Box!AWS Simple Workflow

Serhiy Batyuk JEEConf

May 21, 2016

Tech Lead at

AWS SWF 1 year>

Agenda

SWF Overview

Agenda

SWF Overview Demo

Agenda

SWF Overview Demo Features

Agenda

SWF Overview Demo Features

Lessons Learnt

What Is AWS Simple Workflow?

AWS SWF Use Cases

https://www.youtube.com/watch?v=DYmJIQO2ZyQ&t=83

Media Processing Infrastructure Provisioning

Business ProcessesReport GenerationData Processing

https://globallogic.com.ua/speaking-event/jeeconf-2015

Preparing to Attend JEEConf

Preparing to Attend JEEConf

Preparing to Attend JEEConf

Preparing to Attend JEEConf

Preparing to Attend JEEConf

PROGRAM

STEPS

Preparing to Attend JEEConf

Preparing to Attend JEEConf

Preparing to Attend JEEConf

Preparing to Attend JEEConf

AWS SWF

https://aws.amazon.com/swf

Workflows and Activities

WORKFLOW

ACTIVITIES

SWF Application Architecture

WorkerDecider

SWF Application Architecture

WorkerDecider

AWS SWFAsync Async

History

SWF Application Architecture

WorkerDecider

AWS SWFAsync Async

AWS SWF

AWS SWF Message Flow

WorkerDecider

AWS SWF

AWS SWF Message Flow

WorkerDecider

START

AWS SWF

AWS SWF Message Flow

WorkerDecider

MAKE A DECISION

AWS SWFGET

HISTORY

AWS SWF Message Flow

WorkerDecider

AWS SWF

AWS SWF Message Flow

WorkerDecider

BUY TICKET

AWS SWF

AWS SWF Message Flow

WorkerDecider

BUY TICKET

AWS SWF

AWS SWF Message Flow

WorkerDecider

TICKET CONFIRMATION

AWS SWF

AWS SWF Message Flow

WorkerDecider

AWS SWF

AWS SWF Message Flow

WorkerDecider

MAKE A DECISION

AWS SWFGET

HISTORY

AWS SWF Message Flow

WorkerDecider

AWS SWF

AWS SWF Message Flow

WorkerDecider

BOOK HOTEL

AWS SWF

AWS SWF Message Flow

WorkerDecider

BOOK HOTEL

AWS SWF

AWS SWF Message Flow

WorkerDecider

HOTEL CONFIRMATION

AWS SWF

AWS SWF Message Flow

WorkerDecider

AWS SWF Flow Framework

AWS SWFSWF API

.Net, Python, others

SWF Flow Framework

Java, Ruby

Java Flow Framework

Workflow Worker

Decider

Workflow Implementation

Activities Client

Activities Worker

Worker

Activities Implementations

Workflow Starter

Client app

Workflow Client

SWF

http://docs.aws.amazon.com/amazonswf/latest/awsflowguide/awsflow-basics-application-structure.html

Java Flow Framework

Workflow Worker

Decider

Activities Client

Activities Worker

WorkerClient app

Workflow Client

SWF

http://docs.aws.amazon.com/amazonswf/latest/awsflowguide/awsflow-basics-application-structure.html

Java Flow Framework

Decider

Workflow Implementation

Worker

Activities Implementations

Workflow Starter

Client app

SWF

http://docs.aws.amazon.com/amazonswf/latest/awsflowguide/awsflow-basics-application-structure.html

Java Flow Framework Classes

@Activities

@Workflow Client to schedule workflows

Client to schedule activities

Java Flow Framework Classes

@Activities

@Workflow Client to schedule workflows

Client to schedule activities

WorkflowWorker

ActivitiesWorker

Handles decision tasks

Handles activity tasks

DemoSWF

Visit Organizer Workflow

Preparing for JEEConf

Visit Organizer

Service

JEEConf Service

Travel Service

Preparing for JEEConf

Visit Organizer

Service

JEEConf Service

Travel Service

Buy tickets

Preparing for JEEConf

Visit Organizer

Service

JEEConf Service

Travel Service

Book hotelBuy

tickets

Preparing for JEEConf

Visit Organizer

Service

JEEConf Service

Travel Service

Book train tickets

Book hotelBuy

tickets

Time to see the code!

public class HelloWorld {

public static void main() { System.out.println(“Hi”); }

}

https://github.com/sbatyuk/aws-swf-sample

http://info.thinkfun.com/stem-education/mark-engelberg-inventor-of-code-master-featured-in-getting-smart

EASY, RIGHT?

FeaturesSWF

Fully Managed Service

Worker

Worker

Worker

Decider

Decider

Scalable

AWS SWF

My App

http://docs.aws.amazon.com/amazonswf/latest/awsflowguide/awsflow-basics-scalable.html

Worker

Worker

Worker

Decider

Decider

Scalable

AWS SWF

My App

http://docs.aws.amazon.com/amazonswf/latest/awsflowguide/awsflow-basics-scalable.html

Worker

Worker

Worker

Decider

Decider

Activity Retries

AWS SWF

My App

http://docs.aws.amazon.com/amazonswf/latest/awsflowguide/features-retry.html

Worker

Worker

Worker

Decider

Decider

Activity Retries

AWS SWF

My App

http://docs.aws.amazon.com/amazonswf/latest/awsflowguide/features-retry.html

Worker

Worker

Worker

Decider

Decider

Activity Retries

AWS SWF

My App

http://docs.aws.amazon.com/amazonswf/latest/awsflowguide/features-retry.html

Workflow Execution History

Exactly Once Delivery

= 1

Integration with Spring and JUnit

http://docs.aws.amazon.com/amazonswf/latest/awsflowguide/test.html

AWS SWF Pricing

https://aws.amazon.com/swf/pricing

10,000 workflows in a day with 3 activities each:

$1.75

Lessons LearntSWF

Workflow Method Replays

http://docs.aws.amazon.com/amazonswf/latest/awsflowguide/awsflow-basics-distributed-execution.html

@Overridepublic void prepareForJEEConf(String name, String email) { Promise<Integer> ticket = jeeConfService.buyTicket(name); Promise<Integer> hotel = travelService.bookHotel(name, ticket); Promise<Integer> train = travelService.bookTrainTickets(name, ticket); sendConfirmationEmail(email, ticket, hotel, train);}

Workflow Method Replay #1

http://docs.aws.amazon.com/amazonswf/latest/awsflowguide/awsflow-basics-distributed-execution.html

@Overridepublic void prepareForJEEConf(String name, String email) { Promise<Integer> ticket = jeeConfService.buyTicket(name); Promise<Integer> hotel = travelService.bookHotel(name, ticket); Promise<Integer> train = travelService.bookTrainTickets(name, ticket); sendConfirmationEmail(email, ticket, hotel, train);}

Workflow Method Replay #1

http://docs.aws.amazon.com/amazonswf/latest/awsflowguide/awsflow-basics-distributed-execution.html

@Overridepublic void prepareForJEEConf(String name, String email) { Promise<Integer> ticket = jeeConfService.buyTicket(name); Promise<Integer> hotel = travelService.bookHotel(name, ticket); Promise<Integer> train = travelService.bookTrainTickets(name, ticket); sendConfirmationEmail(email, ticket, hotel, train);}

Get History

Workflow Method Replay #1

http://docs.aws.amazon.com/amazonswf/latest/awsflowguide/awsflow-basics-distributed-execution.html

@Overridepublic void prepareForJEEConf(String name, String email) { Promise<Integer> ticket = jeeConfService.buyTicket(name); Promise<Integer> hotel = travelService.bookHotel(name, ticket); Promise<Integer> train = travelService.bookTrainTickets(name, ticket); sendConfirmationEmail(email, ticket, hotel, train);}

Schedule

Workflow Method Replay #1

http://docs.aws.amazon.com/amazonswf/latest/awsflowguide/awsflow-basics-distributed-execution.html

@Overridepublic void prepareForJEEConf(String name, String email) { Promise<Integer> ticket = jeeConfService.buyTicket(name); Promise<Integer> hotel = travelService.bookHotel(name, ticket); Promise<Integer> train = travelService.bookTrainTickets(name, ticket); sendConfirmationEmail(email, ticket, hotel, train);}

Skip

Workflow Method Replay #1

http://docs.aws.amazon.com/amazonswf/latest/awsflowguide/awsflow-basics-distributed-execution.html

@Overridepublic void prepareForJEEConf(String name, String email) { Promise<Integer> ticket = jeeConfService.buyTicket(name); Promise<Integer> hotel = travelService.bookHotel(name, ticket); Promise<Integer> train = travelService.bookTrainTickets(name, ticket); sendConfirmationEmail(email, ticket, hotel, train);}

Skip

Workflow Method Replay #1

http://docs.aws.amazon.com/amazonswf/latest/awsflowguide/awsflow-basics-distributed-execution.html

@Overridepublic void prepareForJEEConf(String name, String email) { Promise<Integer> ticket = jeeConfService.buyTicket(name); Promise<Integer> hotel = travelService.bookHotel(name, ticket); Promise<Integer> train = travelService.bookTrainTickets(name, ticket); sendConfirmationEmail(email, ticket, hotel, train);}

Skip

Workflow Method Replay #2

http://docs.aws.amazon.com/amazonswf/latest/awsflowguide/awsflow-basics-distributed-execution.html

@Overridepublic void prepareForJEEConf(String name, String email) { Promise<Integer> ticket = jeeConfService.buyTicket(name); Promise<Integer> hotel = travelService.bookHotel(name, ticket); Promise<Integer> train = travelService.bookTrainTickets(name, ticket); sendConfirmationEmail(email, ticket, hotel, train);}

Workflow Method Replay #2

http://docs.aws.amazon.com/amazonswf/latest/awsflowguide/awsflow-basics-distributed-execution.html

@Overridepublic void prepareForJEEConf(String name, String email) { Promise<Integer> ticket = jeeConfService.buyTicket(name); Promise<Integer> hotel = travelService.bookHotel(name, ticket); Promise<Integer> train = travelService.bookTrainTickets(name, ticket); sendConfirmationEmail(email, ticket, hotel, train);}

Get History

Workflow Method Replay #2

http://docs.aws.amazon.com/amazonswf/latest/awsflowguide/awsflow-basics-distributed-execution.html

@Overridepublic void prepareForJEEConf(String name, String email) { Promise<Integer> ticket = jeeConfService.buyTicket(name); Promise<Integer> hotel = travelService.bookHotel(name, ticket); Promise<Integer> train = travelService.bookTrainTickets(name, ticket); sendConfirmationEmail(email, ticket, hotel, train);}

Get Result

Workflow Method Replay #2

http://docs.aws.amazon.com/amazonswf/latest/awsflowguide/awsflow-basics-distributed-execution.html

@Overridepublic void prepareForJEEConf(String name, String email) { Promise<Integer> ticket = jeeConfService.buyTicket(name); Promise<Integer> hotel = travelService.bookHotel(name, ticket); Promise<Integer> train = travelService.bookTrainTickets(name, ticket); sendConfirmationEmail(email, ticket, hotel, train);}

Schedule

Workflow Method Replay #2

http://docs.aws.amazon.com/amazonswf/latest/awsflowguide/awsflow-basics-distributed-execution.html

@Overridepublic void prepareForJEEConf(String name, String email) { Promise<Integer> ticket = jeeConfService.buyTicket(name); Promise<Integer> hotel = travelService.bookHotel(name, ticket); Promise<Integer> train = travelService.bookTrainTickets(name, ticket); sendConfirmationEmail(email, ticket, hotel, train);}

Schedule

Workflow Method Replay #2

http://docs.aws.amazon.com/amazonswf/latest/awsflowguide/awsflow-basics-distributed-execution.html

@Overridepublic void prepareForJEEConf(String name, String email) { Promise<Integer> ticket = jeeConfService.buyTicket(name); Promise<Integer> hotel = travelService.bookHotel(name, ticket); Promise<Integer> train = travelService.bookTrainTickets(name, ticket); sendConfirmationEmail(email, ticket, hotel, train);}

Skip

Activity Timeouts

Activity Heartbeats

Activity Heartbeats

History and Data Size Limits

25K

http://docs.aws.amazon.com/amazonswf/latest/developerguide/swf-dg-limits.html

History events

32K

Message size (chars)

Summary

Programs with steps Scalability

Timeouts & Retries Java & Ruby

Questions

Serhiy Batyuk [email protected]

@sbatyuk