Weitere ähnliche Inhalte Ähnlich wie クラウド・アプリケーションの作り方 (20) Mehr von Tomoharu ASAMI (20) クラウド・アプリケーションの作り方2. edge2.cc
Edge to Cloud Computing
http://www.edge2.cc
モデル駆動開発×クラウドコンピューティングの実
証プロジェクト
アプリケーション開発者の立場から、クラウド・アプ
リケーションの開発技法を確立する
要素技術、アーキテクチャ、モデリング、モデル駆動開発
モデル駆動開発の技術として
SimpleModeling&SimpleModelerを採用
ターゲットプラットフォームはGoogle App Engine Java
6. クラウド・アプリケーション
Webアプリケーション
Web UIからWeb GUIへ
クライアント/サーバ時代のGUIをWebで実現
HTML5
スケーラビリティ
非同期処理、並行処理、分散処理
ACIDからBASEへ
Key/Valueストレージ
分散アプリケーション
故障と遅延への対応
逐次処理から並行処理へ
8. Google App Engine
Googleが提供するクラウド・プラットフォーム
Python版:2008年4月リリース
Java版:2009年4月リリース
Googleの分散基盤であるBigTable,
MapReduceなどをバックグランドにしている本格
的なクラウド・プラットフォーム
PythonやJava向けに仮想的なAPIを提供
BigTableやMapReduceを直接利用できるわけではな
い
9. 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をサポート
10. Google App Engine Java 1.2.5
主な機能
API
Servlet
DataStore
Memcache
URL Fetch
Mail
XMPP
Images
Google Accounts
Task Queue (Experimental)
開発環境
SDK
Eclipse Plugin
ツール
Google Web Tookit(Eclipse Pluginに同梱)
11. GWT (Google Web Toolkit)
Javaで記述したGUIコードをJavaScriptに
コンパイル
Web GUIを実現
クライアントとサーバ間の通信は専用RPC
JavaのスキルでWeb UIを構築
Eclipse Plugin上のJavaでデバッグもできる
クロスブラウザにも対応
12. 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ア
プリケーション向け)
13. UI:Google App Engine Java
クライアント側の技術には非依存
HTML4でもFlashでもHTML5でも大丈夫
リフレクションやスレッドなどの機能を利用した既存
のフレームワークが使えない可能性が高い
サーバ側の開発手法は変わるかも
HTML5&REST
Web GUI向けのWebサーバとしての機能を実現する必
要があるので、結局の所、サーバー側がの開発手法は
変わることになる
GWTも有力な選択肢
14. データベース:KVS over RDBMS
KVS(Key/Value Store)
クラウドで用いられる大規模分散データストア
Key/Value型
KVSの用途
スケーラビリティの必要な大容量データ
超安価なデータストア
KVSはRDBMSの以下の機能を持っていない。
トランザクション処理
SQLのJOIN、集計機能など
ER図でのモデリングが(そのままでは)利用できない
KVSとRDBMSの使い分けが重要なポイント
できるだけKVSを使いたい
KVS:超安価、スケーラビリティ
15. データベース:Google App Engine Java
Google App EngineではKVSのみをサポート
(DataStore)
RDBMS/SQLは使用する事ができない
良い事:コストが超安価
悪い事:RDBMS/SQLが持つ強力なトランザクション機
能や検索・集計処理を利用することができない
RDBMS/SQL指向のアプリケーション開発手法を
用いることができないので、アプリケーション開発手
法の根本的な見直しが必要
17. 並列分散処理:Google App Engine Java
MOMはGoogle App Engineではまだ用意されていない
スレッドをGoogle App Engineで使用することはできない
MapReduce機能はアプリケーション向けには提供されてい
ない
並列分散処理を記述するためのプリミティブ機能
Cron
TaskQueue (試験的な提供)
現時点ではTaskQueue機能を用いてアプリケーションで実
装する必要がある。
18. クラウド・アプリケーションのアーキテク
チャ
サーバ側では、 GUIが使用する
サービスを提供する。
クライアントはWebブラウザ上で
動作するHTML5で本格的なGUI
プレゼンテーション層
を構築する。
クラウド・アプリケーション
クライアント側 サーバ側 アプリケーションの論理的な構成は
従来のものと変わらない
プレゼンテーション層
HTML5 サービス
ビジネス層
ドメイン層
プレゼンテーション層はWeb指 統合層 アクセス方式1: RDBMS
向のMVC2ではなく、 クライアント ACID特性を要求されるデータはRDBMSに
アクセス方式4: 手続き呼出し
/サーバ時代のGUIに回帰する。 格納する。
性能特性、 障害特性がローカル
の手続き呼び出しよりも脆弱 。
アクセス方式5: メッセージング 統合層
分散環境での連携に適応する特性をもつ。 RDBMS
メッセージ・キュー
アクセス方式2: KVS
KVS 一般のデータはKVSに格納するのが望ましい 。
サービス REST
サービス
アクセス方式3:REST
Webページを手繰って情報を取得する サービス
19. クラウド・アプリケーションのアーキテク
チャ例
マスターデータなど更新頻度が低いデータは
KVSで配布して直接参照する 。
結果を直接知りたい場合には 、 手続き呼
KVS び出しで同期型の連携を行う。
この形式の連携を行うとスケーラビリティが
低くなる。
プレゼンテーションの段階でできることをや
っておくと 、 スケールアウトの効果によって クラウド・アプリケーション
スケーラビリティが高まる 。
外部サービスからRESTを用いて情報を取
得するのが典型的な利用方法 。 サービス利用の主力はメッセージである 。
プレゼンテーション サービス サービス
この形式の連携を行うとスケールアウトに
よってスケーラビリティを確保できる。
サービス バックエンドのサービス群もメッセージによ
メッセージ・キュー
REST って連携 。
サービス メッセージ・キュー
同期通信
サービス
メッセージ送信
メッセージ配信
KVS RDBMS
データベースをアクセスするスコープは
サービスに閉じておくのがよい 。
KVSとRDBMSを適材適所で使い分ける 。
可能であればKVSを使うのが望ましい 。
20. クラウド・アプリケーションへの移行パス
第一段階 第二段階 第三段階
導入 過渡期 本格適用
HTML5 HTM L5 HTML5
UI
RDBMS KVS KVS
KVS RDBMS RDBMS
データベース
負荷分散 負荷分散
負荷分散
(非 同 期 )
非同期
スケーラビリティ 分散処理
イベ ン ト駆 動
サービス利用 REST REST REST
A to m P u b A to m P u b
メッセ ー ジング メッセ ー ジン グ
イ ン テ グ レ ー シ ョン ・
フレームワーク フレームワーク
22. DSL駆動開発&コンポーネント
分析 設計 実装
DSL 自動生成 コンポーネント
OO分析
OO設計 OO実装 コンポーネント
DSL 自動生成 コンポーネント
DSL 自動生成 コンポーネント
OO分析
OO設計 OO実装 コンポーネント
23. PIM/PSM/実装
CIM : Computer Independent Model
DSL PIM : Platform Independent Model
CIM
PIM PSM : Platform Specific Model
DSL: Domain Specific Language
DSL
PSM
非機能要求 実装 プラットフォーム
(Java、 XML、 …)
24. フレームワーク vs 自動生成
アプリケーション
アプリケーション DSL
アプリケーション
自動生成
定義ファイル 定義ファイル
フレームワーク
フレームワーク
Google App Engine Google App Engine
フレームワーク 自動生成
アプローチ アプローチ
27. SimpleModelerの動作
Web仕様書
project クラス図
html
ステート
CSV import マシーン図
java
SimpleModelリポジトリ
(Maven project) Javaプログラム
convert
grails
Scala DSL
Grailsプログラム
import
gae
Mindmap
(Xmind)
Google App Engine/Python
プログラム
gaej
verify testset
import
Google App Engine/Java
gaeo プログラム
Excel
検証結果 テストセット Google App Engine Oil
プログラム
企画中
28. SimpleModeler
CSVで記述できること
yorozu.csv
#actor,base,parts,attrs,powers,states,roles
顧客,,,住所
個人顧客,顧客,,,性別(男性;女性)
法人顧客,顧客
従業員,,,,,,店員
#role
店員
#resource
商品,,製品+,,,商品状態(入荷待;在庫中;配送中;販売完)
製品
#event
顧客取引,,顧客;店員
顧客購入,顧客取引,商品+
30. SimpleModeler
Scala DSL
package com.yorozu case class DVI製品Id extends
DomainValueId {
term = "製品Id"
import org.simplemodeling.dsl._
caption = "製品Id"
import org.simplemodeling.dsl.datatype._
brief = <t></t>
import org.simplemodeling.dsl.domain._
description = <text></text>
import org.simplemodeling.dsl.domain.values._
attribute("value", XString)
case class DER製品 extends DomainResource {
}
term = "製品"
caption = "製品"
case class DVN製品Name extends
brief = <t></t> DomainValueName {
description = <text></text> term = "製品Name"
caption = "製品Name"
id("製品Id", DVI製品Id()) brief = <t></t>
attribute("製品Name", DVN製品Name()) description = <text></text>
}
attribute("value", XString)
}
33. SimpleModeler
Scala DSL→ステートマシーン図
package com.yorozu
case class DMS入荷待 extends DomainState {
import org.simplemodeling.dsl._ term = "入荷待"
import org.simplemodeling.dsl.datatype._ caption = "入荷待"
import org.simplemodeling.dsl.domain._ brief = <t></t>
import org.simplemodeling.dsl.domain.values._ description = <text></text>
case class DER商品 extends DomainResource { transition(DEE商品入荷(), DMS在庫中())
term = "商品" }
caption = "商品"
brief = <t></t> case class DMS在庫中 extends DomainState {
description = <text></text> term = "在庫中"
caption = "在庫中"
id("商品Id", DVI商品Id()) brief = <t></t>
attribute("商品Name", DVN商品Name()) description = <text></text>
association("製品", DER製品(), OneMore)
statemachine(DM商品状態()) transition(DEE顧客購入(), DMS配送中())
} transition(DEE顧客購入(), DMS販売完())
}
・・・中略・・・
case class DM商品状態 extends DomainStateMachine { case class DMS配送中 extends DomainState {
term = "商品状態" term = "配送中"
caption = "商品状態" caption = "配送中"
brief = <t></t> brief = <t></t>
description = <text></text> description = <text></text>
state(DMS入荷待()) transition(DEE商品配送(), DMS販売完())
state(DMS在庫中()) }
state(DMS配送中())
state(DMS販売完()) case class DMS販売完 extends DomainState {
} term = "販売完"
caption = "販売完"
brief = <t></t>
description = <text></text>
}
37. Google App Engine/Java
アプリケーション構成
Web Controller/
Action/Template HTML Form
JSP
index.jsp EntityRepositoryService
Servlet
Dojoウィジェット
index.jsp
index.jsp DEACustomerController
index.jsp
<<document>>
DDCustomer
GwtCustomer DSYorozuEntity
GWT RepositoryService
GWT-RPC JDO
index.html Servlet
<<entity>>
GwtYorozuEntity DEACustomer
GWTCustomer RepositoryServiceImpl
Editor
JDO
Atom
AtomPub
AtomPub Servlet
AtomYorozuDomain
Atomクライアント
RepositoryServiceServlet
DataStore
HTML Form
REST JSON
Servlet
Webブラウザ RESTYorozuDomain
(JavaScript) RepositoryServiceServlet
40. edge2.cc
Edge to Cloud Computing
http://www.edge2.cc
モデル駆動開発×クラウドコンピューティングの実
証プロジェクト
アプリケーション開発者の立場から、クラウド・アプ
リケーションの開発技法を確立する
要素技術、アーキテクチャ、モデリング、モデル駆動開発
モデル駆動開発の技術として
SimpleModeling&SimpleModelerを採用
ターゲットプラットフォームはGoogle App Engine Java
41. TwitterRecommender
Twitterを使用した集合知アプリケーション
Twitterから収集したフレンド、フォロワーのリンクから
ソーシャルグラフを生成して、フォロワーの推奨を行う
収集した情報をPC, iPhone, Androidで表示
目的
Google App Engine/Python, Javaの味見
集合知アプリケーションの味見
SimpleModelerの活用(DSL駆動開発)
モバイル技術
Google Developer Day Japan 2009の
Sandboxに出展
43. TwitterRecommender
iPhone
iTwitter
Recommender
XML Sync+
Offline
Google App Engine Java
Twitter XML iPhone
Google App Engine Python
Safari
TwitterRecommender HTML5 HTML5
Engine AtomPubサービス Tiwtter Recommender Offline
JSON on SmertWeb
Android
SmertWeb Framework
自動生成
Chrome
データストア Gears on Gears
アクセス処理 HTML4 Offline
SimpleModeler
JDO PC (JavaSE)
TwitterRecommender
Servlet
AtomPub Twitter Popper
モデル データストア
PC
HTML4 Webブラウザ
44. TwitterRecomenderで分かったこと
HTML + REST + JSONが便利。
iPhone&AndroidはHTML5と
HTML4+Gearsでかなりのことができる。
用途に応じてAtomPub, JSON, XML用の
配信サーブレットが自動生成されるのは便
利(今回は使用しなかったがCSVの配信機
能もある)
45. edge2.ccのアプローチ
UI: HTML5 (+ Open Web Platform &
jQuery)
Webブラウザ側にUI処理を集約
サーバとの通信はREST(JSON)
データベース: KVS
DataStore CRUD処理の自動生成
分散処理:メッセージング
Google App Engine JavaではMOMは未サポート
Cron/TaskQueueを利用した非同期処理の自動生成
46. SimpleModelerのアプローチ
UI: HTML5 (+ Open Web Platform &
jQuery)
REST Servletの自動生成
データベース: KVS
DataStore CRUD処理の自動生成
分散処理:メッセージング
Google App Engine JavaではMOMは未サポート
Cron/TaskQueueを利用した非同期処理の自動生成
47. edgeSNS
簡易版SNS
SNS日記機能の実現
クラウド・アプリケーションの構築技術を追求するのを目
的に、アプリケーションは平凡なものを選択
目的
メッセージングの活用
非同期入出力の活用
メッセージング、非同期入出力の実現に対する
SimpleModelerの活用
メッセージングを基盤にしたコンポーネント・ベース開発
49. edgeSNS
クライアントとサーバ間の通信にはREST
を用いる。
Web UIはHTML5を用いて、クライアント・
サーバ型のGUIとして構築する。
I/Oエラーなどのエラー発生時はエラーの Bad Message
発生したメッセージをメッセージ・キュー
「Bad Message」に送信する。
Web UI
REST 日記の書き込み
(HTML5)
日記の書き込み KVS
日記形式の正規化
Twitterメッセージの 日記形式
Twitter REST
取り込み
Publish/Subscribe
Twitter形式
Peer-to-Peer
フレンド日記一覧の更新 KVS
Blog形式
Blog REST Blogの取り込み
SNS日記形式
通知メールの送信
メール
SNS REST SNS日記の取り込み
Context Based Routerの手法で、 メッセ
ージ形式ごとにデータ変換を行う。
個々のメッセージ変換機はコンポーネン
トなので、容易に機能追加が可能。
コンポーネントを追加することで、 機
能拡張を容易に行うことができる
外部データの取り込みもコンポーネント
化されて、容易に機能拡張が可能。
50. 同期write +
非同期ログwrite + 管理情報cache
/customer/c11/update-async?name=ABC_Taro
アプリケーション ②
Web ① Customer
(Servlet)
ブラウザ
⑤
④
③
TaskQueue
⑥
/_system/event/log
アプリケーション 処理結果
(Servlet) ログ
⑦
memcache
⑨
/_system/flush
⑩
アプリケーション Customer
Cron
⑧ (Servlet) 管理情報
51. 非同期write
/customer/c11/update-async?name=ABC_Taro
アプリケーション
Web ①
(Servlet)
ブラウザ
③
②
TaskQueue
④
⑤ Customer
/customer/c11/update?name=ABC_Taro
アプリケーション
(Servlet)
⑦ 処理結果
⑥ ログ
memcache
⑨
/_system/flush
⑩
アプリケーション Customer
Cron
⑧ (Servlet) 管理情報
52. powertype/区分コード
<<actor>> <<powertype>>
DEA顧客 DP料金区分
無料
エントリ
プロフェッショナル
DD顧客 DEA顧客 DP料金区分
ID 12345 ID 12345 ID 料金区分名 updated
名前 山田太郎 名前 山田太郎 1 無料 2008-10-10
料金区分 3 料金区分 3 2 エントリ 2008-10-10
料金区分 料金区分
プロ プロ 3 プロフェッショナル 2009-05-05
_料金区分名 _料金区分名
料金区分
2009-03-03
_updated
53. モデルとレコード
1..*
<<actor>> <<event>> <<part>> <<resource>>
DEA注文 DEE注文 DEP注文詳細 DER商品
DEA顧客 DEE注文 DER商品
ID 12345 ID 1234567 ID 商品_名前 価格 updated
名前 山田太郎 発効日 山田太郎 135 みかん 100 2009-05-05
updated 2009-03-03 顧客 23456 246 りんご 80 2009-05-05
顧客_名前 山田太郎 369 ぶどう 120 2009-05-05
DEP注文詳細
ID 商品 商品_名前 価格 個数
1 135 みかん 100 5
注文詳細
2 246 りんご 80 3
3 369 ぶどう 120 8
updated 2009-09-09
56. 履歴管理
更新履歴の保存
有無
更新履歴の内容
更新日時・更新者
レコード内容
更新履歴の管理方法
同一レコード内で更新履歴を保持
レコードは追加のみとして最新レコードをフラグで有効にする(一つ前のレコードの有効フラグをfalseに
する)
更新履歴テーブルを別に用意
参照履歴の保存
有無
参照履歴の内容
参照日時・参照者
レコード内容
参照履歴の管理方法
同一レコード内で参照履歴を保持
参照履歴テーブルを別に用意
SimpleModelerで対応予定
57. 話題
非正規化
事前集計
count, max, min
アプリケーションが必要とするデータ
スキーマ・エボリューション
AtomPubとの親和性
エラーへの対応
リトライ必須、エラーログ
排他制御
memcache counterを使った
read lock/write lock
EntityとDocumentの役割分担