Play勉強会資料(MTLブログ用)

3,183 views

Published on

MTLブログ掲載用

Published in: Technology
0 Comments
4 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
3,183
On SlideShare
0
From Embeds
0
Number of Embeds
1,222
Actions
Shares
0
Downloads
0
Comments
0
Likes
4
Embeds 0
No embeds

No notes for slide

Play勉強会資料(MTLブログ用)

  1. 1. Media  Technology  Labの紹介 RECRUIT   黒田 樹  
  2. 2. Media  Technology  Labs
  3. 3. MediaTechnologyLabs(MTL)   はリクルートのR&D部門 リクルートのシードを担う  実証実験機関R&D   カンパニー 事業開発 人材! ! 進学! 準カンパニー! ! 住宅! ! 結婚! ! 自動車! ! ライフスタイルetc.!
  4. 4. 最小2人構成で、プランナー&エンジニアーがタッグを組んで、サービスを企画&開発&運用していく。  (スタートアップ)  毎月1回MTL内ビジネスコンテストを実施。  
  5. 5. h5p://a5acca.fm
  6. 6. h5p://a5acca.fm A5acca  最高!
  7. 7. Play2.0+Javaで  サービスを本番稼働させた話   @i2key     ※以後の発表内容は会社は関係なく  私の個人的な見解・思考・思想に基づくものになります。  
  8. 8. @i2key  元SIer  Java屋  最近ObjC
  9. 9. 皆様  
  10. 10. 音楽は好きですか?  
  11. 11. 普段どんな曲を  聴いていますか?  
  12. 12. あなたのプレイリストは懐メロばかりになっちゃあいませんか?
  13. 13. 学生の頃に比べると明らかに、新しい音楽へ出会う機会が減っている。
  14. 14. 毎日が忙しく、音楽 に出会う場 (クラブ、フェス、ライ ブハウス、カラオケ 等) にいかなくなった。h?p://jigokuno.img.jugem.jp/20090624_1292358.gif
  15. 15. 毎日が忙しく、音楽に出会う番組(ドラマ、音楽番組、CM等)を見なくなった。 h?p://jigokuno.img.jugem.jp/20090922_1475978.gif
  16. 16. •  時間がないので音楽を探すのはオンラインば かり。 –  しかし、オンラインは思いのほか能動的に動かない と探せない。(TVやラジオの反対) –  音楽番組を見てたころは、いつの間にか流行の音 楽が耳に入っていたなぁ。
  17. 17. 音楽のランキング番組を見てたように、受動的に音楽聴きたいなー。
  18. 18. どうせ聴くなら、友達が聴いてる曲を知りたい。  
  19. 19. そんな思いを解決してくれます。  そう、この「A5acca」ならね。
  20. 20. h?p://www.google.co.jp/imgres?num=10&um=1&hl=ja&biw=1623&bih=832&tbm=isch&tbnid=aaEe9GiNRXBbqM:&imgrefurl=h?p://seiga.nicovideo.jp/seiga/im1343303&docid=pxtVREKFNTjFM&imgurl=h?p://lohas.nicoseiga.jp/thumb/1343303i&w=450&h=600&ei=-­‐WD-­‐T8GwPOfEmQWCn52OBQ&zoom=1&iact=hc&vpx=445&vpy=130&dur=1282&hovh=259&hovw=194&tx=88&ty=102&sig=102960426298510789252&sqi=2&page=1&tbnh=  160&tbnw=119&start=0&ndsp=33&ved=1t:429,r:2,s:0,i:73
  21. 21. h?p://livedoor.blogimg.jp/coodoo/imgs/5/a/5ae655d9.jpg
  22. 22. h?p://jigokuno.img.jugem.jp/20090119_824857.gif
  23. 23. デモンストレーション
  24. 24. Play導入の経緯
  25. 25. System  Integrator   元SIer  Architect
  26. 26. 官公庁系システム
  27. 27. 数百億円規模
  28. 28. エクセル駆動開発 推進 \エクセル方眼紙バンザーイ/     エクセル方眼紙から  どーんとJavaソースを自動生成して   ばーん
  29. 29. 人 海 戦 術
  30. 30. 大規模開発脳  
  31. 31. モジュールRP1029Logic.javaへのコミットログが多すぎるから、このモジュール作成者の品質に不安がある(キリッ  この開発者の作成したモジュールの横並び確認をしなければ!!  
  32. 32. サイクロマチック複雑度は??サイクロマチック複雑度と分岐網羅(C1)のテストケース数は大体近似できるから、それ以下だったら試験不足です。  はい、やりなおしー。  
  33. 33. 凝集性がぁ〜。  
  34. 34. モジュール間結合度が〜。  
  35. 35. バグ密度は??    件/kstepで出してください。  試験密度も添えてね。  
  36. 36. え?当然、  カバレッジ100%でしょ?  
  37. 37. バグ改修はエクセル(方眼紙)を修正して、そこからソースコードを再生成してくださいネ。  
  38. 38. h?p://to-­‐a.ru/6CN9s2/img1
  39. 39. 大規模開発のためのパラダイムで  小規模開発の現場に入ってしまったため、  前職と同等のアーキテクチャで  サービス開発をはじめてしまった。  
  40. 40. 非機能要件からのアーキテクチャ設計  from  非機能要求グレード(IPA)抜粋 •  可用性   –  継続性(稼働率)、耐障害性、災害対策、回復性  •  性能・拡張性   –  TX処理量、性能目標、リソース拡張性、性能品質保証  •  運用・保守性   –  通常運用(運用時間・バックアップ・運用監視)   –  保守運用、障害時運用、運用環境、サポート体制  •  セキュリティ   –  前提条件・制約条件、セキュリティリスク、アクセス利用 制限(認証、利用制限)、データ暗号化、不正追跡・監視、 ネットワーク、Web対策  
  41. 41. 初代Architecture h?ps API  KEY Twi?er facade 認証 APNS contro C2DM エラー ller dao Port 処理 制 SSL   変 御 facade O/R   換 JSON   制 Mapper   JSONP   御 dao RDS XML   Pooling HTML   DIコンテナ Tomcat Apache   JVM Amazon  Linux  (MTL  Amazon  Image) ビジネスロジック   ミドルウェア OS FW FW独自拡張 (機能毎に実装)
  42. 42. MTL  Java  Server  Architecture h?ps API  KEY Twi?er facade 認証 APNS contro 非機能 エラー ller 機能要件   dao C2DM Port 処理 制 SSL   変 御 facade 要件   換 O/R   JSON   Mapper 制   JSONP   御 dao RDS XML   Pooling HTML   DIコンテナ Tomcat Apache   非機能要件   JVM Amazon  Linux  (MTL  Amazon  Image) ビジネスロジック   ミドルウェア OS FW FW独自拡張 (機能毎に実装) 非機能要件をカバー
  43. 43. MTL  Java  Server  Architecture h?ps API  KEY Twi?er facade 認証 APNS contro 非機能 エラー ller dao C2DM Port 処理 制 SSL   変 御 facade 要件   換 O/R   JSON   Mapper 制   JSONP   御 dao RDS XML   Pooling HTML   DIコンテナ Tomcat Apache   非機能要件   JVM Amazon  Linux  (MTL  Amazon  Image) ビジネスロジック   ミドルウェア OS FW FW独自拡張 (機能毎に実装) 非機能要件をカバー
  44. 44. 反省点 •  大規模開発の設計思想を取り入れすぎたことによ り、フットワークの低下が発生。   –  インタフェースドリブンにし過ぎ   •  大規模開発では関係が疎になったモジュー ル設計のほうが、責務の所在が明確化し、 品質が安定するが、開発者が少ない開発 ではオーバーヘッドでしかない。   –  スピード感・イライラ感   •  確認にTomcat起動はキツい・・・   –  前工程での仕様フィックスを前提とした実装   •  テーブル定義の動的な変更に弱い   – Railsのマイグレーションとかうらやましい  
  45. 45. 300人で2年かけて作っていた世界     から     2人で2ヶ月で作る世界  
  46. 46. 300人で2年間で受託開発  開発モデル   ウォーターフォール(工程毎に品質評価会議)  開発方法論   契約による設計(高凝集性で低結合度)    ロールの過度な分割(業務SE、業務プログラマ、方式エンジニア)    インタフェースドリブンな実装(複数社がモジュール開発・結合)    疎結合による責務の所在の明確化     テスタビリティの向上によるモジュール品質の担保   全社的に統一したフレームワークで品質・生産性の平準化    ゴール感   リリースがゴール  価値観   お客様に納品するためにはバグは許されない。   品質が大事で、   納期も大事で、コストも大事で   要件を全部満たすことも大事   h?p://www.town.kaminokawa.tochigi.jp/f_sangyousinkou/P2_ph_2.jpg
  47. 47. 2人で2ヶ月で  自社サービス開発  開発モデル   ウォーターフォールではなく  アジャイルでもない何か    開発方法論   アジャイルのプラクティスもろもろ   要件の変更が多く   仕様フィックスはリリース直前    ゴール感   リリースははじまり  ゴールは、サービスのヒット、マネタイズ    価値観   リリース遅延=機会損失   ユーザに使ってもらってFBを即反映   バグってたら、急いで直してリリース   h?p://image.space.rakuten.co.jp/lg01/83/0000069883/72/imgcd88f518zikbzj.jpeg
  48. 48. つまり、自社サービスは  よく変更が入�るし、  よくリリースするし、  速く開発したい  品質は少しぐらい悪くても  すぐ直せればいいよ
  49. 49. Javaなんてやってないで、   Railsやろうぜ!   Rubyをキメルと気もちいぜ!  h?p://naglly.com/funny_japanese_t_thirt_13.jpg
  50. 50. 2.0 いずれ開発言語をJavaからScalaに移行したい
  51. 51. 小規模   フットワーク  大規模  高品質
  52. 52. REST  APIサーバとして   Play!2.0を採用  やることは、リクエストを受け 取って、JSONを返すだけ
  53. 53. いいか?   リファレンス以上の内容は   出てこないぞ?  h?p://naglly.com/funny_japanese_t_thirt_13.jpg
  54. 54. A5acca  Architecture h?ps API  KEY Manager Twi?er 認証 APNS contro Model エラー C2DM ller Port 処理   SSL   変 制 換 御 Manager   JSON       制 Dynamo   Dyn 御 Model DB   amo HTML   AWS  SDK Playframework  2.0 Apache   JVM Amazon  Linux  (MTL  Amazon  Image) ビジネスロジック   ミドルウェア OS FW FW独自拡張 (機能毎に実装)
  55. 55. A5acca  Architecture h?ps API  KEY Twi?er ←AOP的な   Manager 認証 APNS contro Model エラー C2DM ller Port 処理 ことがしたい   SSL   変 制 換 御 Manager   JSON       制 Dynamo   Dyn 御 Model DB   amo HTML   AWS  SDK Playframework  2.0 Apache   JVM Amazon  Linux  (MTL  Amazon  Image) ビジネスロジック   ミドルウェア OS FW FW独自拡張 (機能毎に実装)
  56. 56. A5acca  Architecture h?ps API  KEY public  class  Global  extends  GlobalSeSngs  {   Manager Twi?er 認証  @Override   APNS contro void  onStart(ApplicaVon  app)  {    public   Model     C2DM エラー ller ogger.info("A?acca  is  ready!!");              L Port 処理            //  Init  DynamoDB.     SSL   変 制            AmazonDynamoDBClientFactory.init();   換 御 Manager   JSON    }       制  @Override   Dynamo   Dyn 御  public  AcVon  oModel nRequest   DB   HTML                                      (Request  request,  Method  acVonMethod)  {amo AWS  SDK                            //リクエスト実行時に処理を織り込める     Playframework  2.0     Apache            return  super.onRequest(request,  acVonMethod);   JVM  }   Amazon  Linux  (MTL  Amazon  Image)  :             } ビジネスロジック   ミドルウェア OS FW FW独自拡張 (機能毎に実装)
  57. 57. A5acca  Architecture     //メソッド単位にもインターセプターを設定可能   @With(VerboseAcVon.class)          public  staVc  Result  index()  {  h?ps API  KEY                CommonResult  result  =  new  CommonResult();   Twi?er Manager 認証                result.setStatus("OK");                  return  ok(Json.toJson(result));                     APNS    contro Model    }   C2DM エラー   ller Port 処理   SSL   変 制   換 御 /**   Manager   JSON    *  インターセプト用のAcqon例.       制 Dynamo   Dyn 御  */   Model DB   HTML   public  class  VerboseAcqon  extends  Acqon.Simple  {   amo   AWS  SDK                public  Result  call(H?p.Context  ctx)  throws  Throwable   Playframework  2.0 Apache                                  //  必要に応じて前処理を実装 JVM //  ラップしているAcqonを呼び出し Amazon  Linux  (MTL  Amazon  Image) return  delegate.call(ctx);                  }   ビジネスロジック   ミドルウェア } OS FW FW独自拡張 (機能毎に実装)
  58. 58. A5acca  Architecture h?ps API  KEY Manager Twi?er 認証 APNS ←エラーハン   contro Model エラー C2DM ller Port 処理   SSL   変 制 Manager   ドリングしたい 換 御 JSON       制 Dynamo   Dyn 御 Model DB   amo HTML   AWS  SDK Playframework  2.0 Apache   JVM Amazon  Linux  (MTL  Amazon  Image) ビジネスロジック   ミドルウェア OS FW FW独自拡張 (機能毎に実装)
  59. 59. A5acca  Architecture public  class  Global  extends  GlobalSeSngs  {            :  h?ps API  KEY  @Override   Manager Twi?er 認証  public  Result  onError(Throwable  paramThrowable)  {   APNS    contro //エラー処理記述//   Model エラー    return  Results.ok(Json.toJson(result));   C2DM ller Port 処理  }     SSL   変 制   換 御 Manager   JSON    @Override       制  public  Result  onHandlerNotFound(String  paramString)  {   Dynamo   Dyn 御   Model  Logger.warn(“404  ERROR");   DB   amo HTML      return  Results.redirect("/");   AWS  SDK  }       Playframework  2.0 Apache    @Override   JVM  public  Result  onBadRequest   Amazon    L  inux  (MTL  Amazon  Image) paramString2)  {                                  (String  paramString1,  String      Logger.warn(”404  ERROR");   ビジネスロジック    ミドルウェア esults.redirect("/");    return  R OS FW FW独自拡張 (機能毎に実装)  }   }
  60. 60. A5acca  Architecture h?ps API  KEY Manager Twi?er 認証 APNS contro Model エラー C2DM ller Port 処理   SSL   変 制   ←Object  –  JSON   換 御 Manager JSON       制 Dynamo   Dyn 御 Model DB   amo Mappingしたい HTML   AWS  SDK Playframework  2.0 Apache   JVM Amazon  Linux  (MTL  Amazon  Image) ビジネスロジック   ミドルウェア OS FW FW独自拡張 (機能毎に実装)
  61. 61. A5acca  Architecture h?ps API  KEY Manager Twi?er 認証 APNS contro Model エラー C2DM ller Port 処理   SSL   変 換 制 御 return  ok(Json.toJson(result)); Manager   JSON       制 Dynamo   Dyn 御 Model DB   amo HTML   AWS  SDK Playframework  2.0 Apache   JVM Amazon  Linux  (MTL  Amazon  Image) ビジネスロジック   ミドルウェア OS FW FW独自拡張 (機能毎に実装)
  62. 62. A5acca  Architecture h?ps API  KEY Manager Twi?er 認証 APNS contro Model エラー C2DM ller Port 処理   SSL   変 制            ↑   換 御 Manager JSON       制 Dynamo   Dyn 御 Model DB   amo HTML   Apache   入力チェックしたい Playframework  2.0 AWS  SDK JVM Amazon  Linux  (MTL  Amazon  Image) ビジネスロジック   ミドルウェア OS FW FW独自拡張 (機能毎に実装)
  63. 63. A5acca  Architecture h?ps API  KEY Manager Twi?er 認証 APNS contro Model エラー C2DM ller Port 処理   SSL   変 制 public  staqc  class  Hello  {   換 Manager 御                @Required  public  String  name;     JSON          制      @Required  @Min(1)  @Max(100)  public  Integer  repeat;         Dynamo   Dyn    御      public  String  color;   Model       DB   HTML   }   amo AWS  SDK   public  staqc  Result  sayHello()  {   Playframework  2.0 Apache                  Form<Hello>  form  =  form(Hello.class).bindFromRequest();   JVM                if(form.hasErrors())  {   Amazon    Lreturn  badRequest();                         inux  (MTL  Amazon  Image)                }  else  {   ビジネスロジック                ミドルウェア =  form.get();   FW          Hello  data   OS FW独自拡張 (機能毎に実装)        return  ok(Json.toJson(data));                  }}
  64. 64. Play!で   iOS開発が   こんなに便利!!h?p://img5.blogs.yahoo.co.jp/ybi/1/83/95/dreamjapan04/folder/1564969/img_1564969_39575309_0?1201531988 (ステマ)  
  65. 65. iPhone  –  Server間  のI/F仕様の  ドキュメントレス化  (ソースが設計書)  
  66. 66. @i2key @vulcaniz iOS Playでスタブ   Play   Controller(空)   Controller(実装)   Model(属性) 渡す Model(属性+Validate)   Model DynamoDB(永続化)   もろもろ
  67. 67. テストが楽  動かしながら実装できるのは楽  Managerからやって積み上げる感じ  その後コントローラー    Junit準備がいらないからいきなり試験かけて楽      DynamoのNoSQLがらく(SQLかくのだるい)  
  68. 68. TIPS  h?p://gigazine.jp/img/2007/09/29/potechi_gomamayo/potechi_gomamayo03.jpg
  69. 69. Amazon  EC2  microでPlay!2.0が起動しない。    java  -­‐Xms512M  -­‐Xmx1536M  でPlay!2.0はデフォルト起動される  
  70. 70. conf/routesの定義を変更しても反映されない。     つ $  clean  
  71. 71. ステージングモードでの  バックグラウンド実行がCTRL  -­‐  Dが必要になっていて、スクリプトで自動化できない。    $  play  start  &      ではなく  $  play  clean  compile  stage  $  target/start  &  
  72. 72. 負荷試験でエラーでまくった  
  73. 73. Thrown(  akka.pa5ern.AskTimeoutExcepVon:  Timed  out)  
  74. 74. h?p://t3.gstaqc.com/images?q=tbn:ANd9GcRanRMXzrPAKMq1JheavSmik2E5pYk3pK69vCisdXBXfiSKaCuKpLWRnd3v
  75. 75. 完全にTomcat脳というかJ2EE脳だったので、Play(Ne?y+Akka)の仕組みを理解していなかった。    Hozumiさんの日記  Ne?yの基本 h?p://d.hatena.ne.jp/fatrow/20110208/ne?y    解決策は以下  h?p://www.playframework.org/documentaqon/2.0.1/AkkaCore      
  76. 76. play  {          akka  {                  event-­‐handlers  =  ["akka.event.slf4j.Slf4jEventHandler"]                  loglevel  =  WARNING                                    actor  {                              deployment  {                                  /acqons  {   AcVon  Invoker  Actors                                          router  =  round-­‐robin                                          nr-­‐of-­‐instances  =  512                                  }     Booooooooost!!                                /promises  {                                          router  =  round-­‐robin                                          nr-­‐of-­‐instances  =  24                                  }                          }                          retrieveBodyParserTimeout  =  3  second                          acqons-­‐dispatcher  =  {                                  fork-­‐join-­‐executor  {                                          parallelism-­‐factor  =  256.0                                          parallelism-­‐max  =  512                                  }                          }
  77. 77. 以上!!

×