Share
Embed
Transcript
41 slides
-
アジェンダ 1. 動機および事例に関する個別事情 2. 新テーブルを準備 3. 新テーブルに同期 4. 新テーブルに切り替え 5.
インデックス問題を回避するために -
元々のテーブル構成 テナントA テナントB マイクロサービスA + テナントA 用テーブル マイクロサービスB + テナントA
用テーブル マイクロサービスB + テナントB 用テーブル マイクロサービスA マイクロサービスB -
元々のテーブル構成 テナントA テナントB マイクロサービスA + テナントA 用テーブル マイクロサービスB + テナントA
用テーブル マイクロサービスB + テナントB 用テーブル マイクロサービスA マイクロサービスB テナント×(利用されている)マイクロサービス のテーブルが存在 合計 2,000 テーブル以上 -
インデックスを変更したテーブルを用意 マイクロサービスA + テナントA 用テーブル マイクロサービスB + テナントA 用テーブル マイクロサービスB
+ テナントB 用テーブル マイクロサービスA + テナントA 用テーブル’ マイクロサービスB + テナントA 用テーブル’ マイクロサービスB + テナントB 用テーブル’ -
DynamoDB Stream マイクロサービスA + テナントA 用テーブル マイクロサービスB + テナントA 用テーブル
マイクロサービスB + テナントB 用テーブル マイクロサービスA + テナントA 用テーブル’ マイクロサービスB + テナントA 用テーブル’ マイクロサービスB + テナントB 用テーブル’ 作成・更新・削除 作成・更新・削除 -
DynamoDB Stream マイクロサービスA + テナントA 用テーブル マイクロサービスB + テナントA 用テーブル
マイクロサービスB + テナントB 用テーブル マイクロサービスA + テナントA 用テーブル’ マイクロサービスB + テナントA 用テーブル’ マイクロサービスB + テナントB 用テーブル’ どうでもいい更新 作成 -
毎回こんなことやってられない 新しいテーブル設計では先にインデックスを作るように accountId S HASH_KEY uniqueName S RANGE_KEY status S
LSI1 createdAt N LSI2 __parent_key__ S HASH_KEY __key__ S RANGE_KEY __lsi_range_key1__ S LSI1(status のコピー) __lsi_range_key2__ S LSI2(createdAt のコピー) __lsi_range_key3__ S LSI3(値なし) __lsi_range_key4__ S LSI4(値なし) __lsi_range_key5__ S LSI5(値なし) accountId S uniqueName S status S createdAt N -
毎回こんなことやってられない 新しいテーブル設計では先にインデックスを作るように accountId S HASH_KEY uniqueName S RANGE_KEY status S
LSI1 createdAt N LSI2 __parent_key__ S HASH_KEY __key__ S RANGE_KEY __lsi_range_key1__ S LSI1(status のコピー) __lsi_range_key2__ S LSI2(createdAt のコピー) __lsi_range_key3__ S LSI3(値なし) __lsi_range_key4__ S LSI4(値なし) __lsi_range_key5__ S LSI5(値なし) accountId S uniqueName S status S createdAt N 先にインデックス用の列を定義しておく 使いたくなったら、値を入れ始めればいい -
毎回こんなことやってられない 新しいテーブル設計では先にインデックスを作るように accountId S HASH_KEY uniqueName S RANGE_KEY status S
LSI1 createdAt N LSI2 __parent_key__ S HASH_KEY __key__ S RANGE_KEY __lsi_range_key1__ S LSI1(status のコピー) __lsi_range_key2__ S LSI2(createdAt のコピー) __lsi_range_key3__ S LSI3(値なし) __lsi_range_key4__ S LSI4(値なし) __lsi_range_key5__ S LSI5(値なし) accountId S uniqueName S status S createdAt N 実際はGSIも5個作ってしまっている -
インデックス設計 GS2 では ARN を模した GRN というIDを採用 grn:gs2:ap-northeast-1:0uUD6p9U-project-0001:account:namespace-0001:account:47076847-e98e-4f01-84c2-5165e81fba56 リージョン アカウントID
マイクロサービスの種類/ネームスペース エンティティの種類/ゲームプレイヤーの識別子 ゲームプレイヤーのGRN -
インデックス設計 GRNのツリーと同じ構造でテーブルにデータを格納する account:namespace-0001:account:47076847-e98e-4f01-84c2-5165e81fba56 account:546c375f-d6e1-4b1b-9da7-1ca08c97ab0f account:namespace-0002:account:047027b2-3cd9-4561-a993-dbd0b243b90f takeover:type:0:identifier:[email protected] __parent_key__ __key__ account namespace-0001
GS2-Accountのネームスペース account namespace-0002 GS2-Accountのネームスペース account:namespace-0001:account 47076847-e98e-4f01-84c2-5165e81fba56 ゲームプレイヤーのアカウント account:namespace-0001:account 546c375f-d6e1-4b1b-9da7-1ca08c97ab0f ゲームプレイヤーのアカウント account:namespace-0001:account:546c375f- d6e1-4b1b-9da7-1ca08c97ab0f:takeover type:0:identifier:[email protected] 引継ぎ情報 account:namespace-0002:account 047027b2-3cd9-4561-a993- dbd0b243b90f ゲームプレイヤーのアカウント -
インデックス設計 GS2-Accountのネームスペースの一覧をとりたい __parent_key__ __key__ account namespace-0001 GS2-Accountのネームスペース account namespace-0002 GS2-Accountのネームスペース
account:namespace-0001:account 47076847-e98e-4f01-84c2-5165e81fba56 ゲームプレイヤーのアカウント account:namespace-0001:account 546c375f-d6e1-4b1b-9da7-1ca08c97ab0f ゲームプレイヤーのアカウント account:namespace-0001:account:546c375f- d6e1-4b1b-9da7-1ca08c97ab0f:takeover type:0:identifier:[email protected] 引継ぎ情報 account:namespace-0002:account 047027b2-3cd9-4561-a993- dbd0b243b90f ゲームプレイヤーのアカウント __parent_key__ == ‘account’ -
インデックス設計 GS2-Accountのネームスペース名’namespace-0001’のアカウン ト一覧をとりたい __parent_key__ __key__ account namespace-0001 GS2-Accountのネームスペース account namespace-0002
GS2-Accountのネームスペース account:namespace-0001:account 47076847-e98e-4f01-84c2-5165e81fba56 ゲームプレイヤーのアカウント account:namespace-0001:account 546c375f-d6e1-4b1b-9da7-1ca08c97ab0f ゲームプレイヤーのアカウント account:namespace-0001:account:546c375f- d6e1-4b1b-9da7-1ca08c97ab0f:takeover type:0:identifier:[email protected] 引継ぎ情報 account:namespace-0002:account 047027b2-3cd9-4561-a993- dbd0b243b90f ゲームプレイヤーのアカウント __parent_key__ == ‘account:namespace-0001:account’ -
インデックス設計 GS2-Accountのネームスペース名’namespace-0001’のアカウント ‘546c375f-d6e1-4b1b-9da7-1ca08c97ab0f’ のtype0の引継ぎ情報一覧をとりたい __parent_key__ __key__ account namespace-0001 GS2-Accountのネームスペース account
namespace-0002 GS2-Accountのネームスペース account:namespace-0001:account 47076847-e98e-4f01-84c2-5165e81fba56 ゲームプレイヤーのアカウント account:namespace-0001:account 546c375f-d6e1-4b1b-9da7-1ca08c97ab0f ゲームプレイヤーのアカウント account:namespace-0001:account:546c375f- d6e1-4b1b-9da7-1ca08c97ab0f:takeover type:0:identifier:[email protected] 引継ぎ情報 account:namespace-0002:account 047027b2-3cd9-4561-a993- dbd0b243b90f ゲームプレイヤーのアカウント __parent_key__ == ‘account:namespace-0001:account:546c375f-d6e1-4b1b-9da7-1ca08c97ab0f:takeover’ and begins_with(__key__, ‘type:0:’) -
宣伝: GS2 で Serverless に出来ること例 • 匿名アカウント サービスを最初に提供し、メールアドレスやパスワードの登録を後回しに • 所持品管理
クーポン所持数とか。有効期限付きも可能 • 経験値・レベル フォーラムの書き込み回数で称号が付く。とか • チャット WebSocketを使ったリアルタイムテキストチャット • 装備 お気に入りの動画をマイリストに登録する。とか • スタミナ 8時間に1回無料で漫画が読める。とか https://gs2.io