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

5,967 views

Published on

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

Published in: Technology, News & Politics

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

  1. 1. ブログ製本サービス MyBooks.jpのアーキテクチャ Part.2 ∼ Amazon Simple Workflow Serviceについて 2014/01/17 第12回勉強会 欧文印刷株式会社・ソフトウェアエンジニア・田名辺健人
  2. 2. Who am I ?! (この顔にピンときたら)
  3. 3. 田名辺 健人(たなべたけひと) ソフトウェアエンジニア ! @dateofrock ! http://blog.dateofrock.com/ 欧文印刷株式会社(東京都) 2011年11月から札幌でテレワーク 好きなサービス: SWF
  4. 4. A. 静的サイト B. 動的サイト editor.mybooks.jp www.mybooks.jp Elastic IP Address EC2 Instance EBS WordPress (AMI元) EC2 Instance ELB EC2 Instances (Auto Scaling) EBS snapshot Tomcat7 (Grails/front-end) Tomcat Session Store S3 Simple Workflow Service Book Data CloudWatch Route53 Decider ELB Simple Email Service Worker EC2 Instances Tomcat7 (Grails/back-end) S3 (App Resources)
  5. 5. S3 LB Simple Workflow Service Book Data CloudW Decider Simpl Se Worker EC2 Instances omcat7 (Grails/back-end) S3 ( Resou
  6. 6. ユーザー フロントエンド 仕上がり見本作成 SWF バックエンド 組版WFスタート 「後でPDF送ります」 組版処理 メール通知
  7. 7. 重 組版処理 た い !
  8. 8. 組版処理 1.HTMLを解析して、画像を集める 相手サーバーの状況やネットワークに左右されがち 最近の画像はデカい! 2.集めた画像を全てチェックして、印刷最適化する これをそのまま印刷製本するために処理が必須 画像処理自体、比較的重たいよね! 3.PDF/EPUB/KF8(Kindle)を生成する 1∼2で収集した画像は再利用出来る
  9. 9. 非同期処理管理 1.昔は自分でキューを作っていた もちろん取りこぼすw(ごめんなさい) 2.ちょっと前まではSQSを使っていた ちょっと面倒な所がある。 複数メッセージを受け取った場合 実行履歴管理は自前で作る必要あり
  10. 10. Amazon Simple Queue Service (SQS)
  11. 11. Amazon Simple Workflow Service (SWF)
  12. 12. Activity Decider Task List Domain
  13. 13. Activity Decider Task List Domain Domain: 処理対象区分
  14. 14. Activity Decider Task List Domain Task List: 実行すべきタスクがキューイングされる場所
  15. 15. Activity Decider Task List Domain Activity: ビジネスロジック実行
  16. 16. Activity Decider Task List Domain Decider: 実行すべきActivityを決定
  17. 17. http://www.slideshare.net/AmazonWebServicesJapan/20130424-aws-meisterregenerateswfpublic 概要はこちらを! ご覧下さいwwwww
  18. 18. •タスク管理はすべてお任せ •個別にタイムアウトの設定が可能 •自動リトライも可能
  19. 19. •SDKにSWF用のフレームワークがある •Flow Framework
  20. 20. Flow Framework • • • JavaとRubyのみ 正直キツいw • 生APIだけではもっとキツいww 今回はJava版のお話
  21. 21. http://blog.dateofrock.com/2012/03/amazon-swf.html
  22. 22. Flow Framework (Java) 1. 設計する(笑) • • ステートレスを意識する アクティビティ(ビジネスロジック) をどう切り分けるか?
  23. 23. ステートレス Activity Worker A Activity Worker A Activity 1 Activity 2 ファイル書出 ファイル読込 ローカル領域 ローカル領域 これはうまく行く
  24. 24. ステートレス Activity Worker A Activity 1 ファイル書出 ローカル領域 Activity Worker B × Activity 2 ファイル読込 ローカル領域 これはうまく行かない!!
  25. 25. Flow Framework (Java) 2. interfaceを定義 • • アクティビティ、デサイダーの両方 引数、戻り値、例外がJSONシリア ライズ可能か気をつけて!
  26. 26. DataConverter •SDKのデフォルトではJackson JSON processor(https://github.com/FasterXML/jackson) •JSONシリアライズされるオブジェクトコン ストラクタは、引数無し or 1つのString引 数である必要がある。 •どうしてもダメな場合は自分で DataConverterを実装する必要あり。 •例外の場合は自分でWrapper作ってもOK。
  27. 27. Flow Framework (Java) 3. 実装する • • アクティビティ、デサイダーの両方 Promise<T>を理解する
  28. 28. Promise<T> •Future<T>みたいなものだが、get()の振る舞いが 決定的に違う •Future<T> : readyになるまでブロック •Promise<T> : readyじゃないと例外スロー •そもそも同期はフレームワーク側で面倒見てく れるので、Promise<T>#get()で例外スローされ るという事自体がフレームワーク外の事をやって しまっている証拠。実質上問題は起きにくい。 •@Asynchronousアノテーション重要。
  29. 29. Flow Framework (Java) ちなみにこんな感じになります
  30. 30. Decider
  31. 31. 実 例 装
  32. 32. ちなみにダメな例です。! どこがマズいか! 解りますか? 実 例 装
  33. 33. Activity
  34. 34. A. 静的サイト B. 動的サイト editor.mybooks.jp www.mybooks.jp Elastic IP Address EC2 Instance EBS WordPress (AMI元) EC2 Instance ELB EC2 Instances (Auto Scaling) EBS snapshot Tomcat7 (Grails/front-end) Tomcat Session Store S3 Simple Workflow Service Book Data CloudWatch Route53 Decider ELB Simple Email Service Worker EC2 Instances Tomcat7 (Grails/back-end) S3 (App Resources)
  35. 35. S3 LB Simple Workflow Service Book Data CloudW Decider Simpl Se Worker EC2 Instances omcat7 (Grails/back-end) S3 ( Resou
  36. 36. A. 静的サイト B. 動的サイト editor.mybooks.jp www.mybooks.jp Elastic IP Address EC2 Instance EBS WordPress (AMI元) EC2 Instance ELB EC2 Instances (Auto Scaling) EBS snapshot Tomcat7 (Grails/front-end) Tomcat Session Store S3 Simple Workflow Service Book Data CloudWatch Route53 Decider ELB Simple Email Service Worker EC2 Instances Tomcat7 (Grails/back-end) S3 (App Resources)
  37. 37. A. 静的サイト B. 動的サイト www.mybooks.jp Elastic IP Address NFS Sharing EC2 Instance WordPress (AMI元) EBS Snapshot Scale Up Floating IP EC2 Instance Snapshot ELB EC2 Instances (Auto Scaling) EBS snapshot Tomcat7 (Grails/front-end) Multi Datacenter Bootstrap Cloud DI Web Strage Archive Functional Firewall Operational Firewall editor.mybooks.jp Tomcat Session Store DB Replication State Sharing S3 Private Distribution Simple Workflow Service Book Data Queuing Chain CloudWatch Route53 Decider Multi Datacenter Bootstrap Cloud DI Web Strage Archive Functional Firewall Operational Firewall ELB Simple Email Service Worker EC2 Instances Tomcat7 (Grails/back-end) S3 (App Resources)

×