ブログ製本サービス mybooks.jpのアーキテクチャ part.2(amazon simple workflow...

53
ブログ製本サービス MyBooks.jpのアーキテクチャ Part.2 ~ Amazon Simple Workflow Serviceについて 欧文印刷株式会社・ソフトウェアエンジニア・田名辺健人 2014/01/17 第12回勉強会

Upload: takehito-tanabe

Post on 27-Jun-2015

3.770 views

Category:

Technology


5 download

DESCRIPTION

第12回JAWS-UG札幌勉強会で発表した資料です。

TRANSCRIPT

Page 1: ブログ製本サービス MyBooks.jpのアーキテクチャ Part.2(Amazon Simple Workflow Service編)

ブログ製本サービス MyBooks.jpのアーキテクチャ Part.2

~ Amazon Simple Workflow Serviceについて 欧文印刷株式会社・ソフトウェアエンジニア・田名辺健人2014/01/17 第12回勉強会

Page 2: ブログ製本サービス MyBooks.jpのアーキテクチャ Part.2(Amazon Simple Workflow Service編)

Who am I ?!(この顔にピンときたら)

Page 3: ブログ製本サービス MyBooks.jpのアーキテクチャ Part.2(Amazon Simple Workflow Service編)

田名辺 健人(たなべたけひと) ソフトウェアエンジニア !

!

欧文印刷株式会社(東京都) 2011年11月から札幌でテレワーク 好きなサービス: SWF

@dateofrock

http://blog.dateofrock.com/

Page 4: ブログ製本サービス MyBooks.jpのアーキテクチャ Part.2(Amazon Simple Workflow Service編)
Page 5: ブログ製本サービス MyBooks.jpのアーキテクチャ Part.2(Amazon Simple Workflow Service編)
Page 6: ブログ製本サービス MyBooks.jpのアーキテクチャ Part.2(Amazon Simple Workflow Service編)
Page 7: ブログ製本サービス MyBooks.jpのアーキテクチャ Part.2(Amazon Simple Workflow Service編)

www.mybooks.jp

EC2Instance

WordPress(AMI元)

Elastic IP Address

ELB

EC2InstanceEBS

EBS snapshot

S3

Simple Workflow Service

Tomcat Session Store

Book Data

Tomcat7 (Grails/back-end)

EC2 InstancesELB

Decider

Worker

EC2 Instances(Auto Scaling)

Tomcat7 (Grails/front-end)

CloudWatch

Simple Email Service

S3 (App Resources)

editor.mybooks.jpA. 静的サイト B. 動的サイト

Route53

Page 8: ブログ製本サービス MyBooks.jpのアーキテクチャ Part.2(Amazon Simple Workflow Service編)

www.mybooks.jp

EC2Instance

WordPress(AMI元)

Elastic IP Address

ELB

EC2InstanceEBS

EBS snapshot

S3

Simple Workflow Service

Tomcat Session Store

Book Data

Tomcat7 (Grails/back-end)

EC2 InstancesELB

Decider

Worker

EC2 Instances(Auto Scaling)

Tomcat7 (Grails/front-end)

CloudWatch

Simple Email Service

S3 (App Resources)

editor.mybooks.jpA. 静的サイト B. 動的サイト

Route53

Page 9: ブログ製本サービス MyBooks.jpのアーキテクチャ Part.2(Amazon Simple Workflow Service編)
Page 10: ブログ製本サービス MyBooks.jpのアーキテクチャ Part.2(Amazon Simple Workflow Service編)
Page 11: ブログ製本サービス MyBooks.jpのアーキテクチャ Part.2(Amazon Simple Workflow Service編)
Page 12: ブログ製本サービス MyBooks.jpのアーキテクチャ Part.2(Amazon Simple Workflow Service編)
Page 13: ブログ製本サービス MyBooks.jpのアーキテクチャ Part.2(Amazon Simple Workflow Service編)
Page 14: ブログ製本サービス MyBooks.jpのアーキテクチャ Part.2(Amazon Simple Workflow Service編)
Page 15: ブログ製本サービス MyBooks.jpのアーキテクチャ Part.2(Amazon Simple Workflow Service編)
Page 16: ブログ製本サービス MyBooks.jpのアーキテクチャ Part.2(Amazon Simple Workflow Service編)
Page 17: ブログ製本サービス MyBooks.jpのアーキテクチャ Part.2(Amazon Simple Workflow Service編)
Page 18: ブログ製本サービス MyBooks.jpのアーキテクチャ Part.2(Amazon Simple Workflow Service編)
Page 19: ブログ製本サービス MyBooks.jpのアーキテクチャ Part.2(Amazon Simple Workflow Service編)
Page 20: ブログ製本サービス MyBooks.jpのアーキテクチャ Part.2(Amazon Simple Workflow Service編)
Page 21: ブログ製本サービス MyBooks.jpのアーキテクチャ Part.2(Amazon Simple Workflow Service編)
Page 22: ブログ製本サービス MyBooks.jpのアーキテクチャ Part.2(Amazon Simple Workflow Service編)

フロントエンド バックエンド

仕上がり見本作成 組版WFスタート

組版処理

SWFユーザー

メール通知

「後でPDF送ります」

Page 23: ブログ製本サービス MyBooks.jpのアーキテクチャ Part.2(Amazon Simple Workflow Service編)

フロントエンド バックエンド

仕上がり見本作成 組版WFスタート

組版処理

SWFユーザー

メール通知

「後でPDF送ります」

重たい!

Page 24: ブログ製本サービス MyBooks.jpのアーキテクチャ Part.2(Amazon Simple Workflow Service編)

1.HTMLを解析して、画像を集める ✓相手サーバーの状況やネットワークに左右されがち ✓最近の画像はデカい!

2.集めた画像を全てチェックして、印刷最適化する ✓これをそのまま印刷製本するために処理が必須 ✓画像処理自体、比較的重たいよね!

3.PDF/EPUB/KF8(Kindle)を生成する ✓1~2で収集した画像は再利用出来る

組版処理

Page 25: ブログ製本サービス MyBooks.jpのアーキテクチャ Part.2(Amazon Simple Workflow Service編)

1.昔は自分でキューを作っていた ✓もちろん取りこぼすw(ごめんなさい)

2.ちょっと前まではSQSを使っていた ✓ちょっと面倒な所がある。 ✓複数メッセージを受け取った場合 ✓実行履歴管理は自前で作る必要あり

非同期処理管理

Page 26: ブログ製本サービス MyBooks.jpのアーキテクチャ Part.2(Amazon Simple Workflow Service編)

Amazon Simple Queue Service (SQS)

Page 27: ブログ製本サービス MyBooks.jpのアーキテクチャ Part.2(Amazon Simple Workflow Service編)

Amazon Simple Workflow Service (SWF)

Page 28: ブログ製本サービス MyBooks.jpのアーキテクチャ Part.2(Amazon Simple Workflow Service編)

Activity Decider

Task List

Domain

Page 29: ブログ製本サービス MyBooks.jpのアーキテクチャ Part.2(Amazon Simple Workflow Service編)

Activity Decider

Task List

Domain

Domain: 処理対象区分

Page 30: ブログ製本サービス MyBooks.jpのアーキテクチャ Part.2(Amazon Simple Workflow Service編)

Activity Decider

Task List

Domain

Task List: 実行すべきタスクがキューイングされる場所

Page 31: ブログ製本サービス MyBooks.jpのアーキテクチャ Part.2(Amazon Simple Workflow Service編)

Activity Decider

Task List

Domain

Activity: ビジネスロジック実行

Page 32: ブログ製本サービス MyBooks.jpのアーキテクチャ Part.2(Amazon Simple Workflow Service編)

Activity Decider

Task List

Domain

Decider: 実行すべきActivityを決定

Page 33: ブログ製本サービス MyBooks.jpのアーキテクチャ Part.2(Amazon Simple Workflow Service編)

http://www.slideshare.net/AmazonWebServicesJapan/20130424-aws-meisterregenerateswfpublic

概要はこちらを!ご覧下さいwwwww

Page 34: ブログ製本サービス MyBooks.jpのアーキテクチャ Part.2(Amazon Simple Workflow Service編)

•タスク管理はすべてお任せ •個別にタイムアウトの設定が可能 •自動リトライも可能

Page 35: ブログ製本サービス MyBooks.jpのアーキテクチャ Part.2(Amazon Simple Workflow Service編)

•SDKにSWF用のフレームワークがある •Flow Framework

Page 36: ブログ製本サービス MyBooks.jpのアーキテクチャ Part.2(Amazon Simple Workflow Service編)

•JavaとRubyのみ •正直キツいw • 生APIだけではもっとキツいww •今回はJava版のお話

Flow Framework

Page 37: ブログ製本サービス MyBooks.jpのアーキテクチャ Part.2(Amazon Simple Workflow Service編)

http://blog.dateofrock.com/2012/03/amazon-swf.html

Page 38: ブログ製本サービス MyBooks.jpのアーキテクチャ Part.2(Amazon Simple Workflow Service編)

1. 設計する(笑) •ステートレスを意識する •アクティビティ(ビジネスロジック)をどう切り分けるか?

Flow Framework (Java)

Page 39: ブログ製本サービス MyBooks.jpのアーキテクチャ Part.2(Amazon Simple Workflow Service編)

ステートレスActivity Worker A

Activity 1

ファイル書出

Activity 2

ファイル読込

Activity Worker A

これはうまく行くローカル領域 ローカル領域

Page 40: ブログ製本サービス MyBooks.jpのアーキテクチャ Part.2(Amazon Simple Workflow Service編)

ステートレス

これはうまく行かない!!

Activity Worker A

Activity 1

ファイル書出

Activity 2

ファイル読込

Activity Worker B

×ローカル領域 ローカル領域

Page 41: ブログ製本サービス MyBooks.jpのアーキテクチャ Part.2(Amazon Simple Workflow Service編)

2. interfaceを定義 •アクティビティ、デサイダーの両方 •引数、戻り値、例外がJSONシリアライズ可能か気をつけて!

Flow Framework (Java)

Page 42: ブログ製本サービス MyBooks.jpのアーキテクチャ Part.2(Amazon Simple Workflow Service編)

DataConverter•SDKのデフォルトではJackson JSON processor(https://github.com/FasterXML/jackson) •JSONシリアライズされるオブジェクトコンストラクタは、引数無し or 1つのString引数である必要がある。 •どうしてもダメな場合は自分でDataConverterを実装する必要あり。 •例外の場合は自分でWrapper作ってもOK。

Page 43: ブログ製本サービス MyBooks.jpのアーキテクチャ Part.2(Amazon Simple Workflow Service編)

3. 実装する •アクティビティ、デサイダーの両方 •Promise<T>を理解する

Flow Framework (Java)

Page 44: ブログ製本サービス MyBooks.jpのアーキテクチャ Part.2(Amazon Simple Workflow Service編)

Promise<T>•Future<T>みたいなものだが、get()の振る舞いが決定的に違う •Future<T> : readyになるまでブロック •Promise<T> : readyじゃないと例外スロー •そもそも同期はフレームワーク側で面倒見てくれるので、Promise<T>#get()で例外スローされるという事自体がフレームワーク外の事をやってしまっている証拠。実質上問題は起きにくい。 •@Asynchronousアノテーション重要。

Page 45: ブログ製本サービス MyBooks.jpのアーキテクチャ Part.2(Amazon Simple Workflow Service編)

Flow Framework (Java)

ちなみにこんな感じになります

Page 46: ブログ製本サービス MyBooks.jpのアーキテクチャ Part.2(Amazon Simple Workflow Service編)

Decider

Page 47: ブログ製本サービス MyBooks.jpのアーキテクチャ Part.2(Amazon Simple Workflow Service編)

実装例

Page 48: ブログ製本サービス MyBooks.jpのアーキテクチャ Part.2(Amazon Simple Workflow Service編)

実装例

ちなみにダメな例です。!どこがマズいか!解りますか?

Page 49: ブログ製本サービス MyBooks.jpのアーキテクチャ Part.2(Amazon Simple Workflow Service編)

Activity

Page 50: ブログ製本サービス MyBooks.jpのアーキテクチャ Part.2(Amazon Simple Workflow Service編)

www.mybooks.jp

EC2Instance

WordPress(AMI元)

Elastic IP Address

ELB

EC2InstanceEBS

EBS snapshot

S3

Simple Workflow Service

Tomcat Session Store

Book Data

Tomcat7 (Grails/back-end)

EC2 InstancesELB

Decider

Worker

EC2 Instances(Auto Scaling)

Tomcat7 (Grails/front-end)

CloudWatch

Simple Email Service

S3 (App Resources)

editor.mybooks.jpA. 静的サイト B. 動的サイト

Route53

Page 51: ブログ製本サービス MyBooks.jpのアーキテクチャ Part.2(Amazon Simple Workflow Service編)

www.mybooks.jp

EC2Instance

WordPress(AMI元)

Elastic IP Address

ELB

EC2InstanceEBS

EBS snapshot

S3

Simple Workflow Service

Tomcat Session Store

Book Data

Tomcat7 (Grails/back-end)

EC2 InstancesELB

Decider

Worker

EC2 Instances(Auto Scaling)

Tomcat7 (Grails/front-end)

CloudWatch

Simple Email Service

S3 (App Resources)

editor.mybooks.jpA. 静的サイト B. 動的サイト

Route53

Page 52: ブログ製本サービス MyBooks.jpのアーキテクチャ Part.2(Amazon Simple Workflow Service編)

www.mybooks.jp

EC2Instance

WordPress(AMI元)

Elastic IP Address

ELB

EC2InstanceEBS

EBS snapshot

S3

Simple Workflow Service

Tomcat Session Store

Book Data

Tomcat7 (Grails/back-end)

EC2 InstancesELB

Decider

Worker

EC2 Instances(Auto Scaling)

Tomcat7 (Grails/front-end)

CloudWatch

Simple Email Service

S3 (App Resources)

editor.mybooks.jpA. 静的サイト B. 動的サイト

Route53

Page 53: ブログ製本サービス MyBooks.jpのアーキテクチャ Part.2(Amazon Simple Workflow Service編)

www.mybooks.jp

EC2Instance

WordPress(AMI元)

Elastic IP Address

ELB

EC2InstanceEBS

EBS snapshot

S3

Simple Workflow Service

Tomcat Session Store

Book Data

Tomcat7 (Grails/back-end)

EC2 InstancesELB

Decider

Worker

EC2 Instances(Auto Scaling)

Tomcat7 (Grails/front-end)

CloudWatch

Simple Email Service

S3 (App Resources)

editor.mybooks.jpA. 静的サイト B. 動的サイト

Route53

Private Distribution

State Sharing

Snapshot Scale Up

Floating IP

NFS Sharing

DB Replication

Queuing Chain

Multi Datacenter Bootstrap Cloud DI

Web Strage Archive Functional Firewall Operational Firewall

Multi Datacenter Bootstrap Cloud DI

Web Strage Archive Functional Firewall Operational Firewall

Snapshot