ブログ製本サービス MyBooks.jpのアーキテクチャ Part.2(Amazon Simple Workflow...
-
Upload
takehito-tanabe -
Category
Technology
-
view
3.772 -
download
5
description
Transcript of ブログ製本サービス MyBooks.jpのアーキテクチャ Part.2(Amazon Simple Workflow...
ブログ製本サービス MyBooks.jpのアーキテクチャ Part.2
~ Amazon Simple Workflow Serviceについて 欧文印刷株式会社・ソフトウェアエンジニア・田名辺健人2014/01/17 第12回勉強会
Who am I ?!(この顔にピンときたら)
田名辺 健人(たなべたけひと) ソフトウェアエンジニア !
!
欧文印刷株式会社(東京都) 2011年11月から札幌でテレワーク 好きなサービス: SWF
@dateofrock
http://blog.dateofrock.com/
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
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
フロントエンド バックエンド
仕上がり見本作成 組版WFスタート
組版処理
SWFユーザー
メール通知
「後でPDF送ります」
フロントエンド バックエンド
仕上がり見本作成 組版WFスタート
組版処理
SWFユーザー
メール通知
「後でPDF送ります」
重たい!
1.HTMLを解析して、画像を集める ✓相手サーバーの状況やネットワークに左右されがち ✓最近の画像はデカい!
2.集めた画像を全てチェックして、印刷最適化する ✓これをそのまま印刷製本するために処理が必須 ✓画像処理自体、比較的重たいよね!
3.PDF/EPUB/KF8(Kindle)を生成する ✓1~2で収集した画像は再利用出来る
組版処理
1.昔は自分でキューを作っていた ✓もちろん取りこぼすw(ごめんなさい)
2.ちょっと前まではSQSを使っていた ✓ちょっと面倒な所がある。 ✓複数メッセージを受け取った場合 ✓実行履歴管理は自前で作る必要あり
非同期処理管理
Amazon Simple Queue Service (SQS)
Amazon Simple Workflow Service (SWF)
Activity Decider
Task List
Domain
Activity Decider
Task List
Domain
Domain: 処理対象区分
Activity Decider
Task List
Domain
Task List: 実行すべきタスクがキューイングされる場所
Activity Decider
Task List
Domain
Activity: ビジネスロジック実行
Activity Decider
Task List
Domain
Decider: 実行すべきActivityを決定
http://www.slideshare.net/AmazonWebServicesJapan/20130424-aws-meisterregenerateswfpublic
概要はこちらを!ご覧下さいwwwww
•タスク管理はすべてお任せ •個別にタイムアウトの設定が可能 •自動リトライも可能
•SDKにSWF用のフレームワークがある •Flow Framework
•JavaとRubyのみ •正直キツいw • 生APIだけではもっとキツいww •今回はJava版のお話
Flow Framework
http://blog.dateofrock.com/2012/03/amazon-swf.html
1. 設計する(笑) •ステートレスを意識する •アクティビティ(ビジネスロジック)をどう切り分けるか?
Flow Framework (Java)
ステートレスActivity Worker A
Activity 1
ファイル書出
Activity 2
ファイル読込
Activity Worker A
これはうまく行くローカル領域 ローカル領域
ステートレス
これはうまく行かない!!
Activity Worker A
Activity 1
ファイル書出
Activity 2
ファイル読込
Activity Worker B
×ローカル領域 ローカル領域
2. interfaceを定義 •アクティビティ、デサイダーの両方 •引数、戻り値、例外がJSONシリアライズ可能か気をつけて!
Flow Framework (Java)
DataConverter•SDKのデフォルトではJackson JSON processor(https://github.com/FasterXML/jackson) •JSONシリアライズされるオブジェクトコンストラクタは、引数無し or 1つのString引数である必要がある。 •どうしてもダメな場合は自分でDataConverterを実装する必要あり。 •例外の場合は自分でWrapper作ってもOK。
3. 実装する •アクティビティ、デサイダーの両方 •Promise<T>を理解する
Flow Framework (Java)
Promise<T>•Future<T>みたいなものだが、get()の振る舞いが決定的に違う •Future<T> : readyになるまでブロック •Promise<T> : readyじゃないと例外スロー •そもそも同期はフレームワーク側で面倒見てくれるので、Promise<T>#get()で例外スローされるという事自体がフレームワーク外の事をやってしまっている証拠。実質上問題は起きにくい。 •@Asynchronousアノテーション重要。
Flow Framework (Java)
ちなみにこんな感じになります
Decider
実装例
実装例
ちなみにダメな例です。!どこがマズいか!解りますか?
Activity
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
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
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
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