Your SlideShare is downloading. ×
JJUG CCC 2012 Fall Javaを使用したSaaS型ECプラットフォーム「えびすマート」開発の概要
Upcoming SlideShare
Loading in...5
×

Thanks for flagging this SlideShare!

Oops! An error has occurred.

×
Saving this for later? Get the SlideShare app to save on your phone or tablet. Read anywhere, anytime – even offline.
Text the download link to your phone
Standard text messaging rates apply

JJUG CCC 2012 Fall Javaを使用したSaaS型ECプラットフォーム「えびすマート」開発の概要

6,510

Published on

1 Comment
5 Likes
Statistics
Notes
No Downloads
Views
Total Views
6,510
On Slideshare
0
From Embeds
0
Number of Embeds
11
Actions
Shares
0
Downloads
8
Comments
1
Likes
5
Embeds 0
No embeds

Report content
Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
No notes for slide

Transcript

  • 1. Javaを使用したSaaS型ECプラットフォーム 「えびすマート」 開発の概要作ってみて知るJavaの常識!? Copyright (c) 2012 Interfactory, Inc. All Rights Reserved.
  • 2. 自己紹介石上 晋 @susumuis id:s-ishigami 2004年8月 インターファクトリーアルバイト入社 当時19歳 2007年11月 インターファクトリー入社 2009-2010年 えびすマート を開発現在は・・・ えびすマートの機能拡張 次期バージョンの開発興味のある分野 JavaによるWebアプリ開発 Mayaa, JavaScript, Tomcat, PostgreSQL, PivotalTracker Copyright (c) 2012 Interfactory, Inc. All Rights Reserved.
  • 3. インターファクトリー紹介従業員20~30人の小さな会社です。飯田橋にあります代表:蕪木登 2003 年創業まだまだ無名だけど、日本を代表するECのプラットフォーマーになろう!という野望の実現を目指しています。 詳しくは [ インターファクトリー ] で検索! Copyright (c) 2012 Interfactory, Inc. All Rights Reserved.
  • 4. えびすマートってなに? はECサイトを構築するための日本発[●] のプラットフォームです!マルチテナント型 SaaS モデルを採用デザイナードリブンな自由なテンプレートエンジン自由なカスタマイズが可能Concept: 好きな時 使った分だけ いつも最新・常に最適 自由に活用 広がる商い Copyright (c) 2012 Interfactory, Inc. All Rights Reserved.
  • 5. まずは概要 Copyright (c) 2012 Interfactory, Inc. All Rights Reserved.
  • 6. えびすマートを開発した動機2008年リーマン・ショックによる不況の始まり相次ぐ倒産、景気低迷、世の中は暗いムードに包まれていたSIer事業への陰り……しかし、EC事業 はまだまだ可能性があった!各社が次々EC業界に参入! (ネットショッピングのコモディティ化)我々は2003年創業以来EC を中心にやってきた!我々がECサイトのスタンダードプラットフォームを作るべし!そしてプロジェクトは始まった…… Copyright (c) 2012 Interfactory, Inc. All Rights Reserved.
  • 7. えびすマートの特徴(1)マルチテナントモデルそれまではECサイト一つ一つにソースをコピーして開発していた •相次ぐバグ修正 •機能改修 •古いソースコードの管理⇒技術投資が後手に回りがちであった 単一のシステム系で全てのECサイトを提供! •一つのソースで全部のサイトを動かしてしまおう! •全部入り リッチな標準機能→オプション化 •自由なデザイン •クラスローダいじってソースコードも書き換えちゃえ! Copyright (c) 2012 Interfactory, Inc. All Rights Reserved.
  • 8. デザインドリブンテンプレートエンジンそれまではデザイナーが作ったHTMLをプログラマーがJSPに移植していた •積み重なる工数 •開発スピードの停滞 •つまらない作業デザイナーが直接テンプレートを書ければ良い! Copyright (c) 2012 Interfactory, Inc. All Rights Reserved.
  • 9. クラウドインフラ採用それまではデータセンターを借りてサーバを構築していた •管理ノウハウ・コスト •相次ぐトラブル (DCで作業中のスタッフが足でコンセントを抜いてダウンということも!) •サーバの増強・縮小が即座にできないこれからはクラウドでしょ! •色々試したけど今はAWS(EC2, ELB, S3, RDS)採用! •必要に応じて随時構成変更をしています! Copyright (c) 2012 Interfactory, Inc. All Rights Reserved.
  • 10. 今日はJJUGでの発表 ということで普段は話さない突っ込んだ 話をします! Copyright (c) 2012 Interfactory, Inc. All Rights Reserved.
  • 11. 突っ込んだ話 その1マルチテナント・アプリケーション を実現するための クラスローダー入門 Copyright (c) 2012 Interfactory, Inc. All Rights Reserved.
  • 12. やりたかったこと本体プログラムをベースとしてカスタマイズのプログラムを構築。各ECサイト間でラスは独立にしたい。アプリケーションを動かしながらカスタマイズのクラスをデプロイしたい。 独自のクラスローダー Copyright (c) 2012 Interfactory, Inc. All Rights Reserved.
  • 13. 開発方法本体のプログラムをextendする設定ファイルに登録するItemListBean#check メソッドの代わりにIshigamiItemListBean#checkメソッドが使われる! Copyright (c) 2012 Interfactory, Inc. All Rights Reserved.
  • 14. クラスローダーってなに?Javaのプログラムは全てクラスに属している javac Hogehoge.java -- Hogehoge.classJavaはクラスローダによってクラスをロードするクラスローダは自分で作ることもできる! 例えば、Seasar2はクラスローダーをカスタマイズすることで HotDeployを実現している 現在のクラスローダの切り替え方: Thread.currentThread().setContextClassLoader( myClassLoader ); 例えば、Web経由でクラスをロードしたりとかできます。遊んでみても結構楽しい? Copyright (c) 2012 Interfactory, Inc. All Rights Reserved.
  • 15. クラスローダーを定義するClassLoaderクラスをextendsして、loadClassメソッドを定義するだけとは言っても慣れないと難しい…… Seaser2 HotdeployClassLoader.java が参考になった! というかほぼコピペした…… Seasar2はApacheライセンス2.0です。 Copyright (c) 2012 Interfactory, Inc. All Rights Reserved.
  • 16. クラスローダこぼれ話Java6 の URLClassLoaderはバグ持ち? URLClassLoaderはjarファイルを読んでクラスをロードできる便利なクラスです。 https://blogs.oracle.com/michaelmcm/entry/closing_a_urlclassloader 一度ロードしたjarファイルをcloseしない。 これじゃロードしたモジュールをアプリケーションを動かしながら交換できない! Java7でcloseメソッドが実装されたけど間に合わなかった。 しかたがないので自分でDirectoryClassLoaderを実装しました。ClassCastExceptionとの闘い 独自クラスローダでロードしたクラスをセッションに格納 クラスローダを変更 セッションからデータ取得時にClassCastExceptionが発生! ClassLoaderをいじったことがある人が通る道。 serializeしてdeserizlizeするのが王道 Copyright (c) 2012 Interfactory, Inc. All Rights Reserved.
  • 17. クラスローダこぼれ話(2)OutOfMemoryError PermGenに注意 ! ロードしたクラスのオブジェクトをHashMapに格納とか WeakReferenceを使ってインスタンス残りに注意JSPのコンパイル時にハマる JSPのコンパイルタイミングはTomcat判断、ソースを差し込めない>< えびすマートはJSPをあまり使っていないので、JSP問題は解決していません(-.-;Tomcatのセッションレプリケーションの罠 Tomcatを複数台並べてセッションを共有 裏側でClassCastExceptionが発生してセッションが全部消える!! ClassCastExceptionを拾って代理のオブジェクトを格納したりして回避した orz 今はTomcatのセッションを直接使用しない方向にしています Copyright (c) 2012 Interfactory, Inc. All Rights Reserved.
  • 18. 突っ込んだ話 その2デザインドリブンのための を実現するための Mayaa入門 Copyright (c) 2012 Interfactory, Inc. All Rights Reserved.
  • 19. MayaaとはMayaaはSeasar2系の日本発オープンソースライブラリですが、Seasar2に関係なく使用することができます。JSPと同じレイヤーで動作し、JSPのようにServletからforwardして使うことができます。 Copyright (c) 2012 Interfactory, Inc. All Rights Reserved.
  • 20. Mayaa導入のbefore/afterbefore 開発者<=====(見えない壁)====>デザイナーafter プログラマーはJSPのコーディングから開放されて嬉しい! デザイナーはプログラマーの力を借りずに思い通りに動かせ て楽しい! デザイナーとプログラマーの会話が増加 まさにコラボレーションしている! Copyright (c) 2012 Interfactory, Inc. All Rights Reserved.
  • 21. デザイナーとの協業の推進m:idの命名規則重要! デザイナーさんはmayaaファイルの記述はわからない 名前と説明書のみが頼り!4種類の名前規則 IF_xxxx : <div m:id=“IF_MEMBER”>こんにちは</div> LOOP_xxx : <div m:id=“LOOP_ITEM”> … </div> xxxx_HERE : こんにちは<span m:id=“MEMBER_NAME_HERE”> ○ ○</span>さん xxxx_TAG : <img src=“dummy.jpg” m:id=“ITEM_IMAGE_TAG” />m:idの数を減らそう! PathAdjusterを有効活用 m:idのパラメータ化 Copyright (c) 2012 Interfactory, Inc. All Rights Reserved.
  • 22. マルチテナントとMayaa通常のMayaaは1テンプレート1Mayaaファイル 同じ制御で見た目違いを量産したい!見た目だけじゃなく、m:idを追加したいMayaaの拡張性は神! DIのような仕組みあり Mayaa自体を再コンパイル せずに機能を書き換えられる! Copyright (c) 2012 Interfactory, Inc. All Rights Reserved.
  • 23. Mayaaカスタマイズの勘所 一つのページのバリエーションSourceDescriptor + 英語/日本語 + スマートフォン/PC Mayaaのパス(SystemID)と実際に読み込む + プレビュー/非プレビュー ファイルをハンドリングする時に利用 + 本体/カスタマイズ 16通りPathAdjuster テンプレート上に入力された相対パスをハンドリングするときに利用、上手く使えば m:idの数を大幅に減らすことができます <img src=“hogehoge.jpg” /> ---> <img src=“http://example.com/files/hogehoge.jpg” /> <a href=“login.html”> ----> <a href=”https://example.com/login.html”>m:idのパラメータ化 <img src=“dummy.jpg” m:id=“CONTENTS_IMAGE_TAG” m:contentsNo=“123” /> <m:echo m:id=“CONTENTS_IMAGE_TAG”> <m:attribute name=“src” value=“${getContentsImage($p(“contentsNo”))} /> </m:echo> function $p(param) { var attr = originalNode.getAttribute(Packages.org.seasar.mayaa.impl.engine.specification.SpecificationUtil.createQName(param)); if (attr == null) return ""; return attr.value; } Copyright (c) 2012 Interfactory, Inc. All Rights Reserved.
  • 24. 突っ込んだ話 その3 SaaSの宿命!パフォーマンスとの闘い Copyright (c) 2012 Interfactory, Inc. All Rights Reserved.
  • 25. クラウド時代はパフォーマンスが重要!パフォーマンスが良い ⇒1サーバーあたりに捌けるクライアント数が多い ⇒コスト削減!! ( ←逆も真 )そこで パフォーマンス計測 JMeter, JVisualVmでの計測 パフォーマンスチューニングの徹底 SQLチューニング キャッシュ(FullGCに注意!)我々はパフォーマンスとの闘いでした Copyright (c) 2012 Interfactory, Inc. All Rights Reserved.
  • 26. パフォーマンス対策事例2011年8月某クライアントにて昼休み 頃に5分未満の寸断発生、人気テレビ番組にテレビCMを出していた緊急パフォーマンス・チューニング DBのつなぎすぎが原因→ResultSetのキャッシュ化を推進 トップページでのSQLゼロ化 →この方針が後々苦労のもとに…… >_<昼休みにみんなで監視 「お昼休みは~~♪」 瞬間最大 397PV/min Copyright (c) 2012 Interfactory, Inc. All Rights Reserved.
  • 27. パフォーマンス対策事例2011年9月 某人気アイドルグループ公式オンラインショップ(その1)オープン要求負荷分間1800PV 納期は2週間!!パフォーマンス・チューニング (JVisualVMのプロファイラ使用しました) SQL結果のキャッシュ化をさらに推進 DB接続フレームワーク改修 キャッシュしたためそもそも不要な場合が多いDBコネクション取得を抑制 PreparedStatementのキャッシュ効率改善パフォーマンス計測(JMeterを使用) 1APあたり分間900PV測定、DBサーバへの負荷なしインフラ増強 EC2インスタンスを増強2台→4台 (理論値3600PV/min) Copyright (c) 2012 Interfactory, Inc. All Rights Reserved.
  • 28. 失敗事例2012年6月某人気アイドルグループ公式オンラインショップ(その2)オープン⇒オープン直後大量のシステムエラーが発生!! •分間 3000PV を記録(実測最大) •サイトが非常に重い!!!とTwitterで苦情の嵐!!•なぜ? •クレジットカードの与信待ちと在庫の引き当て •カートの精算時、在庫整合性のため、在庫テーブルをロックする •クレジットカードの与信には3秒 程度かかる •その間在庫テーブルをロックしたまま →事実上同時1注文しかさばけず、分間20回が最大でした•アプリケーションの実装を改善して解決! Copyright (c) 2012 Interfactory, Inc. All Rights Reserved.
  • 29. 失敗事例22012年9月 複数のお客様より「サイトが遅い」 とクレームを受ける ロードアベレージ、CPU使用率はAP、DBともに異常ではなかった。•なぜ? •FullGCが発生していた! •パフォーマンス対策のため、あらゆるデータをキャッシュしていた •OldGen領域の圧迫 •Mayaaでload関数を使用すると、毎回新しいクラスがロードされていた •PermGen領域の圧迫→サーバの分散計画を見直し、インスタンスのスペックはCPUよりメモリ優先に $ jstat –gcutil xxxxx 3000 S0 S1 E O P YGC YGCT FGC FGCT GCT 0.00 0.00 11.50 99.98 80.22 17 5.576 5 14.04 19.80 0.00 0.00 11.50 99.99 80.32 17 5.576 5 14.04 19.80 0.00 0.00 11.50 100.0 80.22 17 5.576 5 14.04 19.80 0.00 0.00 11.50 100.0 80.22 17 5.576 6 14.04 19.80 0.00 0.00 11.50 100.0 80.22 17 5.576 5 21.06 19.80 Copyright (c) 2012 Interfactory, Inc. All Rights Reserved.
  • 30. 突っ込んだ話 その4 開発現場の事情 Copyright (c) 2012 Interfactory, Inc. All Rights Reserved.
  • 31. SaaS開発の極意SaaS事業を行う一番のメリットは=>集中投資ができる!今まで 「こんなことがやりたい」「あんなこともやりたい」 →「予算が足りないから無理」 となっていたことはありませんでしょうか?えびすマート以降の弊社開発チーム 一箇所を良くすれば、数十クライアント、及び将来すべてのク ライアントのメリットになる! →「やろう!」 継続的開発 Copyright (c) 2012 Interfactory, Inc. All Rights Reserved.
  • 32. SaaS開発の怖さ•一箇所の良くないコードがあると、全体に影響してしまう。•使っていない機能と機能を組み合わせると動かなかったりする。•思いもよらない機能の組み合わせをしているサイトがある。•思いもよらないカスタマイズソースが入っているサイトがある。もし、障害を起こすと…… 全クライアント、社内全業務にご迷惑がかかる。 機会損失の総量:数百万から数千万、数億そこで 品質管理を徹底! テストの自動化 Copyright (c) 2012 Interfactory, Inc. All Rights Reserved.
  • 33. 肥大化するソースほうっておくとどんどん汚くなる………。SourceMonitorで観測 (本体モジュールのみ) 総行数: 15万以上 (8万ステップ) 総クラス数: 850以上Javaで良かった! Eclipseのリファクタリング機能最高! 誰がどのメソッドを使用しているか一目瞭然!Ctrl+Alt+H どの店舗がどのメソッドをカスタマイズしているか一目瞭然!Ctrl+T 一括でメソッド名変更簡単! Alt+Shift+R Copyright (c) 2012 Interfactory, Inc. All Rights Reserved.
  • 34. 止まない要望日々増えるタスク、バグ・要望・案件進捗管理が手に負えない!忙しいんだかそうでもないのか感覚が麻痺してくる→PivotalTracker導入 Redmineなどよりシンプルで使いやすい。若干アジャイルの発想が必要 Copyright (c) 2012 Interfactory, Inc. All Rights Reserved.
  • 35. SaaSの開発現場についてまとめると常に考えなければならない超刺激的! Copyright (c) 2012 Interfactory, Inc. All Rights Reserved.
  • 36. 総まとめ Copyright (c) 2012 Interfactory, Inc. All Rights Reserved.
  • 37. えびすマートを支える技術マルチテナント ー> クラスローダー Seasar2のソースコードは勉強になりました!デザインドリブン ー> Mayaa プログラマーとデザイナーの協力が大切!クラウド ー> パフォーマンスが命、かつ安全運転 JMeterとJVisualVM、キャッシュ、GCにも注意大規模なソースコード ー> Java便利! IDEの充実、静的型付け、開発者多い!継続的な開発現場 ー> Pivotal Tracker、ユニットテスト、Selenium 日々品質を保つことを怠ってはだめ! 何一つ特別なことはなく、当たり前のことを日々勉強していくことが大切でした Copyright (c) 2012 Interfactory, Inc. All Rights Reserved.
  • 38. 質問はありませんか? Copyright (c) 2012 Interfactory, Inc. All Rights Reserved.
  • 39. 最後に一つ言わせてください。。。 Copyright (c) 2012 Interfactory, Inc. All Rights Reserved.
  • 40. インターファクトリーではエンジニアを募集しています! 今日話すことができなかった 熱い技術トピックまだまだいっぱいあります! 技術が好きな方、 Javaが好きな方、成長したい方待ってます!一緒に成功しましょう! Copyright (c) 2012 Interfactory, Inc. All Rights Reserved.
  • 41. ご清聴ありがとうございました Copyright (c) 2012 Interfactory, Inc. All Rights Reserved.

×