• Share
  • Email
  • Embed
  • Like
  • Save
  • Private Content
クラウド・アプリケーションの作り方
 

クラウド・アプリケーションの作り方

on

  • 13,079 views

JJUG CCC 2009 Fall

JJUG CCC 2009 Fall
edge2.ccの活動で得られたもの。

Statistics

Views

Total Views
13,079
Views on SlideShare
12,830
Embed Views
249

Actions

Likes
3
Downloads
76
Comments
0

10 Embeds 249

http://d.hatena.ne.jp 93
http://www.slideshare.net 80
http://papaganbarenikki.blogspot.com 33
http://iteman.tumblr.com 19
http://papaganbarenikki.blogspot.jp 19
http://www.health.medicbd.com 1
http://s.deeeki.com 1
http://webcache.googleusercontent.com 1
http://hatenatunnel.appspot.com 1
http://www.slideee.com 1
More...

Accessibility

Categories

Upload Details

Uploaded via as Adobe PDF

Usage Rights

© All Rights Reserved

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Processing…
Post Comment
Edit your comment

    クラウド・アプリケーションの作り方 クラウド・アプリケーションの作り方 Presentation Transcript

    • クラウド・アプリケーションの作り方 edge2.ccの挑戦 2009年10月8日 浅海智晴 edge2.cc/JJUG/匠Lab
    • edge2.cc Edge to Cloud Computing http://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ストレージ 分散アプリケーション 故障と遅延への対応 逐次処理から並行処理へ
    • クラウド・アプリケーションの三つの技術 UI Web 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 主な機能 API Servlet DataStore Memcache URL Fetch Mail XMPP Images Google Accounts Task Queue (Experimental) 開発環境 SDK Eclipse Plugin ツール Google Web Tookit(Eclipse Pluginに同梱)
    • GWT (Google Web Toolkit) Javaで記述したGUIコードをJavaScriptに コンパイル Web GUIを実現 クライアントとサーバ間の通信は専用RPC Javaのスキルで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&REST Web 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/Subscribe Javaの場合はJMS(Java Messaging Service) 並列分散処理フレームワーク MapReduce/Hadoop メッセージング機能の上に統合されるのでは? メッセージングを行うための統合フレームワーク メッセージングの次の段階 Apache Camelなど
    • 並列分散処理:Google App Engine Java MOMはGoogle App Engineではまだ用意されていない スレッドをGoogle App Engineで使用することはできない MapReduce機能はアプリケーション向けには提供されてい ない 並列分散処理を記述するためのプリミティブ機能 Cron TaskQueue (試験的な提供) 現時点ではTaskQueue機能を用いてアプリケーションで実 装する必要がある。
    • クラウド・アプリケーションのアーキテク チャ サーバ側では、 GUIが使用する サービスを提供する。 クライアントはWebブラウザ上で 動作するHTML5で本格的なGUI プレゼンテーション層 を構築する。 クラウド・アプリケーション クライアント側 サーバ側 アプリケーションの論理的な構成は 従来のものと変わらない プレゼンテーション層 HTML5 サービス ビジネス層 ドメイン層 プレゼンテーション層はWeb指 統合層 アクセス方式1: RDBMS 向のMVC2ではなく、 クライアント ACID特性を要求されるデータはRDBMSに アクセス方式4: 手続き呼出し /サーバ時代のGUIに回帰する。 格納する。 性能特性、 障害特性がローカル の手続き呼び出しよりも脆弱 。 アクセス方式5: メッセージング 統合層 分散環境での連携に適応する特性をもつ。 RDBMS メッセージ・キュー アクセス方式2: KVS KVS 一般のデータはKVSに格納するのが望ましい 。 サービス REST サービス アクセス方式3:REST Webページを手繰って情報を取得する サービス
    • クラウド・アプリケーションのアーキテク チャ例 マスターデータなど更新頻度が低いデータは KVSで配布して直接参照する 。 結果を直接知りたい場合には 、 手続き呼 KVS び出しで同期型の連携を行う。 この形式の連携を行うとスケーラビリティが 低くなる。 プレゼンテーションの段階でできることをや っておくと 、 スケールアウトの効果によって クラウド・アプリケーション スケーラビリティが高まる 。 外部サービスからRESTを用いて情報を取 得するのが典型的な利用方法 。 サービス利用の主力はメッセージである 。 プレゼンテーション サービス サービス この形式の連携を行うとスケールアウトに よってスケーラビリティを確保できる。 サービス バックエンドのサービス群もメッセージによ メッセージ・キュー REST って連携 。 サービス メッセージ・キュー 同期通信 サービス メッセージ送信 メッセージ配信 KVS RDBMS データベースをアクセスするスコープは サービスに閉じておくのがよい 。 KVSとRDBMSを適材適所で使い分ける 。 可能であればKVSを使うのが望ましい 。
    • クラウド・アプリケーションへの移行パス 第一段階 第二段階 第三段階 導入 過渡期 本格適用 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 メッセ ー ジング メッセ ー ジン グ イ ン テ グ レ ー シ ョン ・ フレームワーク フレームワーク
    • 目次 クラウド・アプリケーション SimpleModelerとDSL駆動開発 edge2.cc
    • DSL駆動開発&コンポーネント 分析 設計 実装 DSL 自動生成 コンポーネント OO分析 OO設計 OO実装 コンポーネント DSL 自動生成 コンポーネント DSL 自動生成 コンポーネント OO分析 OO設計 OO実装 コンポーネント
    • 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、 …)
    • フレームワーク vs 自動生成 アプリケーション アプリケーション DSL アプリケーション 自動生成 定義ファイル 定義ファイル フレームワーク フレームワーク Google App Engine Google App Engine フレームワーク 自動生成 アプローチ アプローチ
    • SimpleModelingの本
    • SimpleModeler http://code.google.com/p/simplemo deler/ SimpleModeling用モデル・コンパイラ テキストDSL Scala DSL Scala DSL&mavenによるモデル・リポジトリ Web仕様書、Java、Grails、Google App Engine Python/Javaを生成
    • 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 プログラム 企画中
    • SimpleModeler CSVで記述できること yorozu.csv #actor,base,parts,attrs,powers,states,roles 顧客,,,住所 個人顧客,顧客,,,性別(男性;女性) 法人顧客,顧客 従業員,,,,,,店員 #role 店員 #resource 商品,,製品+,,,商品状態(入荷待;在庫中;配送中;販売完) 製品 #event 顧客取引,,顧客;店員 顧客購入,顧客取引,商品+
    • SimpleModeler マインドマップ(XMind)
    • 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) }
    • SimpleModeler Web仕様書
    • SimpleModeler クラス図
    • 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> }
    • SimpleModeler ステートマシーン図と状態遷移表
    • SimpleModeler Google App Engine/Java Servlet/JSP/Dojo Toolkit
    • SimpleModeler Google App Engine/Java Google Web Toolkit
    • 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
    • SimpleModelerによるDSL駆動開発 ドメイン・モデル(概念モデル、論理モデル)からクラ ウド向けの物理モデルの自動生成 クラウド・アプリケーション開発で難易度が高く、煩雑なプ ログラムを自動生成 ユースケース・モデル ドメイン・モデルの正当性を検証 サービス・モデルを抽出 サービス・モデル RESTやAtomPubなどのサービスのAPIとエントリポイン トを自動生成 edgeSNSの開発を通じて実用化していく
    • 目次 クラウド・アプリケーション SimpleModelerとDSL駆動開発 edge2.cc
    • edge2.cc Edge to Cloud Computing http://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 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ブラウザ
    • 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) データベース: KVS DataStore CRUD処理の自動生成 分散処理:メッセージング Google App Engine JavaではMOMは未サポート Cron/TaskQueueを利用した非同期処理の自動生成
    • SimpleModelerのアプローチ UI: HTML5 (+ Open Web Platform & jQuery) REST Servletの自動生成 データベース: KVS DataStore CRUD処理の自動生成 分散処理:メッセージング Google App Engine JavaではMOMは未サポート Cron/TaskQueueを利用した非同期処理の自動生成
    • edgeSNS 簡易版SNS SNS日記機能の実現 クラウド・アプリケーションの構築技術を追求するのを目 的に、アプリケーションは平凡なものを選択 目的 メッセージングの活用 非同期入出力の活用 メッセージング、非同期入出力の実現に対する SimpleModelerの活用 メッセージングを基盤にしたコンポーネント・ベース開発
    • 考え方 スケーラビリティを高く 応答時間は短く スループットは高く ログは十分な情報量をたくさん取る でも、計算時間とデータ量は気にしない ⇒できるだけ非同期処理化する
    • 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の手法で、 メッセ ージ形式ごとにデータ変換を行う。 個々のメッセージ変換機はコンポーネン トなので、容易に機能追加が可能。 コンポーネントを追加することで、 機 能拡張を容易に行うことができる 外部データの取り込みもコンポーネント 化されて、容易に機能拡張が可能。
    • 同期write + 非同期ログwrite + 管理情報cache /customer/c11/update-async?name=ABC_Taro アプリケーション ② Web ① Customer (Servlet) ブラウザ ⑤ ④ ③ TaskQueue ⑥ /_system/event/log アプリケーション 処理結果 (Servlet) ログ ⑦ memcache ⑨ /_system/flush ⑩ アプリケーション Customer Cron ⑧ (Servlet) 管理情報
    • 非同期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) 管理情報
    • 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
    • モデルとレコード 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
    • レコードの拡張プロパティ ドメイン・モデルの情報に加えて、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ではクラウド・アプリケーションの開発を 通して、アプリケーション開発技術の実証研究を 行っている。 クラウド・アプリケーションではアプリケーション開発 技術が刷新される UI Web UIからWeb GUIへ データベース KVS over RDBMS 並列分散処理 メッセージング指向 DSL駆動開発の可能性を追求。