Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Sign up for free
Menu
Search
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Pricing
Search
Sign in
Sign up for free
【供養】DynamoDBでも部分一致検索したかった
Search
sara.ohtani.mt2
March 14, 2024
2k
1
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
【供養】DynamoDBでも部分一致検索したかった
@Ya8 2024
sara.ohtani.mt2
March 14, 2024
More Decks by sara.ohtani.mt2
See All by sara.ohtani.mt2
Djangoモノリスからのサービス分割:FastAPIへの移行
smatsu
0
53
大人数会議のカオス化を防ぐふりかえりフレームワークを考えてみた
smatsu
0
680
サンプル発話からVUXを考える
smatsu
0
110
Featured
See All Featured
Rails Girls Zürich Keynote
gr2m
96
14k
Design of three-dimensional binary manipulators for pick-and-place task avoiding obstacles (IECON2024)
konakalab
0
600
Writing Fast Ruby
sferik
630
63k
Lightning talk: Run Django tests with GitHub Actions
sabderemane
0
270
The AI Search Optimization Roadmap by Aleyda Solis
aleyda
1
6.3k
Ruling the World: When Life Gets Gamed
codingconduct
0
380
Visualizing Your Data: Incorporating Mongo into Loggly Infrastructure
mongodb
50
10k
The Psychology of Web Performance [Beyond Tellerrand 2023]
tammyeverts
49
3.6k
Optimizing for Happiness
mojombo
378
71k
Money Talks: Using Revenue to Get Sh*t Done
nikkihalliwell
0
510
StorybookのUI Testing Handbookを読んだ
zakiyama
31
6.9k
We Are The Robots
honzajavorek
0
380
Transcript
Copyright © RevComm Inc. 【供養】DynamoDBでも部分一致検索したかった 2024.03.15@Ya8 大谷紗良
Copyright © RevComm Inc. • 大谷 紗良(Sara Ohtani) • Software
Engineer, Backend ◦ • RevComm Inc. • @sara_ohtani_mt2 • #ya8 #ya8B 自己紹介 2
Copyright © RevComm Inc. 練馬で祭りを!? 😳 祭りやってるなぁと思って来ました 3
Copyright © RevComm Inc. awsのNoSQL DB、DynamoDBはスピードやコストの点で期待が高い でもなかなか利用シーンが限られているようで・・・ でもでもよく調べると色々できそうで・・・ でもでもでも試したらやはりちょっとできなかった、という話 今日の話
この資料は slide share公開済みです https://tech.revcomm.co.jp/partial-match-search-with-dynamodb 4
Copyright © RevComm Inc. DynamoDB使ったことあるひとー? 質問 5
Copyright © RevComm Inc. DynamoDBのGSI使ったことあるひとー? (GSI: グローバルセカンダリインデックス) 質問 6
Copyright © RevComm Inc. • DynamoDBは気になるけど 実際に使ってサービス開発をしたことはない方 • シンプルにKeyと一致するデータを取得したことはあるけど DynamoDBのさらなる可能性について知りたい方
想定聴講者 7
Copyright © RevComm Inc. 今日のみんなのGOAL DynamoDBで できそうなこと DynamoDBでできなさそうなこと 8
Copyright © RevComm Inc. 今日のみんなのGOAL DynamoDBでできないこと DynamoDBで できそうなこと DynamoDBで できること
9
Copyright © RevComm Inc. 1. 今回検証するにいたった背景 2. DynamoDBでできることできないこと 3. テーブルとデータ取得コードの例
4. まとめ アジェンダ 10
Copyright © RevComm Inc. 1. 今回検証するにいたった背景 2. DynamoDBでできることできないこと 3. テーブルとデータ取得コードの例
4. まとめ アジェンダ 11
Copyright © RevComm Inc. コミュニケーションを再発明し 人が人を想う社会を創る 12
Copyright © RevComm Inc. 電話営業や顧客応対を自動録音、AIが文字 起こし、解析・可視化することにより、顧 客と担当者が「何を」「どのように」話し ているか分からない、というブラックボッ クス問題を解消し、商談獲得率・成約率の 向上やセルフコーチングを後押しします。
Service トーク解析AI 13
Copyright © RevComm Inc. 連絡先情報を一覧で表示する画面があり キーワード検索する機能がある 電話機能があり、電話帳機能がある 14
Copyright © RevComm Inc. 連絡先情報を一覧で表示する画面があり キーワード検索する機能がある 電話機能があり、電話帳機能がある リニューアル中! 15
Copyright © RevComm Inc. データ量の多さとそれを起因とする遅さ • 1テナントにつき最大50万件の連絡先 ※現在最大75万件 • できれば1秒以下で取得したい
📞 🐢... 📇 リニューアルするにあたって意識している課題 16
Copyright © RevComm Inc. リニューアルにあたり、DBの分割も検討している このあたりの話は盛り上がりすぎてしまうので今日はしない とにかく検討しているんだ!!!!! そして何を使うか改めて考えている DB選定を改めてする 17
Copyright © RevComm Inc. 速い!安い!楽!(※) DynamoDBの魅力のイメージ 18
Copyright © RevComm Inc. データ規模にかかわらず処理速度が速いらしい 速い速いと聞くけど実感としてどの程度速いかわかってない これを機に知りたいという動機もあって検証してみた DynamoDBを使って早くならないものか・・・ 19
Copyright © RevComm Inc. 1. 今回検証するにいたった背景 2. DynamoDBでできることできないこと 3. テーブルとデータ取得コードの例
4. まとめ アジェンダ 20
Copyright © RevComm Inc. DynamoDBのデータ { "id": { "N": “1”
}, "name": { "S": "John" }, "type": { "S": "dog" } } Partition Key Sort Key (※option) その他 Attributes id name 1 John type dog item 21
Copyright © RevComm Inc. Scan検索でなくQuery検索を使う • Query検索は全体のデータ量にあまり影響を受けず速い • しかしQuery検索は柔軟な検索ができない •
余談 ◦ Query検索で一度に取得できるデータは1MBまで ◦ 一度で取得できなかったときには LastEvaluatedKeyに値が入ってくる 速さを活かすためには 22
Copyright © RevComm Inc. Scan検索でなくQuery検索を使う • Query検索は全体のデータ量にあまり影響を受けず速い • しかしQuery検索は柔軟な検索ができない •
余談 ◦ Query検索で一度に取得できるデータは1MBまで ◦ 一度で取得できなかったときには LastEvaluatedKeyに値が入ってくる 速さを活かすためには 23
Copyright © RevComm Inc. Keyで絞り込んで該当itemが取得できる DynamoDBのQuery検索とは Partition Key Sort Key
その他Attributes id name 1 John type dog ・・・ ・・・ ・・・ ・・・ ・・・ 2 Paul cat ・・・ ・・・ item 24
Copyright © RevComm Inc. Keyで絞り込んで該当itemが取得できる DynamoDBのQuery検索 Partition Key Sort Key
その他Attributes id name 1 John type dog ・・・ ・・・ ・・・ ・・・ ・・・ 2 Paul cat ・・・ ・・・ item Query検索の場合、絞り込み条件として Partition Keyは必ず指定しなければならない 完全一致検索のみ 25
Copyright © RevComm Inc. Keyで絞り込んで該当itemが取得できる DynamoDBのQuery検索 Partition Key Sort Key
その他Attributes id name 1 John type dog ・・・ ・・・ ・・・ ・・・ ・・・ 2 Paul cat ・・・ ・・・ idわからないけどnameが Johnのデータが欲しいな 26
Copyright © RevComm Inc. Keyで絞り込んで該当itemが取得できる DynamoDBのQuery検索 Partition Key Sort Key
その他Attributes id name 1 John type dog ・・・ ・・・ ・・・ ・・・ ・・・ 2 Paul cat ・・・ ・・・ idわからないけどnameが Johnのデータが欲しいな 27
Copyright © RevComm Inc. Keyで絞り込んで該当itemが取得できる DynamoDBのQuery検索 Partition Key Sort Key
その他Attributes id name 1 John type dog ・・・ ・・・ ・・・ ・・・ ・・・ 2 Paul cat ・・・ ・・・ item Sort KeyはPKを指定した上であれば 「EQ | LE | LT | GE | GT | BEGINS_WITH | BETWEEN」で絞り込める (Sort Keyの指定はオプション) 28
Copyright © RevComm Inc. Keyで絞り込んで該当itemが取得できる DynamoDBのQuery検索 Partition Key Sort Key
その他Attributes id name 1 John type dog ・・・ ・・・ ・・・ ・・・ ・・・ 2 Paul cat ・・・ ・・・ item KeyとKey以外はQuery検索で扱う上で 全く別物といっていい 29
Copyright © RevComm Inc. もっと柔軟に検索したい!!! 😵 でも・・・ 30
Copyright © RevComm Inc. そこで GSI じゃ テーブルに対して自由に追加できるインデックスを使うんじゃ 31
Copyright © RevComm Inc. 1item内にフラットに情報を並べるのではなく、 情報を縦に持つ GSIを活用する前提の設計の考え方 PK, GSI-SK Sort
Key その他Attributes ID DataType 1 Name DataValue John ・・・ ・・・ ・・・ ・・・ ・・・ 1 Type dog ・・・ ・・・ GSI-PK Primary Table 32
Copyright © RevComm Inc. 1item内で横に情報を持つイメージ DynamoDBのQuery検索とは Partition Key Sort Key
その他Attributes id name 1 John type dog ・・・ ・・・ ・・・ ・・・ ・・・ 2 Paul cat ・・・ ・・・ item 33
Copyright © RevComm Inc. 1item内にフラットに情報を並べるのではなく、 情報を縦に持つ GSIを活用する前提の設計の考え方 PK, GSI-SK Sort
Key その他Attributes ID DataType 1 Name DataValue John ・・・ ・・・ ・・・ ・・・ ・・・ 1 Type dog ・・・ ・・・ GSI-PK Primary Table 34
Copyright © RevComm Inc. 1item内にフラットに情報を並べるのではなく、 情報を縦に持つ 使うとどうなる? GSI-PK GSI-SK Projected
Attributes DataValue ID John 1 DataType Name ・・・ ・・・ ・・・ ・・・ ・・・ dog 1 Type ・・・ ・・・ (PK) dog 3 Type GSI Table 35
Copyright © RevComm Inc. Query検索の考え方は同じ 使うとどうなる? GSI-PK GSI-SK Projected Attributes
DataValue ID John 1 DataType Name ・・・ ・・・ ・・・ ・・・ ・・・ dog 1 Type ・・・ ・・・ (PK) dog 3 Type GSI Table idわからないけどnameが Johnのデータが欲しいな ⭕ 36
Copyright © RevComm Inc. Query検索の考え方は同じ 使うとどうなる? GSI-PK GSI-SK Projected Attributes
DataValue ID John 1 DataType Name ・・・ ・・・ ・・・ ・・・ ・・・ dog 1 Type ・・・ ・・・ (PK) dog 3 Type GSI Table dogのデータ・・・⭕ 37
Copyright © RevComm Inc. 50万件の連絡先を縦に展開してみたら サンプルデータは2000万件ほどに 😇 縦に持つということはデータ量はさらに増える・・・ 38
Copyright © RevComm Inc. それでも1秒未満で検索できた!※ 🚀 爆速 39
Copyright © RevComm Inc. Primary TableのPK以外での検索はできた でもKeyの検索だと部分一致検索ができない😢 where name like
‘%hoge%’ … 40
Copyright © RevComm Inc. それはそう でも部分一致検索したい 完全一致か 前方一致じゃ だめですよね? 😉
PO: それはちょっと・・・ 😉 41
Copyright © RevComm Inc. DynamoDBで部分一致検索はできないのか? 42
Copyright © RevComm Inc. Key検索+α ならできそう? なんかできそう・・・? https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/Query.FilterExpression.html 43
Copyright © RevComm Inc. Key検索+α ならできそう? なんかできそう・・・? https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/Query.FilterExpression.html できるけどScan同様、 データ量に応じて遅くなることがわかった
44
Copyright © RevComm Inc. フィルター条件を指定するとデータ量に応じて遅くなる 実質Scan 45
Copyright © RevComm Inc. 残念ながら要件を満たせなかったので 今回はDynamoDB採用を見送りました でも良いシチュエーションがあったら全然使いたい 結果としては 46
Copyright © RevComm Inc. どんなシチュエーションならよかったか? 47
Copyright © RevComm Inc. 1. データ抽出条件が完全一致、あるいは前方一致で良い 2. データ件数が多く、今後もさらに増加が予想される 3. アクセスパターンや要件がはっきりしている
4. データ検索する際の絞り込み条件となる項目が多くない 5. 基本的にテーブルをjoinする必要がない 6. 並び順は問わない DynamoDBがマッチすると思われるユースケース 48
Copyright © RevComm Inc. これらの条件と一致するサンプルケースで設計してみる 49
Copyright © RevComm Inc. ここで甘い飲み物を飲みます 50
Copyright © RevComm Inc. 後半!🛎 51
Copyright © RevComm Inc. 1. 今回検証するにいたった背景 2. DynamoDBでできることできないこと 3. テーブルとデータ取得コードの例
4. まとめ アジェンダ 52
Copyright © RevComm Inc. 1. 業務分析とデータのモデリング 2. アクセスパターン設計 3. テーブルとインデックス設計
4. クエリ条件設計 DynamoDBのテーブル設計の流れ 53
Copyright © RevComm Inc. 中の人 @_kensh さんより https://speakerdeck.com/_kensh/dynamodb-design-practice?slide=49 54
Copyright © RevComm Inc. 業務分析 RDRAでやってみました 誰に価値を与え、 そのために誰が関わるのか ? 関わる人が価値を出すための
仕事の流れ 55
Copyright © RevComm Inc. データモデルの形に整理 ※実際のシステムとは異なります 56
Copyright © RevComm Inc. アクセスパターン→ユースケースリストを出す システムに関わる登場人物と システムの接点 誰がどんなI/Fで何を? 57
Copyright © RevComm Inc. テーブル・インデックス設計 58
Copyright © RevComm Inc. テーブル・インデックス設計 RDBならテーブル分割するようなものもキャパシティを効率的に使うため できるだけ1つのテーブルで表現する データを重複なく保管し、 ホットパーティションが発生しないようにするための PK,
SKを設定 59
Copyright © RevComm Inc. 特定のデータ範囲に対してアクセスが集中すると 「ホット」なパーティションが作成される場合がある これにより、スロットリングが発生することや、 プロビジョニングされた I/O 容量が効率的に
使用されないことがある ホットパーティションとは 60
Copyright © RevComm Inc. 1処理ずつのアクセスだけでなく、 バッチ処理でそれぞれのアクセスが パーティションに集中してもホットになる ホットパーティションとは ID DataType
1 Name DataValue John 1 Type dog 2 Paul cat batchWriter AWS Lambda Amazon DynamoDB 61
Copyright © RevComm Inc. ❌ Tenant_{account_tenant_id} #Contacts ⭕ Contacts #Tenant_{account_tenant_id} #Contact_{contact_id} ホットパーティションとは
62
Copyright © RevComm Inc. テーブル・インデックス設計 検索のためのPK, SKをGSI用に設定 GSIでは全カラムをもつ必要がないため、 検索とソートに必要な項目だけ基本テーブルから射影 GSIは増やすとその分書き込みコストがあがるため
数を抑えたい 63
Copyright © RevComm Inc. テーブル・インデックス設計 検索のためのPK, SKをGSI用に設定 GSIでは全カラムをもつ必要がないため、 検索とソートに必要な項目だけ基本テーブルから射影 GSIは増やすとその分書き込みコストがあがるため
数を抑えたい 64
Copyright © RevComm Inc. テーブル・インデックス設計 DataType: なんのデータ#どのテナントと紐づいてるか #どの連絡先と紐づいてるか 65
Copyright © RevComm Inc. テーブル・インデックス設計 DataType: なんのデータ#どの連絡先と紐づいてるか SearchType: 検索の種類#テナントid SearchValue:
"なんのデータ"の値 CreatedAt(ソートしたい項目): id取得のための検索itemと基本情報itemにだけセットすればいい 66
Copyright © RevComm Inc. テーブル・インデックス設計 DataType: なんのデータ#どの連絡先と紐づいてるか #紐づくデータ SearchType: 検索の種類#どのデータと紐付けるか(
ON的な)#紐付ける値 67
Copyright © RevComm Inc. このクエリ条件をもとに実際に動かしてテストしていく クエリ条件設計 機能 Entity UseCase Lookup
parameters order by Table/Index Key Filter 一覧表示 contacts, contact_sample getContactsByTenantId, getContactSampleByContactId 1. {tenant_id}, 2. {contact_id} created_at (DESC) 1. GSI 2. Primary Table 1. SearchType = “FreeWord#Tenant_{acco unt_tenant_id}” 2. ID = :contact_id and DataType = “Tenant_{account_tenant _id}#Contacts” - 一覧表示 (検索) contacts, contact_sample getContactsByTenantId, getContactSampleByContactId 1. {tenant_id}, 2. {contact_id} created_at (DESC) 1. GSI 2. Primary Table 1. SearchType = “FreeWord#Tenant_{acco unt_tenant_id}” and SearchValue BEGINS_WITH :tenant_id”#”:param 2. ID = :contact_id and DataType BEGINS_WITH “Contacts#Tenant_{acco unt_tenant_id}#Contact_” - 個別表示 contacts, contact_sample ・ ・ ・ 電話発信 contacts 商談後情報入力 contact_sample ・ ・ ・ 68
Copyright © RevComm Inc. このクエリ条件をもとに実際に動かしてテストしていく クエリ条件設計 機能 Entity UseCase Lookup
parameters order by Table/Index Key Filter 一覧表示 contacts, contact_sample getContactsByTenantId, getContactSampleByContactId 1. {tenant_id}, 2. {contact_id} created_at (DESC) 1. GSI 2. Primary Table 1. SearchType = “FreeWord#Tenant_{acco unt_tenant_id}” 2. ID = :contact_id and DataType = “Tenant_{account_tenant _id}#Contacts” - 一覧表示 (検索) contacts, contact_sample getContactsByTenantId, getContactSampleByContactId 1. {tenant_id}, 2. {contact_id} created_at (DESC) 1. GSI 2. Primary Table 1. SearchType = “FreeWord#Tenant_{acco unt_tenant_id}” and SearchValue BEGINS_WITH :tenant_id”#”:param 2. ID = :contact_id and DataType BEGINS_WITH “Contacts#Tenant_{acco unt_tenant_id}#Contact_” - 個別表示 contacts, contact_sample ・ ・ ・ 電話発信 contacts 商談後情報入力 contact_sample ・ ・ ・ テーブル設計とクエリ条件設計を往復・・・ 69
Copyright © RevComm Inc. 一覧表示(検索)のサンプルコードはこちら 主な流れ 1. GSI経由で検索用データから条件に一致する contact_id一覧を取得する 2.
取得したcontact_id一覧から基本データを取得する • 部分一致検索の書き方を検索していると今は非推奨の古い書き方例がかなりよく出てくるので注意 • SDKのresourceは古いため非推奨となっており、代わりにclientを使うことが推奨されている データ取得イメージ 70
Copyright © RevComm Inc. 1. 今回検証するにいたった背景 2. DynamoDBでできることできないこと 3. テーブルとデータ取得コードの例
4. まとめ アジェンダ 71
Copyright © RevComm Inc. 1. データ抽出条件が完全一致、あるいは前方一致で良い 2. データ件数が多く、今後もさらに増加が予想される 3. アクセスパターンや要件がはっきりしている
4. データ検索する際の絞り込み条件となる項目が多くない 5. 基本的にテーブルをjoinする必要がない 6. 並び順は問わない あらためてDynamoDBがマッチすると思われるユースケース 72
Copyright © RevComm Inc. 今回DynamoDBを採用しなかった一番の理由 部分一致だと大量データの検索がスピーディにできない 完全一致、あるいは前方一致でなら 高パフォーマンスを発揮できる 1. データ抽出条件が完全一致、あるいは前方一致で良い
73
Copyright © RevComm Inc. データ数が多くてもユースケースがマッチしていて 設計がうまくいけばかなり速い 50万件のitemに対する検索でも、 2000万件のitemに対する検索でも 同じくらいのスピードで結果が返ってくる🤩 2.
データ件数が多く、今後もさらに増加が予想される 74
Copyright © RevComm Inc. 事前の設計がかなり大事 アクセスパターンがはっきり決まっていない状態で GSIを活用した検索の仕組みにするのはおすすめできない 特にホットパーティションが生まれないように注意 3. アクセスパターンや要件がはっきりしている
75
Copyright © RevComm Inc. 今回のような設計にすると項目が多ければ多いほど 1件の連絡先あたりのitem数が増えることになり 書き込み・読み込み時のコストも増えていくことになる 4. データ検索する際の絞り込み条件となる項目が多くない 76
Copyright © RevComm Inc. これもEntityとリレーションを貼るテーブルが多いほど 1件の連絡先あたりのitem数が増えることになる 全体のクエリも複雑になるのでできればない方がいい 5. 基本的にリレーションがない 77
Copyright © RevComm Inc. SQLでいうところのorder byがない Sort Key順以外の並び順にしたいときは 一度全検索結果のidと並び順条件の情報を取得した上で アプリ側でソートすることになる
そうすると本当は1MBまでで取れるデータだけでいいところが 全結果を取得しないといけなくなる 並び順はいっそ選べないと思っていたほうが良さそう 6. 並び順は問わない 78
Copyright © RevComm Inc. 最終的に2000万件のitemの検証になり、 かなり大規模な検証となりました 個人ではここまで試しきれなかったと思います 今回DynamoDB採用には至りませんでしたが せめて得たものを広く共有することで供養になればと思います 🙏
RIP🙏 79
Copyright © RevComm Inc. Thank you!
Copyright © RevComm Inc. おまけ
Copyright © RevComm Inc. • 特に参考にした記事 ◦ https://speakerdeck.com/_kensh/dynamodb-design-practice ◦ https://speakerdeck.com/handslabinc/dynamodbdemojian-suo-sitai
• DynamoDBのテーブル設計における多対多の考え方 ◦ https://docs.aws.amazon.com/ja_jp/amazondynamodb/latest/developerguide/bp-adja cency-graphs.html ◦ https://hack-le.com/dynamodb-many-to-many/ • ホットパーティションについて ◦ https://docs.aws.amazon.com/ja_jp/amazondynamodb/latest/developerguide/bp-part ition-key-uniform-load.html • クエリのパフォーマンスと継続した負荷に対してDynamoDBはどのように対応するか検証記事 ◦ https://aws.amazon.com/jp/blogs/news/part-2-scaling-dynamodb-how-partitions-ho t-keys-and-split-for-heat-impact-performance/ 参考