jjug ccc 2012 fall...

41
Copyright (c) 2012 Interfactory, Inc. All Rights Reserved. Javaを使用した SaaSECプラットフォーム 「えびすマート」 開発の概要 作ってみて知るJavaの常識!?

Upload: susumu-ishigami

Post on 12-Nov-2014

6.030 views

Category:

Documents


21 download

DESCRIPTION

 

TRANSCRIPT

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

Copyright (c) 2012 Interfactory, Inc. All Rights Reserved.

Javaを使用した SaaS型ECプラットフォーム

「えびすマート」 開発の概要

作ってみて知るJavaの常識!?

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

Copyright (c) 2012 Interfactory, Inc. All Rights Reserved.

石上 晋 @susumuis id:s-ishigami 2004年8月 インターファクトリーアルバイト入社 当時19歳 2007年11月 インターファクトリー入社

2009-2010年 えびすマート を開発

現在は・・・

えびすマートの機能拡張 次期バージョンの開発

興味のある分野

JavaによるWebアプリ開発 Mayaa, JavaScript, Tomcat, PostgreSQL, PivotalTracker

自己紹介

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

Copyright (c) 2012 Interfactory, Inc. All Rights Reserved.

従業員20~30人の小さな会社です。飯田橋にあります

代表:蕪木登 2003 年創業

まだまだ無名だけど、日本を代表する

ECのプラットフォーマーになろう!

という野望の実現を目指しています。

詳しくは [ インターファクトリー ] で検索!

インターファクトリー紹介

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

Copyright (c) 2012 Interfactory, Inc. All Rights Reserved.

はECサイトを構築するための

日本発[●] のプラットフォームです!

マルチテナント型 SaaS モデルを採用

デザイナードリブンな自由なテンプレートエンジン

自由なカスタマイズが可能

えびすマートってなに?

Concept: 好きな時 使った分だけ

いつも最新・常に最適

自由に活用 広がる商い

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

Copyright (c) 2012 Interfactory, Inc. All Rights Reserved.

まずは概要

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

Copyright (c) 2012 Interfactory, Inc. All Rights Reserved.

えびすマートを開発した動機

2008年リーマン・ショックによる不況の始まり

相次ぐ倒産、景気低迷、世の中は暗いムードに包まれていた

SIer事業への陰り……

しかし、EC事業 はまだまだ可能性があった!

各社が次々EC業界に参入! (ネットショッピングのコモディティ化)

我々は2003年創業以来EC を中心にやってきた!

我々がECサイトのスタンダードプラットフォームを作るべし!

そしてプロジェクトは始まった……

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

Copyright (c) 2012 Interfactory, Inc. All Rights Reserved.

えびすマートの特徴(1)

マルチテナントモデル

それまではECサイト一つ一つにソースをコピーして開発していた

•相次ぐバグ修正

•機能改修

•古いソースコードの管理

⇒技術投資が後手に回りがちであった

単一のシステム系で全てのECサイトを提供!

•一つのソースで全部のサイトを動かしてしまおう!

•全部入り リッチな標準機能→オプション化

•自由なデザイン

•クラスローダいじってソースコードも書き換えちゃえ!

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

Copyright (c) 2012 Interfactory, Inc. All Rights Reserved.

デザインドリブンテンプレートエンジン

それまではデザイナーが作ったHTMLをプログラマーが

JSPに移植していた

•積み重なる工数

•開発スピードの停滞

•つまらない作業

デザイナーが直接テンプレートを書ければ良い!

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

Copyright (c) 2012 Interfactory, Inc. All Rights Reserved.

クラウドインフラ採用

それまではデータセンターを借りてサーバを構築していた

•管理ノウハウ・コスト

•相次ぐトラブル (DCで作業中のスタッフが足でコンセントを抜いてダウンということも!)

•サーバの増強・縮小が即座にできない

これからはクラウドでしょ!

•色々試したけど今はAWS(EC2, ELB, S3, RDS)採用!

•必要に応じて随時構成変更をしています!

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

Copyright (c) 2012 Interfactory, Inc. All Rights Reserved.

今日はJJUGでの発表 ということで

普段は話さない突っ込んだ 話をします!

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

Copyright (c) 2012 Interfactory, Inc. All Rights Reserved.

突っ込んだ話 その1

マルチテナント・アプリケーション を実現するための クラスローダー入門

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

Copyright (c) 2012 Interfactory, Inc. All Rights Reserved.

やりたかったこと

本体プログラムをベースとしてカスタマイズのプログラムを構築。

各ECサイト間でラスは独立にしたい。アプリケーションを動かしな

がらカスタマイズのクラスをデプロイしたい。

独自のクラスローダー

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

Copyright (c) 2012 Interfactory, Inc. All Rights Reserved.

開発方法

本体のプログラムをextendする

設定ファイルに登録する

ItemListBean#check メソッドの代わりに

IshigamiItemListBean#checkメソッドが使われる!

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

Copyright (c) 2012 Interfactory, Inc. All Rights Reserved.

クラスローダーってなに?

Javaのプログラムは全てクラスに属している

javac Hogehoge.java -- Hogehoge.class

Javaはクラスローダによってクラスをロードする

クラスローダは自分で作ることもできる!

例えば、Seasar2はクラスローダーをカスタマイズすることで

HotDeployを実現している

現在のクラスローダの切り替え方:

Thread.currentThread().setContextClassLoader( myClassLoader );

例えば、Web経由でクラスをロードしたりとかできます。遊んでみても結構楽しい?

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

Copyright (c) 2012 Interfactory, Inc. All Rights Reserved.

クラスローダーを定義する

ClassLoaderクラスをextendsして、

loadClassメソッドを定義するだけ

とは言っても慣れないと難しい……

Seaser2 HotdeployClassLoader.java

が参考になった! というかほぼコピペした……

Seasar2はApacheライセンス2.0です。

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

Copyright (c) 2012 Interfactory, Inc. All Rights Reserved.

クラスローダこぼれ話

Java6 の URLClassLoaderはバグ持ち?

URLClassLoaderはjarファイルを読んでクラスをロードできる便利なクラスです。

https://blogs.oracle.com/michaelmcm/entry/closing_a_urlclassloader

一度ロードしたjarファイルをcloseしない。

これじゃロードしたモジュールをアプリケーションを動かしながら交換できない!

Java7でcloseメソッドが実装されたけど間に合わなかった。

しかたがないので自分でDirectoryClassLoaderを実装しました。

ClassCastExceptionとの闘い

独自クラスローダでロードしたクラスをセッションに格納

クラスローダを変更

セッションからデータ取得時にClassCastExceptionが発生!

ClassLoaderをいじったことがある人が通る道。

serializeしてdeserizlizeするのが王道

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

Copyright (c) 2012 Interfactory, Inc. All Rights Reserved.

クラスローダこぼれ話(2)

OutOfMemoryError PermGenに注意 !

ロードしたクラスのオブジェクトをHashMapに格納とか

WeakReferenceを使ってインスタンス残りに注意

JSPのコンパイル時にハマる

JSPのコンパイルタイミングはTomcat判断、ソースを差し込めない><

えびすマートはJSPをあまり使っていないので、JSP問題は解決していません(-.-;

Tomcatのセッションレプリケーションの罠

Tomcatを複数台並べてセッションを共有

裏側でClassCastExceptionが発生してセッションが全部消える!!

ClassCastExceptionを拾って代理のオブジェクトを格納したりして回避した orz

今はTomcatのセッションを直接使用しない方向にしています

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

Copyright (c) 2012 Interfactory, Inc. All Rights Reserved.

突っ込んだ話 その2

デザインドリブンのための を実現するための

Mayaa入門

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

Copyright (c) 2012 Interfactory, Inc. All Rights Reserved.

Mayaaとは

MayaaはSeasar2系の日本発オープンソースライブラリですが、Seasar2に関係なく使用すること

ができます。JSPと同じレイヤーで動作し、JSPのようにServletからforwardして使うことができます。

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

Copyright (c) 2012 Interfactory, Inc. All Rights Reserved.

Mayaa導入のbefore/after

before

開発者<=====(見えない壁)====>デザイナー

after

プログラマーはJSPのコーディングから開放されて嬉しい!

デザイナーはプログラマーの力を借りずに思い通りに動かせ

て楽しい!

デザイナーとプログラマーの会話が増加

まさにコラボレーションしている!

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

Copyright (c) 2012 Interfactory, Inc. All Rights Reserved.

デザイナーとの協業の推進

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のパラメータ化

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

Copyright (c) 2012 Interfactory, Inc. All Rights Reserved.

マルチテナントとMayaa

通常のMayaaは1テンプレート1Mayaaファイル

同じ制御で見た目違いを量産したい!

見た目だけじゃなく、m:idを追加したい

Mayaaの拡張性は神!

DIのような仕組みあり

Mayaa自体を再コンパイル

せずに機能を書き換えられる!

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

Copyright (c) 2012 Interfactory, Inc. All Rights Reserved.

Mayaaカスタマイズの勘所

SourceDescriptor

Mayaaのパス(SystemID)と実際に読み込む

ファイルをハンドリングする時に利用

PathAdjuster

テンプレート上に入力された相対パスをハンドリングするときに利用、上手く使えば

m:idの数を大幅に減らすことができます

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”>

function $p(param) {

var attr = originalNode.getAttribute(Packages.org.seasar.mayaa.impl.engine.specification.SpecificationUtil.createQName(param));

if (attr == null) return "";

return attr.value;

}

<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>

一つのページのバリエーション

+ 英語/日本語

+ スマートフォン/PC

+ プレビュー/非プレビュー

+ 本体/カスタマイズ

16通り

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

Copyright (c) 2012 Interfactory, Inc. All Rights Reserved.

突っ込んだ話 その3

SaaSの宿命! パフォーマンスとの闘い

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

Copyright (c) 2012 Interfactory, Inc. All Rights Reserved.

クラウド時代はパフォーマンスが重要!

パフォーマンスが良い

⇒1サーバーあたりに捌けるクライアント数が多い

⇒コスト削減!! ( ←逆も真 )

そこで

パフォーマンス計測

JMeter, JVisualVmでの計測

パフォーマンスチューニングの徹底

SQLチューニング

キャッシュ(FullGCに注意!)

我々はパフォーマンスとの闘いでした

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

Copyright (c) 2012 Interfactory, Inc. All Rights Reserved.

パフォーマンス対策事例

2011年8月某クライアントにて昼休み 頃に

5分未満の寸断発生、人気テレビ番組にテレビCMを出していた

緊急パフォーマンス・チューニング

DBのつなぎすぎが原因→ResultSetのキャッシュ化を推進

トップページでのSQLゼロ化

→この方針が後々苦労のもとに…… >_<

昼休みにみんなで監視

「お昼休みは~~♪」

瞬間最大 397PV/min

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

Copyright (c) 2012 Interfactory, Inc. All Rights Reserved.

パフォーマンス対策事例

2011年9月 某人気アイドルグループ公式オンラインショップ(その1)オープン

要求負荷分間1800PV 納期は2週間!!

パフォーマンス・チューニング (JVisualVMのプロファイラ使用しました)

SQL結果のキャッシュ化をさらに推進

DB接続フレームワーク改修

キャッシュしたためそもそも不要な場合が多いDBコネクション取得を抑制

PreparedStatementのキャッシュ効率改善

パフォーマンス計測(JMeterを使用)

1APあたり分間900PV測定、DBサーバへの負荷なし

インフラ増強 EC2インスタンスを増強2台→4台 (理論値3600PV/min)

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

Copyright (c) 2012 Interfactory, Inc. All Rights Reserved.

失敗事例

2012年6月某人気アイドルグループ公式オンラインショップ(その2)オープン

⇒オープン直後大量のシステムエラーが発生!!

•分間 3000PV を記録(実測最大)

•サイトが非常に重い!!!とTwitterで苦情の嵐!!

•なぜ?

•クレジットカードの与信待ちと在庫の引き当て

•カートの精算時、在庫整合性のため、在庫テーブルをロックする

•クレジットカードの与信には3秒 程度かかる

•その間在庫テーブルをロックしたまま

→事実上同時1注文しかさばけず、分間20回が最大でした

•アプリケーションの実装を改善して解決!

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

Copyright (c) 2012 Interfactory, Inc. All Rights Reserved.

失敗事例2

2012年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

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

Copyright (c) 2012 Interfactory, Inc. All Rights Reserved.

突っ込んだ話 その4

開発現場の事情

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

Copyright (c) 2012 Interfactory, Inc. All Rights Reserved.

SaaS開発の極意

SaaS事業を行う一番のメリットは=>集中投資ができる!

今まで

「こんなことがやりたい」「あんなこともやりたい」

→「予算が足りないから無理」

となっていたことはありませんでしょうか?

えびすマート以降の弊社開発チーム

一箇所を良くすれば、数十クライアント、及び将来すべてのク

ライアントのメリットになる!

→「やろう!」 継続的開発

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

Copyright (c) 2012 Interfactory, Inc. All Rights Reserved.

SaaS開発の怖さ

•一箇所の良くないコードがあると、全体に影響してしまう。

•使っていない機能と機能を組み合わせると動かなかったりする。

•思いもよらない機能の組み合わせをしているサイトがある。

•思いもよらないカスタマイズソースが入っているサイトがある。

もし、障害を起こすと……

全クライアント、社内全業務にご迷惑がかかる。

機会損失の総量:数百万から数千万、数億

そこで

品質管理を徹底!

テストの自動化

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

Copyright (c) 2012 Interfactory, Inc. All Rights Reserved.

肥大化するソース

ほうっておくとどんどん汚くなる………。

SourceMonitorで観測 (本体モジュールのみ)

総行数: 15万以上 (8万ステップ)

総クラス数: 850以上

Javaで良かった!

Eclipseのリファクタリング機能最高!

誰がどのメソッドを使用しているか一目瞭然!Ctrl+Alt+H

どの店舗がどのメソッドをカスタマイズしているか一目瞭然!Ctrl+T

一括でメソッド名変更簡単! Alt+Shift+R

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

Copyright (c) 2012 Interfactory, Inc. All Rights Reserved.

止まない要望

日々増えるタスク、バグ・要望・案件

進捗管理が手に負えない!

忙しいんだかそうでもないのか感覚が麻痺してくる

→PivotalTracker導入

Redmineなどよりシンプルで使いやすい。若干アジャイルの発想が必要

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

Copyright (c) 2012 Interfactory, Inc. All Rights Reserved.

SaaSの開発現場についてまとめると

常に考えなければならない

超刺激的!

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

Copyright (c) 2012 Interfactory, Inc. All Rights Reserved.

総まとめ

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

Copyright (c) 2012 Interfactory, Inc. All Rights Reserved.

えびすマートを支える技術

マルチテナント ー> クラスローダー

Seasar2のソースコードは勉強になりました!

デザインドリブン ー> Mayaa

プログラマーとデザイナーの協力が大切!

クラウド ー> パフォーマンスが命、かつ安全運転

JMeterとJVisualVM、キャッシュ、GCにも注意

大規模なソースコード ー> Java便利!

IDEの充実、静的型付け、開発者多い!

継続的な開発現場 ー> Pivotal Tracker、ユニットテスト、Selenium

日々品質を保つことを怠ってはだめ!

何一つ特別なことはなく、当たり前のことを日々勉強していくことが大切でした

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

Copyright (c) 2012 Interfactory, Inc. All Rights Reserved.

質問はありませんか?

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

Copyright (c) 2012 Interfactory, Inc. All Rights Reserved.

最後に一つ 言わせてください。。。

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

Copyright (c) 2012 Interfactory, Inc. All Rights Reserved.

インターファクトリーでは エンジニアを募集しています!

今日話すことができなかった

熱い技術トピック まだまだいっぱいあります!

技術が好きな方、 Javaが好きな方、

成長したい方待ってます! 一緒に成功しましょう!

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

Copyright (c) 2012 Interfactory, Inc. All Rights Reserved.

ご清聴ありがとうございました