クラウド・アプリケーションの作り方
DESCRIPTION
JJUG CCC 2009 Falledge2.ccの活動で得られたもの。TRANSCRIPT
クラウド・アプリケーションの作り方edge2.ccの挑戦
2009年10月8日
浅海智晴
edge2.cc/JJUG/匠Lab
edge2.cc
Edge to Cloud Computinghttp://www.edge2.ccモデル駆動開発×クラウドコンピューティングの実証プロジェクト
アプリケーション開発者の立場から、クラウド・アプリケーションの開発技法を確立する
要素技術、アーキテクチャ、モデリング、モデル駆動開発
モデル駆動開発の技術としてSimpleModeling&SimpleModelerを採用
ターゲットプラットフォームはGoogle App Engine Java
関連雑誌記事
『Cloud Modeling:クラウド時代のモデリング技術』
UNIXマガジン 2009年春号
『マルチパラダイム言語Scala』ITアーキテクト誌 Vol.24 (7月25日発売)
『クラウド時代のWebアプリ開発作法』ITアーキテクト誌 Vol.25 (9月25日発売)
『実証研究プロジェクト「edge2.cc」の挑戦 : アプリ開発者の目線で探るクラウドの可能性と実装手段』
DBマガジン誌 11月号(9月25日発売)
目次
クラウド・アプリケーション
SimpleModelerとDSL駆動開発
edge2.cc
目次
クラウド・アプリケーション
SimpleModelerとDSL駆動開発
edge2.cc
クラウド・アプリケーション
WebアプリケーションWeb UIからWeb GUIへクライアント/サーバ時代のGUIをWebで実現
HTML5
スケーラビリティ非同期処理、並行処理、分散処理
ACIDからBASEへ
Key/Valueストレージ
分散アプリケーション故障と遅延への対応
逐次処理から並行処理へ
クラウド・アプリケーションの三つの技術
UIWeb UIからWeb GUIへ
データベースKVS over RDBMS
並列分散処理
メッセージング指向
Google App Engine
Googleが提供するクラウド・プラットフォームPython版:2008年4月リリース
Java版:2009年4月リリース
Googleの分散基盤であるBigTable, MapReduceなどをバックグランドにしている本格的なクラウド・プラットフォーム
PythonやJava向けに仮想的なAPIを提供BigTableやMapReduceを直接利用できるわけではない
Google App Engine Java
最新バージョン1.2.5基本的にはServletコンテナ使用できるAPIが限られているので、フレームワークなどは完全には動作しない。RDBMSはサポートしておらず、JDBC/SQLは使用できない。DataStoreというKVS(Key/Value Storage)のみをサポートしている。
JDO/JPA/専用APIのいずれかを使用してアクセス
非同期処理の実現は手段が限られるスレッドは使用できないMOM(Message Oriented Middleware)は未サポートCronによる定期的な実行1.2.5からexperimentalとしてTaskQueueをサポート
Google App Engine Java 1.2.5主な機能
APIServletDataStoreMemcacheURL FetchMailXMPPImagesGoogle AccountsTask Queue (Experimental)
開発環境SDKEclipse Plugin
ツールGoogle Web Tookit(Eclipse Pluginに同梱)
GWT (Google Web Toolkit)
Javaで記述したGUIコードをJavaScriptにコンパイル
Web GUIを実現
クライアントとサーバ間の通信は専用RPCJavaのスキルでWeb UIを構築
Eclipse Plugin上のJavaでデバッグもできる
クロスブラウザにも対応
UI:Web UIからWeb GUIへ
HTML5(+Open Web Platform)によって、Webブラウザ上で通常の(クライアント・サーバ時代の)GUIの構築が可能になる。
Web GUI
Web UIからWeb GUIへController/Action/TemplateによってHTMLをサーバ側で生成するアーキテクチャ→REST(HTTP+JSON/XML)で必要な情報のみをサーバから取得
MVC2(Webアプリケーション向け)から、MVCへ(GUIアプリケーション向け)
UI:Google App Engine Java
クライアント側の技術には非依存HTML4でもFlashでもHTML5でも大丈夫
リフレクションやスレッドなどの機能を利用した既存のフレームワークが使えない可能性が高い
サーバ側の開発手法は変わるかも
HTML5&RESTWeb GUI向けのWebサーバとしての機能を実現する必要があるので、結局の所、サーバー側がの開発手法は変わることになる
GWTも有力な選択肢
データベース:KVS over RDBMS
KVS(Key/Value Store)クラウドで用いられる大規模分散データストアKey/Value型
KVSの用途スケーラビリティの必要な大容量データ超安価なデータストア
KVSはRDBMSの以下の機能を持っていない。トランザクション処理SQLのJOIN、集計機能などER図でのモデリングが(そのままでは)利用できない
KVSとRDBMSの使い分けが重要なポイントできるだけKVSを使いたい
KVS:超安価、スケーラビリティ
データベース:Google App Engine Java
Google App EngineではKVSのみをサポート(DataStore)
RDBMS/SQLは使用する事ができない
良い事:コストが超安価
悪い事:RDBMS/SQLが持つ強力なトランザクション機能や検索・集計処理を利用することができない
RDBMS/SQL指向のアプリケーション開発手法を用いることができないので、アプリケーション開発手法の根本的な見直しが必要
並列分散処理:メッセージング指向
非同期、並列、分散を処理するために、メッセージング機能を活用。MOM(Message Oriented Middleware)
Peer-to-Peer, Publisher/SubscribeJavaの場合はJMS(Java Messaging Service)
並列分散処理フレームワークMapReduce/Hadoopメッセージング機能の上に統合されるのでは?
メッセージングを行うための統合フレームワークメッセージングの次の段階Apache Camelなど
並列分散処理:Google App Engine Java
MOMはGoogle App Engineではまだ用意されていない
スレッドをGoogle App Engineで使用することはできない
MapReduce機能はアプリケーション向けには提供されていない
並列分散処理を記述するためのプリミティブ機能CronTaskQueue (試験的な提供)
現時点ではTaskQueue機能を用いてアプリケーションで実装する必要がある。
クラウド・アプリケーションのアーキテクチャ
プレゼンテーション層
サーバ側クラウド・アプリケーション
統合層
サービス
サービス
KVS
RDBMS
メッセージ・キュー
:アクセス方式4 手続き呼出し、性能特性 障害特性がローカル
。の手続き呼び出しよりも脆弱
:アクセス方式5 メッセージング。分散環境での連携に適応する特性をもつ
:アクセス方式2 KVS。一般のデータはKVSに格納するのが望ましい
アクセス方式3:RESTWebページを手繰って情報を取得する
アクセス方式1: RDBMSACID特性を要求されるデータはRDBMSに
。格納する
サービス
ドメイン層
ビジネス層
プレゼンテーション層
REST
統合層
アプリケーションの論理的な構成は従来のものと変わらない
クライアント側
HTML5
サービス
クライアントはWebブラウザ上で動作するHTML5で本格的なGUI
。を構築する
プレゼンテーション層はWeb指、向のMVC2ではなく クライアント
。/サーバ時代のGUIに回帰する
、サーバ側では GUIが使用する。サービスを提供する
クラウド・アプリケーションのアーキテクチャ例
クラウド・アプリケーション
サービス
メッセージ・キュー
サービス
メッセージ・キュー
プレゼンテーション
サービス
サービス
REST
サービス
KVS
マスターデータなど更新頻度が低いデータは。KVSで配布して直接参照する
バックエンドのサービス群もメッセージによ。って連携
、結果を直接知りたい場合には 手続き呼。び出しで同期型の連携を行う
この形式の連携を行うとスケーラビリティが。低くなる
プレゼンテーションの段階でできることをや、っておくと スケールアウトの効果によって
。スケーラビリティが高まる 外部サービスからRESTを用いて情報を取
。得するのが典型的な利用方法
KVSデータベースをアクセスするスコープは
。サービスに閉じておくのがよい
。サービス利用の主力はメッセージである この形式の連携を行うとスケールアウトに
。よってスケーラビリティを確保できる
メッセージ送信
同期通信
メッセージ配信
RDBMS
。KVSとRDBMSを適材適所で使い分ける 。可能であればKVSを使うのが望ましい
クラウド・アプリケーションへの移行パス
第 一 段 階導 入
第 二 段 階過 渡 期
第 三 段 階本 格 適 用
H T M L5
R D B M SK V S
負 荷 分 散
H T M L5
K V SR D B M S
H T M L5
K V SR D B M S
負 荷 分 散非 同 期
分 散 処 理イ ベ ン ト 駆 動
負 荷 分 散(非 同 期 )
R ESTA tom P ub
メ ッ セ ー ジ ン グ
U I
デ ー タ ベ ー ス
ス ケ ー ラ ビ リ テ ィ
フ レ ー ム ワ ー ク
サ ー ビ ス 利 用 R ESTA tom P ub
メ ッ セ ー ジ ン グ
R EST
イ ン テ グ レ ー シ ョ ン ・フ レ ー ム ワ ー ク
目次
クラウド・アプリケーション
SimpleModelerとDSL駆動開発
edge2.cc
DSL駆動開発&コンポーネント
OO分析
DSL
DSL
OO設計 OO実装
DSL
OO設計 OO実装
コンポーネント
コンポーネント
コンポーネント
コンポーネント
コンポーネント
自動生成
自動生成
自動生成
OO分析
分析 設計 実装
PIM/PSM/実装
実装、 、(Java XML …)
PSM
PIM
非機能要求 プラットフォーム
CIM
CIM : Computer Independent ModelPIM : Platform Independent ModelPSM : Platform Specific ModelDSL: Domain Specific Language
DSL
DSL
フレームワーク vs 自動生成
Google App Engine
フレームワーク
定義ファイル
アプリケーション
Google App Engine
フレームワーク
定義ファイル
アプリケーション
アプリケーション
フレームワークアプローチ
自動生成アプローチ
DSL
自動生成
SimpleModelingの本
SimpleModeler
http://code.google.com/p/simplemodeler/SimpleModeling用モデル・コンパイラ
テキストDSLScala DSLScala DSL&mavenによるモデル・リポジトリ
Web仕様書、Java、Grails、Google App Engine Python/Javaを生成
SimpleModelerの動作
企画中
CSV
Mindmap(Xmind)
SimpleModelリポジトリ(Maven project)
Web仕様書
クラス図
Javaプログラム
Grailsプログラム
convert
import
import
html
java
grails
project
Scala DSL
Excel
import
検証結果
verify
ステートマシーン図
Google App Engine/Pythonプログラム
Google App Engine Oilプログラム
gae
gaeo
テストセット
testset
Google App Engine/Javaプログラム
gaej
SimpleModelerCSVで記述できること
yorozu.csv
#actor,base,parts,attrs,powers,states,roles顧客,,,住所個人顧客,顧客,,,性別(男性;女性)法人顧客,顧客従業員,,,,,,店員#role店員#resource商品,,製品+,,,商品状態(入荷待;在庫中;配送中;販売完)製品#event顧客取引,,顧客;店員顧客購入,顧客取引,商品+
SimpleModelerマインドマップ(XMind)
SimpleModelerScala DSLpackage com.yorozu
import org.simplemodeling.dsl._import org.simplemodeling.dsl.datatype._import org.simplemodeling.dsl.domain._import org.simplemodeling.dsl.domain.values._
case class DER製品 extends DomainResource {term = "製品"caption = "製品"brief = <t></t>description = <text></text>
id("製品Id", DVI製品Id())attribute("製品Name", DVN製品Name())
}
case class DVI製品Id extends DomainValueId {
term = "製品Id"caption = "製品Id"brief = <t></t>description = <text></text>
attribute("value", XString)}
case class DVN製品Name extends DomainValueName {
term = "製品Name"caption = "製品Name"brief = <t></t>description = <text></text>
attribute("value", XString)}
SimpleModelerWeb仕様書
SimpleModelerクラス図
SimpleModelerScala DSL→ステートマシーン図
package com.yorozu
import org.simplemodeling.dsl._import org.simplemodeling.dsl.datatype._import org.simplemodeling.dsl.domain._import org.simplemodeling.dsl.domain.values._
case class DER商品 extends DomainResource {term = "商品"caption = "商品"brief = <t></t>description = <text></text>
id("商品Id", DVI商品Id())attribute("商品Name", DVN商品Name())association("製品", DER製品(), OneMore)statemachine(DM商品状態())
}
・・・中略・・・case class DM商品状態 extends DomainStateMachine {
term = "商品状態"caption = "商品状態"brief = <t></t>description = <text></text>
state(DMS入荷待())state(DMS在庫中())state(DMS配送中())state(DMS販売完())
}
case class DMS入荷待 extends DomainState {term = "入荷待"caption = "入荷待"brief = <t></t>description = <text></text>
transition(DEE商品入荷(), DMS在庫中())}
case class DMS在庫中 extends DomainState {term = "在庫中"caption = "在庫中"brief = <t></t>description = <text></text>
transition(DEE顧客購入(), DMS配送中())transition(DEE顧客購入(), DMS販売完())
}
case class DMS配送中 extends DomainState {term = "配送中"caption = "配送中"brief = <t></t>description = <text></text>
transition(DEE商品配送(), DMS販売完())}
case class DMS販売完 extends DomainState {term = "販売完"caption = "販売完"brief = <t></t>description = <text></text>
}
SimpleModelerステートマシーン図と状態遷移表
SimpleModelerGoogle App Engine/Java Servlet/JSP/Dojo Toolkit
SimpleModelerGoogle App Engine/JavaGoogle Web Toolkit
Google App Engine/Javaアプリケーション構成
index.jsp DEACustomerController
DSYorozuEntityRepositoryService
GwtYorozuEntityRepositoryServiceImpl
index.jspindex.jsp
index.jsp
index.html
GWTCustomerEditor
Dojoウィジェット
DataStore
GwtCustomer
<<document>>DDCustomer
HTML Form
GWT-RPC
Servlet
JSP
AtomYorozuDomainRepositoryServiceServlet
Atomクライアント
RESTYorozuDomainRepositoryServiceServlet
Webブラウザ(JavaScript)
Servlet
Servlet
Servlet
Atom
AtomPub
HTML FormJSON
JDO
<<entity>>DEACustomer
JDO
REST
AtomPub
GWT
Web Controller/Action/Template
EntityRepositoryService
SimpleModelerによるDSL駆動開発
ドメイン・モデル(概念モデル、論理モデル)からクラウド向けの物理モデルの自動生成
クラウド・アプリケーション開発で難易度が高く、煩雑なプログラムを自動生成
ユースケース・モデルドメイン・モデルの正当性を検証
サービス・モデルを抽出
サービス・モデルRESTやAtomPubなどのサービスのAPIとエントリポイントを自動生成
edgeSNSの開発を通じて実用化していく
目次
クラウド・アプリケーション
SimpleModelerとDSL駆動開発
edge2.cc
edge2.cc
Edge to Cloud Computinghttp://www.edge2.ccモデル駆動開発×クラウドコンピューティングの実証プロジェクト
アプリケーション開発者の立場から、クラウド・アプリケーションの開発技法を確立する
要素技術、アーキテクチャ、モデリング、モデル駆動開発
モデル駆動開発の技術としてSimpleModeling&SimpleModelerを採用
ターゲットプラットフォームはGoogle App Engine Java
TwitterRecommender
Twitterを使用した集合知アプリケーションTwitterから収集したフレンド、フォロワーのリンクからソーシャルグラフを生成して、フォロワーの推奨を行う
収集した情報をPC, iPhone, Androidで表示
目的Google App Engine/Python, Javaの味見
集合知アプリケーションの味見
SimpleModelerの活用(DSL駆動開発)モバイル技術
Google Developer Day Japan 2009のSandboxに出展
TwitterRecommender
TwitterRecommender
Android
iPhone
PC (JavaSE)
iPhone
Google App Engine Python
Google App Engine Java
TwitterRecommenderEngine
iTwitterRecommender
AtomPubサービス
データストアアクセス処理
データストア
Tiwtter Recommenderon SmertWeb
SimpleModeler
モデル
Safari
Chrome
HTML5
Gears onHTML4
Twitter Popper
XML
JSON
AtomPub
JDO
自動生成
Twitter XML
SmertWeb Framework
Sync+Offline
HTML5Offline
GearsOffline
TwitterRecommenderServlet
PC
WebブラウザHTML4
TwitterRecomenderで分かったこと
HTML + REST + JSONが便利。
iPhone&AndroidはHTML5とHTML4+Gearsでかなりのことができる。
用途に応じてAtomPub, JSON, XML用の配信サーブレットが自動生成されるのは便利(今回は使用しなかったがCSVの配信機能もある)
edge2.ccのアプローチ
UI: HTML5 (+ Open Web Platform & jQuery)
Webブラウザ側にUI処理を集約
サーバとの通信はREST(JSON)
データベース: KVSDataStore CRUD処理の自動生成
分散処理:メッセージングGoogle App Engine JavaではMOMは未サポート
Cron/TaskQueueを利用した非同期処理の自動生成
SimpleModelerのアプローチ
UI: HTML5 (+ Open Web Platform & jQuery)
REST Servletの自動生成
データベース: KVSDataStore CRUD処理の自動生成
分散処理:メッセージングGoogle App Engine JavaではMOMは未サポート
Cron/TaskQueueを利用した非同期処理の自動生成
edgeSNS
簡易版SNSSNS日記機能の実現
クラウド・アプリケーションの構築技術を追求するのを目的に、アプリケーションは平凡なものを選択
目的メッセージングの活用
非同期入出力の活用
メッセージング、非同期入出力の実現に対するSimpleModelerの活用
メッセージングを基盤にしたコンポーネント・ベース開発
考え方
スケーラビリティを高く
応答時間は短く
スループットは高く
ログは十分な情報量をたくさん取る
でも、計算時間とデータ量は気にしない
⇒できるだけ非同期処理化する
edgeSNS
Publish/Subscribe
日記の書き込み KVS
日記の書き込み
KVS
Web UI(HTML5)
Peer-to-Peer
日記形式の正規化
フレンド日記一覧の更新
Twitterメッセージの取り込み
Blog
SNS
Blogの取り込み
SNS日記の取り込み
REST
REST
REST
REST
Bad Message
通知メールの送信メール
、コンポーネントを追加することで 機能拡張を容易に行うことができる
I/Oエラーなどのエラー発生時はエラーの発生したメッセージをメッセージ・キュー
「 」 。 Bad Message に送信する
日記形式
Twitter形式
Blog形式
SNS日記形式
、Context Based Routerの手法で メッセ。ージ形式ごとにデータ変換を行う
々個 のメッセージ変換機はコンポーネン、 。トなので 容易に機能追加が可能
、Web UIはHTML5を用いて クライアント・。サーバ型のGUIとして構築する
クライアントとサーバ間の通信にはREST。を用いる
外部データの取り込みもコンポーネント、 。化されて 容易に機能拡張が可能
同期write +非同期ログwrite + 管理情報cache
Webブラウザ
アプリケーション(Servlet) Customer
Customer管理情報
TaskQueue
アプリケーション(Servlet)
処理結果ログ
memcache
アプリケーション(Servlet)
/_system/flush
/_system/event/log
/customer/c11/update-async?name=ABC_Taro
①
③
②
④
⑤
⑥
⑦
⑧
⑨
⑩
Cron
非同期write
Webブラウザ
アプリケーション(Servlet)
Customer
Customer管理情報
TaskQueue
アプリケーション(Servlet)
処理結果ログ
memcache
アプリケーション(Servlet)
/_system/flush
/customer/c11/update?name=ABC_Taro
/customer/c11/update-async?name=ABC_Taro
①
③
②
④⑤
⑥
⑦
⑧
⑨
⑩
Cron
powertype/区分コード
山田太郎 1
DP料金区分DEA顧客
無料
2 エントリ
3 プロフェッショナル
名前
12345ID ID 料金区分名
3料金区分
プロ料金区分
_料金区分名
2009-03-03料金区分_updated
updated
2008-10-10
2008-10-10
2009-05-05
<<actor>>DEA顧客
<<powertype>>DP料金区分
無料エントリプロフェッショナル
山田太郎
DD顧客
名前
12345ID
3料金区分
プロ料金区分
_料金区分名
モデルとレコード
山田太郎
DEE注文
発効日
1234567ID
23456顧客
山田太郎顧客_名前
注文詳細
<<event>>DEE注文
<<part>>DEP注文詳細
山田太郎
DEA顧客
名前
12345ID
1..*<<actor>>DEA注文
<<resource>>DER商品
1
DEP注文詳細
135
2 246
3 369
ID 商品 商品_名前 価格
みかん
りんご
ぶどう
100
80
120
個数
5
3
8
135
246
369
ID 商品_名前 価格
みかん
りんご
ぶどう
100
80
120
updated
2009-05-05
2009-05-05
2009-05-05
2009-03-03updated
DER商品
updated 2009-09-09
レコードの拡張プロパティ
ドメイン・モデルの情報に加えて、KVSで管理する上で必要なプロパティを追加タイムスタンプ(version)非正規化データAtomPubに必要な情報
feed用の情報updated, titleなど
entry用の情報published, updated, title, summaryなど
SimpleModelerで自動生成(予定含む)MDEntityInfo
テーブル管理情報
テーブル単位で保持しておく必要がある情報がある。
テーブル全体の更新時間(AtomPubで配信)レコード数、最大値、最小値アプリケーションが必要とするデータ
テーブルに対応する管理データを用意する必要がある。SimpleModelerで自動生成(予定含む)
memcacheをフロント、DataStoreバックエンド、キャッシュはread/writeロックを用いてスケーラビリティを確保(多分)MEEntityModelInfo
履歴管理
更新履歴の保存有無更新履歴の内容
更新日時・更新者レコード内容
更新履歴の管理方法同一レコード内で更新履歴を保持レコードは追加のみとして最新レコードをフラグで有効にする(一つ前のレコードの有効フラグをfalseにする)更新履歴テーブルを別に用意
参照履歴の保存有無参照履歴の内容
参照日時・参照者レコード内容
参照履歴の管理方法同一レコード内で参照履歴を保持参照履歴テーブルを別に用意
SimpleModelerで対応予定
話題
非正規化
事前集計count, max, minアプリケーションが必要とするデータ
スキーマ・エボリューション
AtomPubとの親和性
エラーへの対応リトライ必須、エラーログ
排他制御memcache counterを使ったread lock/write lock
EntityとDocumentの役割分担
まとめ
edge2.ccではクラウド・アプリケーションの開発を通して、アプリケーション開発技術の実証研究を行っている。クラウド・アプリケーションではアプリケーション開発技術が刷新される
UIWeb UIからWeb GUIへ
データベースKVS over RDBMS
並列分散処理メッセージング指向
DSL駆動開発の可能性を追求。