【17-c-2】 クラウド上でのエンタープライズアプリケーション開発
DESCRIPTION
Developers Summit 2011での発表資料小野和俊 氏 / 松本幹 氏 / 中村研二 氏 / 宮崎貴司 氏 / 渡辺俊史 氏 / 内藤浩史 氏MIJS製品技術強化委員会では2010年度の活動として、エンタープライズアプリケーションをクラウド上で動作させるための各種調査や実証実験を行っています。このセッションでは、ロック、トランザクション、読み取り一貫性など、エンタープライズシステムに求められる各種要件を含む「英会話教師予約システム」をWindows Azure、Google App Engine、Force.com、AWSそれぞれを用いて構築した実証実験に関する報告を行います。TRANSCRIPT
Developers Summit 2011
小野 和俊小野 和俊MIJS MIJS 製品技術強化委員会製品技術強化委員会
17-C-2
クラウド上でのクラウド上でのエンタープライズアプリケーションエンタープライズアプリケーション
開発開発
Developers Summit 2011
Developers Summit 2011
CAPCAP 定理と定理と NoSQLNoSQL
Developers Summit 2011
エンタープライズシステムとエンタープライズシステムとクラウドクラウド
即時一貫性がない 即時一貫性がない = = 使えない?使えない? RDBMSRDBMS を選べば「これまで通りに」シを選べば「これまで通りに」シ
ステムを構築することができるステムを構築することができる しかし、しかし、 NoSQLNoSQL を活用してこそクラウを活用してこそクラウ
ドの恩恵を最大限に受けることができるドの恩恵を最大限に受けることができる
・ NoSQL 縛りでエンタープライズアプリ開発・同一アプリを複数プラットフォームで
・ NoSQL 縛りでエンタープライズアプリ開発・同一アプリを複数プラットフォームで
Developers Summit 2011
課題の要件課題の要件 特定の要件を決めた英会話の講師予約シ特定の要件を決めた英会話の講師予約シ
ステムを作成して、以下項目を検証するステムを作成して、以下項目を検証することこと ロック制御ロック制御 トランザクショントランザクション 読み取り一貫性読み取り一貫性
極力極力 RDBMSRDBMS を使わず、を使わず、 NoSQLNoSQL を使用を使用するする
Developers Summit 2011
検証プラットフォーム検証プラットフォーム
Windows AzureWindows Azure Google App EngineGoogle App Engine Force.comForce.com Amazon Web ServicesAmazon Web Services
Developers Summit 2011
デモ
Developers Summit 2011
宮崎 貴司宮崎 貴司MIJS MIJS 製品技術強化委員会製品技術強化委員会
17-C-2
クラウド上でのクラウド上でのエンタープライズアプリケーションエンタープライズアプリケーション
開発開発
Windows AzureWindows Azure 編 編
Developers Summit 2011
環境環境
WebRole
WorkerRole
BLOB QUEUETABLE DRIVE
ServiceBus
AccessControl
SQL AZURE
VMRole
今回検証に利用した今回検証に利用した WindowsWindows AzureAzure のサービスのサービスは以下の赤枠の範囲であるは以下の赤枠の範囲である
Data Sync
Developers Summit 2011
Azure StorageAzure Storage のおさらいのおさらい Azure StorageAzure Storage のテーブルは以下が必須項目ですのテーブルは以下が必須項目です
PartitionKey PartitionKey :ノードを指定:ノードを指定 RowKeyRowKey :テーブルの:テーブルの RowIDRowID TimestampTimestamp ::読み取り専用読み取り専用
PartionKeyPartionKey が同じ場合には同じノードに格納されるが同じ場合には同じノードに格納されるPartionKey RowKey 項目 1 … 項目 N Timestamp
ノード 1 125634327 2000 … 雑誌 2010/10/5
ノード 1 1472899292 5000 … 参考書 2010/10/22
ノード 2 123456789 1000 … 本 2010/10/10
ノード 3 7732830930 3000 漫画 2010/10/26
ノード1 ノード 2 ノード 3
Developers Summit 2011
検証の課題検証の課題 Windows AzureWindows Azure プラットフォーム上において、プラットフォーム上において、
特定の要件を決めた英会話の講師予約システム特定の要件を決めた英会話の講師予約システムを作成して、以下項目を検証することを作成して、以下項目を検証すること ロック制御ロック制御 トランザクショントランザクション 読み取り一貫性読み取り一貫性
No 検証項目 要件
1 ロック制御 同じ日に二人の生徒が講師を予約できない
2 トランザクション
講師は指名を受けると報酬として手当てがもらえる
3 読み取り一貫性
指名ランク付け作業完了までは新ランキングが見えない
Developers Summit 2011
データモデルデータモデル
予約日 講師所属 - 登録日 予約日 予約講師名 予約生徒者 手当
20101010
大手町店 -20101010101011678 2010/10/10 10:10:11
山田太郎 斉藤次郎 1000
所属 講師登録日 講師名 誕生日 ランク イメージ URL サムネイルURL
大手町店 20101010101011678
山田太郎 2010/10/13 1 http://xxxxx http://xxxxx
予約・手当テーブル
予約日 :PatitionKey
講師所属 - 講師登録日 :RowKey
講師予約日
予約講師名
予約生徒者
手当て
講師テーブル
所属 :PartionKey
講師登録日 :RowKey
講師名
誕生日
ランク
写真 URL
写真サムネイル URL
予約・手当データ例
講師データ例
主要なデータモデルは以下のとおりです
Developers Summit 2011
楽観的ロックを実現するためには、エンティティのバージョンを確認する必要がある
検証結果<ロック制御>検証結果<ロック制御>
同じ日に二人の生徒が講師を予約できない
要件要件
Azure Storage ロック制御
悲観的ロックを実現するためには、 Azure Storage で制御することはできないため、アプリケーションで制御する必要がある
今回の対応予約テーブルのキーを講師予約日と予約講師のキー情報で一意キーとしているため、楽観的ロックをバージョン確認を行わずに要件を実現した
Developers Summit 2011
検証結果<トランザクション>検証結果<トランザクション> 要件
講師は指名を受けると報酬として手当てがもらえるデータモデル例では、予約情報と手当情報は分けて設計されていた
予約情報 手当情報 Azure Storage トランザクション制御
同じ PartionKey 内かつ 1 クエリ内のみサポートされ、異なるPartionKey や複数テーブル間でのトランザクションはサポートされない
今回の対応予約情報と手当情報を一つのテーブルにし、1クエリで予約&手当情報を取得、登録、更新、削除できるようにし、データの整合性が崩れないようにした
予約+手当情報
Developers Summit 2011
検証結果<読み取り一貫性>検証結果<読み取り一貫性> 要件
指名ランク付け作業完了までは新ランキングが見えない
Azure Storage 読み取り一貫性制御Azure Storage はダーティーリードは行われない
トランザクションは、同時に実行される他のトランザクションからのコミットされていない変更を認識せずに、クエリの実行が開始される前にコミットされた変更のみを認識する
今回の対応指名ランク付けを行うデータを同じテーブル、同じ PartitionKey のレコードで保持し、トランザクションを確保できるようにし、指名ランク付け更新が完了するまで、新しい指名ランクを参照できないようにした。
Developers Summit 2011
内藤 浩史内藤 浩史MIJS MIJS 製品技術強化委員会製品技術強化委員会
17-C-2
クラウド上でのクラウド上でのエンタープライズアプリケーションエンタープライズアプリケーション
開発開発
Google App EngineGoogle App Engine 編 編
Developers Summit 2011
Google App Engine
環境環境
1/7
データストアデータストアアプリケーション
実行環境
(python / java)
アプリケーション実行環境
(python / java)
slim3slim3
Developers Summit 2011
検証課題検証課題
2/7
Developers Summit 2011
①ロック制御ができていること
検証課題検証課題
②トランザクションを考慮した 作りになっていること
③読取一貫性に応じた 作りになっていること
3/7
Developers Summit 2011
ロック制御ロック制御
4/7
同一日付に講師が予約されない為には・・・同一日付に講師が予約されない為には・・・
予約 ID(キー)を日付+講師 ID で生成。 +登録されたデータに付与される「 version 」で楽観的排他を実現。( slim3 で付与・チェックが可能)
予約 ID(キー)を日付+講師 ID で生成。 +登録されたデータに付与される「 version 」で楽観的排他を実現。( slim3 で付与・チェックが可能)
Developers Summit 2011
トランザクショントランザクション
5/7
予約と手当の2つのテーブルにまとめて書き込みたい・・・予約と手当の2つのテーブルにまとめて書き込みたい・・・
グローバルトランザクションを利用してまとめて put する。
( slim3 でトランザクションを管理)
グローバルトランザクションを利用してまとめて put する。
( slim3 でトランザクションを管理)
Developers Summit 2011
読み取り一貫性読み取り一貫性
6/7
バッチ実行中に集計中ランキングが表示されないようにしたい・・・バッチ実行中に集計中ランキングが表示されないようにしたい・・・
集計トランザクションテーブルに集計ランキング結果を。集計ステータステーブルに集計ステータスを。
集計トランザクションテーブルに集計ランキング結果を。集計ステータステーブルに集計ステータスを。
Developers Summit 2011
結論結論
7/7
フレームワークを使おう。頭を柔らかくしよう。
フレームワークを使おう。頭を柔らかくしよう。
Developers Summit 2011
松本 幹松本 幹MIJS MIJS 製品技術強化委員会製品技術強化委員会
17-C-2
クラウド上でのクラウド上でのエンタープライズアプリケーションエンタープライズアプリケーション
開発開発
Force.comForce.com 編 編
Developers Summit 2011
環境環境
CR
M
SaaS
今回検証に利用した今回検証に利用した SalesForce.comSalesForce.com ののサービスは、サービスは、 force.comforce.com
Force.com
Heroku
VMforce
Developers Summit 2011
①ロック制御ができること
予約システム作成により以下を検証予約システム作成により以下を検証
②トランザクションを考慮した 作りになること
③読取一貫性に応じた 作りになること
Developers Summit 2011
Force.comForce.com の特徴の特徴
ステップ1MVC モデルを基本とし、全ての UI/ データ操作のユーティリティが存在する
ステップ2上級者向けに細かくロジックの修正や追加・削除が可能
ロック制御もトランザクション制御も、読取一貫性もすべてフレームワークが面倒みてくれる
簡単にアプリを作成できる仕掛けが満載
Developers Summit 2011
処理の中核を担う「 Model 」、表示・出力を司る「 View 」、入力を受け取ってその内容に応じて View と Model を制御する「 Controller 」の 3 要素の組み合わせでシステムを実装する方式。
MVCMVC フレームワークとは?フレームワークとは?
ControllerView と Model を制御
View結果画面を表示
Modelビジネスロジックを構築 DB
利用者
Developers Summit 2011
ControllerView と Model を制御
View結果画面を表示
Modelビジネスロジックを構築 DB
利用者
ステップ1:ノンプログラミングで開発ステップ1:ノンプログラミングで開発
GUI からテーブル
を作成可能
入力パターンチェックなら Excel と同じ感覚
で簡単に作成可能
最小セットは、最初から作成済
み
テーブルを作成すると、自動で作成
される
Developers Summit 2011
ControllerView と Model を制御
View結果画面を表示
Modelビジネスロジックを構築 DB
利用者
ステップ2:上級者向けカスタマイズステップ2:上級者向けカスタマイズ
独自ロジックを Java ライクな言語で追加可能
Apex コード
Apex コード
Developers Summit 2011
例:例: ApexApex コードコード 独自クエリ言語である SOQL をダイレクトに操作可能
作成したロジックを、指定したタイミング( CRUD操作の前後)で実施可能public class YoyakuUtil{
public static void isDuplicated(Yoyaku__c[] yList){ YoyakuLockManager__c[] l = [SELECT Lock__c FROM YoyakuLockManager__c FOR UPDATE ]; Yoyaku__c target = yList[0]; for(Yoyaku__c y:[SELECT TeacherID__c,YoyakuDate__c FROM Yoyaku__c WHERE YoyakuDate__c = :target.YoyakuDate__c AND GirlID__c = :target.GirlID__c AND ID <> :target.ID ] ) { target.addError(‘重複してます’ ); break; } target.UserID__c = UserInfo.getUserId(); } }
Apex コードでレコードへの登録重複チェックの例
SOQL をダイレクトに使
用
Developers Summit 2011
まとめまとめ
MVC フレームワークを装備し、かつカスタマイズ性も高く、生産性が高いことを実感
ロック制御・トランザクション制御・読取一貫性については、何の心配もない
Developers Summit 2011
CAPCAP 定理上の位置づけ定理上の位置づけ
一貫性( C)
一貫性( C)
可用性( A)可用性( A)
通信断耐性( P)
通信断耐性( P)
RDBMSAzure TableAWS RDS
BigTableBerkeleyDBMongoDB
AWS SimpleDBAzure Storage
Developers Summit 2011
Amazon SimpleDBAmazon SimpleDB の概要の概要
AWSAWS クラウド上で稼働するクラウド上で稼働する NoSQL NoSQL DB(DB( ドキュメント指向ドキュメント指向 ))
ErlangErlang で実装された分散型で実装された分散型 DBDB RESTREST によるアクセスが基本。によるアクセスが基本。 Java, Java,
PHP, C#, VB.Net APIPHP, C#, VB.Net API もも AWSAWS により提により提供されている供されている
Developers Summit 2011
Amazon SimpleDBAmazon SimpleDB
SDBSDB のデータ構造のデータ構造
ドメインドメイン
itemID itemType instrcutorName
customerName
reserveDate
i3-2010-08-31-08
I3 Cindy 高木浩二 2010-08-31
I3-2010-08-31-09
I3 Jacob 安藤裕子 2010-08-31アイ
テム
アトリビュート
バリューバリュー
Developers Summit 2011
Amazon SimpleDBAmazon SimpleDB
SimpleDBSimpleDB の制限の制限
ドメイン … 最大 100GBドメイン … 最大 100GB
itemID itemType instrcutorName
customerName
reserveDate
i3-2010-08-31-08
I3 Cindy 高木浩二 2010-08-31
I3-2010-08-31-09
I3 Jacob 安藤裕子 2010-08-31アイ
テム
最大256アトリビュート
最大 1024byte ( テキスト型のみ )最大 1024byte ( テキスト型のみ )
最大 100 ドメイン
アイテム x アトリビュート < 10億件
Developers Summit 2011
SimpleDBSimpleDB のクエリのクエリ SQLSQLライクだが、下記の構文のみサポートライクだが、下記の構文のみサポート
クエリ結果はクエリ結果は25002500件以下、または1件以下、または1MBMB以内以内 クエリは5秒以内クエリは5秒以内 述部述部 (Predicate)(Predicate) は20個以内は20個以内 1述部に1述部に2020比較まで比較まで 1述部には11述部には1attributeattribute のみのみ
select output_list from domain_name [where expression] [sort_instructions] [limit limit]
Developers Summit 2011
排他制御排他制御
String itemId = "i3-" + date;UpdateCondition condition = new UpdateCondition();condition.setExists(false);condition.setName("itemId");sdb.putAttributes(new PutAttributesRequest() .withDomainName(DOMAIN_NAME) .withItemName(itemId) .withExpected(condition) .withAttributes( createRepAttribute("itemType", "i3"),
….
putAttribute に条件をつけて、ユニーク制約を実現楽観的排他制御も実装可能
Developers Summit 2011
トランザクション概要トランザクション概要
トランザクション分離は提供されておらトランザクション分離は提供されておらず、ず、 READ_UNCOMMITTEDREAD_UNCOMMITTED相当相当
コミット、ロールバックの概念はないコミット、ロールバックの概念はない デフォルトの読み取り操作は、直近に書かれたデフォルトの読み取り操作は、直近に書かれた
データを読み取る保証はない。データを読み取る保証はない。 ただし、ただし、 20102010年年 22 月より、月より、 Consistent ReadConsistent Readオプションを提供し、読み取り時に指定するこオプションを提供し、読み取り時に指定することで読み取り操作以前に書き込まれたデータのとで読み取り操作以前に書き込まれたデータの取得を保証することができるようになった。取得を保証することができるようになった。
Developers Summit 2011
Consistent Read:Consistent Read: 同時読み同時読み書き書き デフォルト:読み取りデフォルト:読み取り 11 はは 10,20,NULL10,20,NULL のいずれのいずれ
か!か! Consistent Read=trueConsistent Read=true :読み取り:読み取り 11 はは 1010 かか
20→Tx20→Tx 分離なし!分離なし!
出所: Amazon Web Service
タイムライン
クライアント1
クライアント2
書き込み1
属性値 = 10属性値 = 10
書き込み2
属性値 = 20属性値 = 20
読み取り1
読み取り2
通常(Eventual)Read → 10 or 20 or 値なしConsistent Read → 20通常(Eventual)Read → 10 or 20 or 値なしConsistent Read → 20
通常(Eventual)Read → 10 or 20 or 値なしConsistent Read → 10 or 20通常(Eventual)Read → 10 or 20 or 値なしConsistent Read → 10 or 20
Developers Summit 2011
Consistent Read:Consistent Read: 同時書込同時書込みみ 読み取り読み取り 1, 21, 2 ともにともに CR=trueCR=true でも値はでも値は 1010 またはまたは
2020!! クライアントからは書き込みクライアントからは書き込み 22 が後に見えても、サーバ側のが後に見えても、サーバ側の処理順は異なるかもしれず、結果として、書き込み処理順は異なるかもしれず、結果として、書き込み 11 とと 22 ののどちらが後かは呼出し側からはわからないどちらが後かは呼出し側からはわからない
出所: Amazon Web Service
タイムライン
クライアント1
クライアント2
書き込み1
属性値 = 10属性値 = 10
書き込み2
属性値 = 20属性値 = 20
読み取り1
読み取り2
通常(Eventual)Read → 10 or 20 or 値なしConsistent Read → 10 or 20通常(Eventual)Read → 10 or 20 or 値なしConsistent Read → 10 or 20
通常(Eventual)Read → 10 or 20 or 値なしConsistent Read → 10 or 20通常(Eventual)Read → 10 or 20 or 値なしConsistent Read → 10 or 20
Developers Summit 2011
講師予約システム設計ポイント講師予約システム設計ポイント
ドメイン間のドメイン間の join Queryjoin Query はできないはできない →→非正規化し、関連する項目はなるべく1ドメイ非正規化し、関連する項目はなるべく1ドメイ
ンに統合するンに統合する ドメイン間のトランザクションなしドメイン間のトランザクションなし
→→一貫性を求められるデータは1ドメインに統合一貫性を求められるデータは1ドメインに統合するする
楽観的排他制御ができるのは楽観的排他制御ができるのは 1PutAttribute1PutAttributeだけ!だけ! →→例えば予約と手当は1アイテムに統合すべき例えば予約と手当は1アイテムに統合すべき
Developers Summit 2011
講師予約システム実装方針講師予約システム実装方針
ロック制御ロック制御 予約時にアイテム予約時にアイテム IDID でで Conditional UpdateConditional Update(既に存在(既に存在
すれば失敗)を行い楽観的排他制御を行うすれば失敗)を行い楽観的排他制御を行う
トランザクショントランザクション 全てのデータを1ドメインに格納全てのデータを1ドメインに格納 予約と手当は1アイテムとして登録予約と手当は1アイテムとして登録
読み取り一貫性読み取り一貫性 トランザクション分離がないため、バッチ処理中に書きトランザクション分離がないため、バッチ処理中に書き込まれたデータは除外する必要がある。過去時間でフィ込まれたデータは除外する必要がある。過去時間でフィルタリングし、実績を集計することにして対応ルタリングし、実績を集計することにして対応
Developers Summit 2011
実装中にわかったこと実装中にわかったこと Item#getAttributes()Item#getAttributes() が返すが返す AttributeAttribute の順序は定義の順序は定義順とは無関係順とは無関係
既存のアイテムに既存のアイテムに putput するとバリューは上書きではなするとバリューは上書きではなく追記く追記
クエリ中に存在しないクエリ中に存在しない AttributeAttribute 名を指定してもエラー名を指定してもエラーにならないにならない
定型的なスキーマを必要としない柔軟性の裏返し定型的なスキーマを必要としない柔軟性の裏返し
AttributeAttribute のの ValueValue がが NullNullだと、クエリに指定してあだと、クエリに指定してあってもっても SelectResultSelectResult にに AttributeAttribute が設定されてこないが設定されてこない
ValueValue はテキスト型のみで、集計関数がないはテキスト型のみで、集計関数がない ソートはサポートされているが、ソートはサポートされているが、 UTF-8UTF-8 の辞書順のみで、データの辞書順のみで、データ型を考慮したソートはアプリ側に委ねている型を考慮したソートはアプリ側に委ねている
Developers Summit 2011
まとめまとめ
NoSQLNoSQL にはには RDBMSRDBMS とは異なる「オプとは異なる「オプション」が用意されているション」が用意されている
NoSQLNoSQLベースでも工夫次第でエンターベースでも工夫次第でエンタープライズアプリケーションは構築可能プライズアプリケーションは構築可能