SlideShare a Scribd company logo
1 of 43
サンプルで学ぶ
Cassandraアプリケーションの
作り方
Cassandra Summit Tokyo 2017
森下 雄貴 (DataStax Japan合同会社)
スピーカー
森下 雄貴
(yuki@datastax.com)
- Solution Architect (ときどきSoftware Developer) @ DataStax
- Apache Cassandra™コミッター
© DataStax, All Rights Reserved.2
Apache Cassandra™ を使ってスケーラブルなアプリケー
ションを作りたい!
- サンプルアプリケーションがあることを知ってもらう。
- Apache Cassandraデータモデリングの概要を知る。
- ドライバーの使い方を知る。
© DataStax, All Rights Reserved.3
今日の目標
KillrVideo
© DataStax, All Rights Reserved.4
https://killrvideo.github.io/
KillrVideo
Apache Cassandra™ / DataStax Enterprise リファレンスアプリケーション
– https://killrvideo.github.io
– オープンソース (APLv2)
– スケーラブルなマイクロサービスアーキテクチャ
• サービスは Node.js/C#/Java の各言語で実装
– データベース層はApache Cassandra / DSE
• データモデリングのサンプル
• ドライバーの利用サンプル
5 © DataStax, All Rights Reserved.
KillrVideo
© DataStax, All Rights Reserved.6
KillrVideo
各層がスケーラブル
7
KillrVideo Web
アプリケーション
(node.js)
KillrVideo
マイクロサービス
Apache Cassandra /
DataStax Enterprise
© DataStax, All Rights Reserved.
KillrVideo
デモ環境
8
KillrVideo Web
アプリケーション
KillrVideo
マイクロサービス Apache Cassandra /
DataStax Enterprise
1ノード
etcd: サービスディスカバリー
サンプルデータ生成アプリ
© DataStax, All Rights Reserved.
利用している技術
- Docker
- 各構成要素(Web/サービス/DB)をコンテナ化
- node.js
- フロントエンドWebアプリケーション
- React/Redux/Falcor
- マイクロサービスの一つの実装言語
- gRPC
- サービスのインターフェース定義
- Java
- Spring Frameworkを利用してサービスを実装
- DataStax Enterprise
- Apache Cassandraをコアとしたデータベース
© DataStax, All Rights Reserved.9
タスク: コメント機能を作る
© DataStax, All Rights Reserved.10
タスク: コメント機能を作る
- コメント機能の概要
- ユーザーが動画にコメントを書く
- 各動画のページにその動画に書かれたコメントを新着順に表示する
- ユーザーは自分が投降したコメントをユーザーのページで見ることができる
© DataStax, All Rights Reserved.11
API
CommentService コメント用のサービス
- commentOnVideo
- 動画に紐づくコメントを登録する
- getCommentsByVideo
- 動画に紐づくコメントを取得する
- getCommentsByUser
- ユーザーに紐づくコメントを取得する
© DataStax, All Rights Reserved.12
gRPCサービスの定義
// Manages comments
service CommentsService {
// Add a new comment to a video
rpc CommentOnVideo(CommentOnVideoRequest) returns (CommentOnVideoResponse);
// Get comments made by a user
rpc GetUserComments(GetUserCommentsRequest) returns (GetUserCommentsResponse);
// Get comments made on a video
rpc GetVideoComments(GetVideoCommentsRequest) returns (GetVideoCommentsResponse);
}
© DataStax, All Rights Reserved.13
データモデリング
© DataStax, All Rights Reserved.14
コメント機能のデータモデリング
概念データ
モデル
アプリケー
ションワー
クフロー
マッピング
論理データ
モデル
最適化
物理データ
モデル
Cassandraデータモデリングの流れ
© DataStax, All Rights Reserved.15
Cassandraデータモデリングの原則
データを知る
クエリを知る
非正規化
– データをネストする
– データを重複して持つ
© DataStax, All Rights Reserved.16
データを知る
概念データモデル / ERD
© DataStax, All Rights Reserved.17
ユーザー 動画コメント
する
m n
id
名前
…
コメント
タイムス
タンプ
id
タイトル
…
クエリを知る
アプリケーションワークフロー
© DataStax, All Rights Reserved.18
クエリを知る
© DataStax, All Rights Reserved.19
動画に紐づくコメントを
取得する
Q2
ユーザーに紐づくコメントを
取得する
Q1
コメントサービスのアプリケーションワークフロー
Q1: ユーザーID をもとに動画のコメントを 投稿順(新しいものを先) に取得
Q2: ビデオID をもとにユーザーからのコメントを 投稿順(新しいものを先) に取得
なぜクエリを知ることが重要?
- クエリがスキーマデザインを決める
- クエリの変更はスキーマの変更を伴う可能性が高い
- Apache Cassandra™が得意なアクセスパターンに落とす
- 単一パーティションへのクエリー ◎
- 少数のパーティションへのクエリー 〇
- テーブルスキャン ×
- 複数テーブルへのアクセス ×
© DataStax, All Rights Reserved.20
非正規化
- 非正規化
- データをネストする
- クラスタリングカラム
- ユーザー定義型
- コレクション型
- データを重複して持つ
© DataStax, All Rights Reserved.21
非正規化
- クラスタリングカラム
- パーティションキーが親のエンティティを識別
- クラスタリングカラムの値が子のエンティティを識別
- クラスタリングカラムを増やすことで多階層のネストを実現
© DataStax, All Rights Reserved.22
非正規化
- データを重複して持つ
- クライアントサイドJOINよりも重複して持つほうがスケールする
© DataStax, All Rights Reserved.23
概念データ
モデル
アプリケー
ションワー
クフロー
マッピング
論理データ
モデル
最適化
物理データ
モデル
論理データモデルの成果物
© DataStax, All Rights Reserved.24
ERDとクエリに
マッピングルールとパターンを適用
論理データモデリングの成果物として
Chebotkoダイアグラムを作成
Chebotkoダイアグラム
© DataStax, All Rights Reserved.25
Chebotkoダイアグラム
© DataStax, All Rights Reserved.26
Chebotkoダイアグラム
© DataStax, All Rights Reserved.27
Chebotkoダイアグラム
© DataStax, All Rights Reserved.28
Chebotkoダイアグラム
© DataStax, All Rights Reserved.29
コメント機能のChebotkoダイアグラム
© DataStax, All Rights Reserved.30
Q2Q1
Q1: ユーザーID をもとに動画のコメントを 投稿順(新しいものを先) に取得
Q2: ビデオID をもとにユーザーからのコメントを 投稿順(新しいものを先) に取得
comments_by_user comments_by_video
userId
commentedAt
commentId
videoId
comment
videoId
commentedAt
commentId
userId
comment
K
C↑
C
K
C↑
C
コメント機能のChebotkoダイアグラム
TimeUUID
- Apache Cassandra のデータ型の一つ
- UUID version 1
- IDの中にタイムスタンプを持つ → ソート可能
© DataStax, All Rights Reserved.31
コメント機能のChebotkoダイアグラム
© DataStax, All Rights Reserved.32
Q2Q1
Q1: ユーザーID をもとに動画のコメントを 投稿順(新しいものを先) に取得
Q2: ビデオID をもとにユーザーからのコメントを 投稿順(新しいものを先) に取得
comments_by_user comments_by_video
userId
commentId
videoId
comment
videoId
commentId
userId
comment
K
C↑
K
C↑
コメント機能のデータモデリング
CQL DDL
© DataStax, All Rights Reserved.33
CREATE TABLE comments_by_video (
videoid uuid,
commentid timeuuid,
userid uuid,
comment text,
PRIMARY KEY (videoid, commentid)
) WITH CLUSTERING ORDER BY (commentid DESC);
CREATE TABLE comments_by_user (
userid uuid,
commentid timeuuid,
videoid uuid,
comment text,
PRIMARY KEY (userid, commentid)
) WITH CLUSTERING ORDER BY (commentid DESC);
Q1: SELECT commentid, videoid, comment FROM comments_by_user WHERE userid = ?
Q2: SELECT commentid, userid, comment FROM comments_by_video WHERE videoid = ?
アプリケーションの実装
© DataStax, All Rights Reserved.34
アプリケーションの実装
- DataStaxドライバーのセットアップ
- Apache Cassandra用
- DataStax Java Driver
- https://github.com/datastax/java-driver
- APLv2
- API: Cluster / Session
- DataStax Enterprise用
- DataStax Enterprise Java Driver
- https://github.com/datastax/java-driver-dse
- ライセンスは独自
- API: DseCluster / DseSession
© DataStax, All Rights Reserved.35
アプリケーションの実装
- Apache Cassandra / DataStax Enterprise への接続
© DataStax, All Rights Reserved.36
Builder clusterConfig = new Builder();
clusterConfig.addContactPoints(cassandraHosts)
.withPort(cassandraPort)
.withClusterName(CLUSTER_NAME);
…
DseCluster dseCluster = clusterConfig.build();
return dseCluster.connect(); // DseSessionオブジェクトを返す
アプリケーションの実装
- コメントを登録する
- コメントが登録されるとふたつのテーブルに登録しなければならない
- バッチ機能を利用してINSERT
© DataStax, All Rights Reserved.37
PreparedStatement commentsByUserPrepared = dseSession.prepare(
"INSERT INTO killrvideo.comments_by_user (userid, commentid, comment, videoid) VALUES (?, ?, ?, ?)"
).setConsistencyLevel(ConsistencyLevel.LOCAL_QUORUM);
…
BoundStatement bs1 = commentsByUserPrepared.bind(userId, commentId, comment, videoId);
BoundStatement bs2 = commentsByVideoPrepared.bind(videoId, commentId, comment, userId);
…
final BatchStatement batchStatement = new BatchStatement(BatchStatement.Type.LOGGED);
batchStatement.add(bs1);
batchStatement.add(bs2);
batchStatement.setDefaultTimestamp(now.getTime());
FutureUtils.buildCompletableFuture(dseSession.executeAsync(batchStatement))
…
アプリケーションの実装
- コメントを取得する
- ステートメントの組み立て
© DataStax, All Rights Reserved.38
PreparedStatement getVideoComments_startingPointPrepared = dseSession.prepare(
QueryBuilder.select()
.column("video_id")
.column("comment_id")
.column("user_id")
.column("comment")
.fcall("toTimestamp", QueryBuilder.column("comment_id")).as("comment_timestamp")
.from("killrvideo", "comments_by_video")
.where(QueryBuilder.eq("video_id", QueryBuilder.bindMarker()))
.and(QueryBuilder.lte("comment_id", QueryBuilder.bindMarker()))
).setConsistencyLevel(ConsistencyLevel.LOCAL_QUORUM);
アプリケーションの実装
- コメントを取得する
- 取得件数の指定とページング
© DataStax, All Rights Reserved.39
final Optional<String> pagingState = Optional.ofNullable(request.getPagingState())
.filter(StringUtils::isNotBlank);
…
statement = getUserComments_startingPointPrepared.bind()
.setUUID("userid", fromString(userId.getValue()))
.setUUID("commentid", fromString(startingCommentId.getValue()));
…
statement.setFetchSize(request.getPageSize());
pagingState.ifPresent( x -> statement.setPagingState(PagingState.fromString(x)));
…
Optional.ofNullable(commentResult.getExecutionInfo().getPagingState())
.map(PagingState::toString)
.ifPresent(builder::setPagingState);
アプリケーションの実装
- コメントを取得する
- クエリの実行結果の取得
© DataStax, All Rights Reserved.40
FutureUtils.buildCompletableFuture(dseSession.executeAsync(statement))
.handle((commentResult, ex) -> {
…
int remaining = commentResult.getAvailableWithoutFetching();
for (Row row : commentResult) {
CommentsByUser commentByUser = new CommentsByUser(
row.getUUID("userid"), row.getUUID("commentid"),
row.getUUID("videoid"), row.getString("comment")
);
commentByUser.setDateOfComment(
row.getTimestamp("comment_timestamp"));
builder.addComments(commentByUser.toUserComment());
if (--remaining == 0)
break;
}
…
アプリケーションの実装
- その他の実装サンプル
- オブジェクトマッパーの利用
- DSEの機能を利用して
- グラフ形式にデータを格納して、リアルタイムレコメンデーションのクエリを実行
- 全文検索インデックスを利用した検索
© DataStax, All Rights Reserved.41
さらに詳しく
© DataStax, All Rights Reserved.42
もっと詳しく!
- ダウンロードとフリーのオンライントレーニング
- 開発用途に無償利用可能
- DS201: Apache Cassandra入門
- DS220: データモデリング
- https://academy.datastax.com/
© DataStax, All Rights Reserved.43

More Related Content

What's hot

What's hot (20)

スケールアウトするPostgreSQLを目指して!その第一歩!(NTTデータ テクノロジーカンファレンス 2020 発表資料)
スケールアウトするPostgreSQLを目指して!その第一歩!(NTTデータ テクノロジーカンファレンス 2020 発表資料)スケールアウトするPostgreSQLを目指して!その第一歩!(NTTデータ テクノロジーカンファレンス 2020 発表資料)
スケールアウトするPostgreSQLを目指して!その第一歩!(NTTデータ テクノロジーカンファレンス 2020 発表資料)
 
Spanner移行について本気出して考えてみた
Spanner移行について本気出して考えてみたSpanner移行について本気出して考えてみた
Spanner移行について本気出して考えてみた
 
Javaコードが速く実⾏される秘密 - JITコンパイラ⼊⾨(JJUG CCC 2020 Fall講演資料)
Javaコードが速く実⾏される秘密 - JITコンパイラ⼊⾨(JJUG CCC 2020 Fall講演資料)Javaコードが速く実⾏される秘密 - JITコンパイラ⼊⾨(JJUG CCC 2020 Fall講演資料)
Javaコードが速く実⾏される秘密 - JITコンパイラ⼊⾨(JJUG CCC 2020 Fall講演資料)
 
PHPからgoへの移行で分かったこと
PHPからgoへの移行で分かったことPHPからgoへの移行で分かったこと
PHPからgoへの移行で分かったこと
 
トランザクションの設計と進化
トランザクションの設計と進化トランザクションの設計と進化
トランザクションの設計と進化
 
とにかく分かりづらいTwelve-Factor Appの解説を試みる
とにかく分かりづらいTwelve-Factor Appの解説を試みるとにかく分かりづらいTwelve-Factor Appの解説を試みる
とにかく分かりづらいTwelve-Factor Appの解説を試みる
 
ヤフー社内でやってるMySQLチューニングセミナー大公開
ヤフー社内でやってるMySQLチューニングセミナー大公開ヤフー社内でやってるMySQLチューニングセミナー大公開
ヤフー社内でやってるMySQLチューニングセミナー大公開
 
DevOps with Database on AWS
DevOps with Database on AWSDevOps with Database on AWS
DevOps with Database on AWS
 
SQLアンチパターン - 開発者を待ち受ける25の落とし穴 (拡大版)
SQLアンチパターン - 開発者を待ち受ける25の落とし穴 (拡大版)SQLアンチパターン - 開発者を待ち受ける25の落とし穴 (拡大版)
SQLアンチパターン - 開発者を待ち受ける25の落とし穴 (拡大版)
 
世界でいちばんわかりやすいドメイン駆動設計
世界でいちばんわかりやすいドメイン駆動設計世界でいちばんわかりやすいドメイン駆動設計
世界でいちばんわかりやすいドメイン駆動設計
 
A critique of ansi sql isolation levels 解説公開用
A critique of ansi sql isolation levels 解説公開用A critique of ansi sql isolation levels 解説公開用
A critique of ansi sql isolation levels 解説公開用
 
Postgres Playground で pgbench を走らせよう!(第35回PostgreSQLアンカンファレンス@オンライン 発表資料)
Postgres Playground で pgbench を走らせよう!(第35回PostgreSQLアンカンファレンス@オンライン 発表資料)Postgres Playground で pgbench を走らせよう!(第35回PostgreSQLアンカンファレンス@オンライン 発表資料)
Postgres Playground で pgbench を走らせよう!(第35回PostgreSQLアンカンファレンス@オンライン 発表資料)
 
#logstudy 01 rsyslog入門
#logstudy 01 rsyslog入門#logstudy 01 rsyslog入門
#logstudy 01 rsyslog入門
 
メンバーのスキルアップ、どうしてる? − Java 100本ノックで新加入メンバーを鍛えてみた −
メンバーのスキルアップ、どうしてる? − Java 100本ノックで新加入メンバーを鍛えてみた −メンバーのスキルアップ、どうしてる? − Java 100本ノックで新加入メンバーを鍛えてみた −
メンバーのスキルアップ、どうしてる? − Java 100本ノックで新加入メンバーを鍛えてみた −
 
Elasticsearchを使うときの注意点 公開用スライド
Elasticsearchを使うときの注意点 公開用スライドElasticsearchを使うときの注意点 公開用スライド
Elasticsearchを使うときの注意点 公開用スライド
 
世界一わかりやすいClean Architecture
世界一わかりやすいClean Architecture世界一わかりやすいClean Architecture
世界一わかりやすいClean Architecture
 
Spring Cloud Data Flow の紹介 #streamctjp
Spring Cloud Data Flow の紹介  #streamctjpSpring Cloud Data Flow の紹介  #streamctjp
Spring Cloud Data Flow の紹介 #streamctjp
 
イミュータブルデータモデルの極意
イミュータブルデータモデルの極意イミュータブルデータモデルの極意
イミュータブルデータモデルの極意
 
マイクロサービス 4つの分割アプローチ
マイクロサービス 4つの分割アプローチマイクロサービス 4つの分割アプローチ
マイクロサービス 4つの分割アプローチ
 
今こそ知りたいSpring Batch(Spring Fest 2020講演資料)
今こそ知りたいSpring Batch(Spring Fest 2020講演資料)今こそ知りたいSpring Batch(Spring Fest 2020講演資料)
今こそ知りたいSpring Batch(Spring Fest 2020講演資料)
 

Viewers also liked

Viewers also liked (12)

サンプルアプリケーションで学ぶApache Cassandraを使ったJavaアプリケーションの作り方
サンプルアプリケーションで学ぶApache Cassandraを使ったJavaアプリケーションの作り方サンプルアプリケーションで学ぶApache Cassandraを使ったJavaアプリケーションの作り方
サンプルアプリケーションで学ぶApache Cassandraを使ったJavaアプリケーションの作り方
 
メッセージキュー「Pulsar」の紹介 @OSC_20171007
メッセージキュー「Pulsar」の紹介 @OSC_20171007メッセージキュー「Pulsar」の紹介 @OSC_20171007
メッセージキュー「Pulsar」の紹介 @OSC_20171007
 
SpockからRSpecにきたときの気づき #coedorb
SpockからRSpecにきたときの気づき #coedorbSpockからRSpecにきたときの気づき #coedorb
SpockからRSpecにきたときの気づき #coedorb
 
メッセージキュー「Pulsar」の紹介 @JJUG_20170927
メッセージキュー「Pulsar」の紹介 @JJUG_20170927メッセージキュー「Pulsar」の紹介 @JJUG_20170927
メッセージキュー「Pulsar」の紹介 @JJUG_20170927
 
Open Liberty: オープンソースになったWebSphere Liberty
Open Liberty: オープンソースになったWebSphere LibertyOpen Liberty: オープンソースになったWebSphere Liberty
Open Liberty: オープンソースになったWebSphere Liberty
 
Javaアプリケーションの モダナイゼーションアプローチ
Javaアプリケーションの モダナイゼーションアプローチJavaアプリケーションの モダナイゼーションアプローチ
Javaアプリケーションの モダナイゼーションアプローチ
 
高速なソートアルゴリズムを書こう!!
高速なソートアルゴリズムを書こう!!高速なソートアルゴリズムを書こう!!
高速なソートアルゴリズムを書こう!!
 
Java9を迎えた今こそ!Java本格(再)入門
Java9を迎えた今こそ!Java本格(再)入門Java9を迎えた今こそ!Java本格(再)入門
Java9を迎えた今こそ!Java本格(再)入門
 
Another compilation method in java - AOT (Ahead of Time) compilation
Another compilation method in java - AOT (Ahead of Time) compilationAnother compilation method in java - AOT (Ahead of Time) compilation
Another compilation method in java - AOT (Ahead of Time) compilation
 
Selenide or Geb 〜あなたはその時どちらを使う〜
Selenide or Geb 〜あなたはその時どちらを使う〜Selenide or Geb 〜あなたはその時どちらを使う〜
Selenide or Geb 〜あなたはその時どちらを使う〜
 
Java SE 9の紹介: モジュール・システムを中心に
Java SE 9の紹介: モジュール・システムを中心にJava SE 9の紹介: モジュール・システムを中心に
Java SE 9の紹介: モジュール・システムを中心に
 
Spring Bootの本当の理解ポイント #jjug
Spring Bootの本当の理解ポイント #jjugSpring Bootの本当の理解ポイント #jjug
Spring Bootの本当の理解ポイント #jjug
 

Similar to サンプルで学ぶCassandraアプリケーションの作り方

Google Compute EngineとPipe API
Google Compute EngineとPipe APIGoogle Compute EngineとPipe API
Google Compute EngineとPipe API
maruyama097
 
Google Compute EngineとGAE Pipeline API
Google Compute EngineとGAE Pipeline APIGoogle Compute EngineとGAE Pipeline API
Google Compute EngineとGAE Pipeline API
maruyama097
 
インサイドShell:.NETハッキング技術を応用したPowerShell可視性の向上 by 丹田 賢
インサイドShell:.NETハッキング技術を応用したPowerShell可視性の向上 by  丹田 賢インサイドShell:.NETハッキング技術を応用したPowerShell可視性の向上 by  丹田 賢
インサイドShell:.NETハッキング技術を応用したPowerShell可視性の向上 by 丹田 賢
CODE BLUE
 

Similar to サンプルで学ぶCassandraアプリケーションの作り方 (20)

とある AWS サービスの運用移管〜データストア編〜 #jawsmeguro
とある AWS サービスの運用移管〜データストア編〜 #jawsmeguroとある AWS サービスの運用移管〜データストア編〜 #jawsmeguro
とある AWS サービスの運用移管〜データストア編〜 #jawsmeguro
 
Gaming cicd-pipeline gaming-technight-2
Gaming cicd-pipeline gaming-technight-2Gaming cicd-pipeline gaming-technight-2
Gaming cicd-pipeline gaming-technight-2
 
Microsoft open tech night 2020 feb18
Microsoft open tech night 2020 feb18Microsoft open tech night 2020 feb18
Microsoft open tech night 2020 feb18
 
ハイブリットクラウド環境におけるモダンアプリケーション開発
ハイブリットクラウド環境におけるモダンアプリケーション開発ハイブリットクラウド環境におけるモダンアプリケーション開発
ハイブリットクラウド環境におけるモダンアプリケーション開発
 
Google Compute EngineとPipe API
Google Compute EngineとPipe APIGoogle Compute EngineとPipe API
Google Compute EngineとPipe API
 
Google Compute EngineとGAE Pipeline API
Google Compute EngineとGAE Pipeline APIGoogle Compute EngineとGAE Pipeline API
Google Compute EngineとGAE Pipeline API
 
[db tech showcase Tokyo 2014] D33: Prestoで実現するインタラクティブクエリ by トレジャーデータ株式会社 斉藤太郎
[db tech showcase Tokyo 2014] D33: Prestoで実現するインタラクティブクエリ  by トレジャーデータ株式会社 斉藤太郎[db tech showcase Tokyo 2014] D33: Prestoで実現するインタラクティブクエリ  by トレジャーデータ株式会社 斉藤太郎
[db tech showcase Tokyo 2014] D33: Prestoで実現するインタラクティブクエリ by トレジャーデータ株式会社 斉藤太郎
 
今日から使えるCouchbaseシステムアーキテクチャデザインパターン集
今日から使えるCouchbaseシステムアーキテクチャデザインパターン集今日から使えるCouchbaseシステムアーキテクチャデザインパターン集
今日から使えるCouchbaseシステムアーキテクチャデザインパターン集
 
Tech Dojo 02/09 IBM Japan CSM
Tech Dojo 02/09 IBM Japan CSMTech Dojo 02/09 IBM Japan CSM
Tech Dojo 02/09 IBM Japan CSM
 
Introduction to New CloudWatch Agent
Introduction to New CloudWatch AgentIntroduction to New CloudWatch Agent
Introduction to New CloudWatch Agent
 
インサイドShell:.NETハッキング技術を応用したPowerShell可視性の向上 by 丹田 賢
インサイドShell:.NETハッキング技術を応用したPowerShell可視性の向上 by  丹田 賢インサイドShell:.NETハッキング技術を応用したPowerShell可視性の向上 by  丹田 賢
インサイドShell:.NETハッキング技術を応用したPowerShell可視性の向上 by 丹田 賢
 
[AWS Developers Meetup 2017] Developerのための ライブAWSウォークスルー 〜 AWS SDKの使い方 〜
[AWS Developers Meetup 2017] DeveloperのためのライブAWSウォークスルー 〜 AWS SDKの使い方 〜[AWS Developers Meetup 2017] DeveloperのためのライブAWSウォークスルー 〜 AWS SDKの使い方 〜
[AWS Developers Meetup 2017] Developerのための ライブAWSウォークスルー 〜 AWS SDKの使い方 〜
 
Prestoで実現するインタラクティブクエリ - dbtech showcase 2014 Tokyo
Prestoで実現するインタラクティブクエリ - dbtech showcase 2014 TokyoPrestoで実現するインタラクティブクエリ - dbtech showcase 2014 Tokyo
Prestoで実現するインタラクティブクエリ - dbtech showcase 2014 Tokyo
 
Migration to AWS part2
Migration to AWS part2Migration to AWS part2
Migration to AWS part2
 
(2017.6.2) Azure HDInsightで実現するスケーラブル分析環境
(2017.6.2) Azure HDInsightで実現するスケーラブル分析環境(2017.6.2) Azure HDInsightで実現するスケーラブル分析環境
(2017.6.2) Azure HDInsightで実現するスケーラブル分析環境
 
Kubernetes環境のアプリケーションバックアップソフトウェアKasten K10ご紹介
Kubernetes環境のアプリケーションバックアップソフトウェアKasten K10ご紹介Kubernetes環境のアプリケーションバックアップソフトウェアKasten K10ご紹介
Kubernetes環境のアプリケーションバックアップソフトウェアKasten K10ご紹介
 
[db tech showcase OSS 2017] A24: マイクロソフトと OSS Database - Azure Database for M...
[db tech showcase OSS 2017] A24: マイクロソフトと OSS Database - Azure Database for M...[db tech showcase OSS 2017] A24: マイクロソフトと OSS Database - Azure Database for M...
[db tech showcase OSS 2017] A24: マイクロソフトと OSS Database - Azure Database for M...
 
AWS Summit New York 2017 Keynote Recap
AWS Summit New York 2017 Keynote RecapAWS Summit New York 2017 Keynote Recap
AWS Summit New York 2017 Keynote Recap
 
BPStudy20121221
BPStudy20121221BPStudy20121221
BPStudy20121221
 
Webアプリに低レイテンシ・高可用性を求めるのは間違っているのだろうか
Webアプリに低レイテンシ・高可用性を求めるのは間違っているのだろうかWebアプリに低レイテンシ・高可用性を求めるのは間違っているのだろうか
Webアプリに低レイテンシ・高可用性を求めるのは間違っているのだろうか
 

More from Yuki Morishita

More from Yuki Morishita (12)

Apache cassandra v4.0
Apache cassandra v4.0Apache cassandra v4.0
Apache cassandra v4.0
 
DataStax EnterpriseでApache Tinkerpop入門
DataStax EnterpriseでApache Tinkerpop入門DataStax EnterpriseでApache Tinkerpop入門
DataStax EnterpriseでApache Tinkerpop入門
 
Apache tinkerpopとグラフデータベースの世界
Apache tinkerpopとグラフデータベースの世界Apache tinkerpopとグラフデータベースの世界
Apache tinkerpopとグラフデータベースの世界
 
DataStax Enterpriseによる大規模グラフ解析
DataStax Enterpriseによる大規模グラフ解析DataStax Enterpriseによる大規模グラフ解析
DataStax Enterpriseによる大規模グラフ解析
 
RDB開発者のためのApache Cassandra データモデリング入門
RDB開発者のためのApache Cassandra データモデリング入門RDB開発者のためのApache Cassandra データモデリング入門
RDB開発者のためのApache Cassandra データモデリング入門
 
分散グラフデータベース DataStax Enterprise Graph
分散グラフデータベース DataStax Enterprise Graph分散グラフデータベース DataStax Enterprise Graph
分散グラフデータベース DataStax Enterprise Graph
 
事例で学ぶApache Cassandra
事例で学ぶApache Cassandra事例で学ぶApache Cassandra
事例で学ぶApache Cassandra
 
Apache Cassandra最新情報まとめ
Apache Cassandra最新情報まとめApache Cassandra最新情報まとめ
Apache Cassandra最新情報まとめ
 
Datastax Enterpriseをはじめよう
Datastax EnterpriseをはじめようDatastax Enterpriseをはじめよう
Datastax Enterpriseをはじめよう
 
How you can contribute to Apache Cassandra
How you can contribute to Apache CassandraHow you can contribute to Apache Cassandra
How you can contribute to Apache Cassandra
 
CQL3 in depth
CQL3 in depthCQL3 in depth
CQL3 in depth
 
Cassandraのしくみ データの読み書き編
Cassandraのしくみ データの読み書き編Cassandraのしくみ データの読み書き編
Cassandraのしくみ データの読み書き編
 

サンプルで学ぶCassandraアプリケーションの作り方

Editor's Notes

  1. KillrVideoの説明
  2. デモ - ログイン - 動画ページ
  3. デモ環境 マイクロサービス部分はnode.jsアプリケーション
  4. コメント機能デモ
  5. 重複して持つため、Cassandraは"書き込み時にJOIN"するような形になる。複数のテーブルへ書き込みが発生する場合もある。 RDBでは正規化して"読み込み時にJOIN"。 クエリー: ある特定の役者(actor)が登場している映画を探したい 左: クライアント側でJOIN。 もし役者(actor)に紐づく動画(video)が10ある場合、その10パーティション分をクエリーしなければならない。それらは10の違うノードにあるかもしれない。 右: JOINの必要がない。1つのパーティションにアクセスするだけ。