MIXI TECH CONFERENCE 2023 にてお話した田岡の資料です。
動画:https://youtu.be/v6Ldqz_SRN4
https://techcon.mixi.co.jp/d3-5
©MIXID3-5DynamoDB で決済システムを運用してみた~MIXI Mにおける事例の紹介~開発本部 MIXI M 事業部 システムグループ田岡 文利
View Slide
©MIXIおしながき● 私とMIXI Mのご紹介● DynamoDBを選択したのはなぜ?● DynamoDBを使い倒そう○ DynamoDBのおさらい○ データ整合性を守るための方法○ MIXI M での設計方針● DynamoDB Streamsを活用● お困りごと● 運用に関してよかったこと● 決済システムで開発運用した所感● まとめ2
©MIXI私とMIXI Mのご紹介3
©MIXI田岡文利2012年4月入社→ SNS「mixi」 の 自社Framework開発とサービス開発→グループ会社の支援 (開発体制、ガツガツ開発、SREぽい事)→ XFLAG アプリ・XFLAG ID の開発・運用→ 新サービス開発熟考期 (ビデオ・ライブ配信 / WebRTC / BLE)→ 決済基盤の開発・運用や、新規決済系サービス「6gram」の開発→ 6gram 改 MIXI M の開発運用中 (決済やり始めて3年くらい)4
©MIXI認証から決済までをワンストップで提供できる基盤システム & WALLETサービスです。ビジネスからエンタメ領域まで様々なサービスの『間(M)』をなんとかすることをサービスコンセプトとして、ID・認証基盤やWALLET(金融システム)をすべて自社開発することでユーザーの利用シーンに合わせた柔軟なサービスを展開しています。5
©MIXIMIXI MID- 認証認可- 個人情報や本人確認の取りまとめ- Webポータル決済- Wallet- クレジットカードや銀行口座の管理- 残高の管理- プリペイドクレジットカード- チャージ・オーソリ- 決済フローの提供- クレジットカードや銀行口座を始めとして様々な決済手段を提供6
©MIXI決済システム- Elixirベースの内製コンポーネントがたくさん- VISA, JCB FEP- 決済アプリケーション(API, Web)- カード決済、 銀行決済、 etc…- Wallet管理、履歴....- Developers Boost 2019: Elixir で決済サービスをつくってみた- AWS- Fargate, DynamoDB- 基本的にフルマネージドなサービスを組み合わせて実装- SRE NEXT 2020: グループウォレットアプリ6gramの運用をはじめてみた7
©MIXIQ: DynamoDBを選択したのはなぜ?8
©MIXIA: 運用負荷をさげる!9
©MIXIA: 運用負荷をさげる! ← テーマ本当にさがるのだろうか??結果的に下がった話、元々始めた理由は......10
©MIXIPCIDSSと運用を見越すとDynamoDBが選択肢に- RDBは基本user/passwordで接続します...- パスワードの要件やアカウント管理これは面倒臭い- 無停止運用したいでもセキュリティパッチを当てたりは必須- 方法は考えることができるが大変↓- クレジットカード情報など全てのデータをDynamoDBに保存、AWSマネージドなシステムを使っていくことで...- IAMをベースとした細かいアクセス制御- KMSによるテーブルの暗号化が容易- セキュリティパッチなどを自分達で当てる必要がない11
©MIXIDynamoDBを採択できる?- PCI, HIPAA など 金融や医療でのコンプライアンスもとれているマネージドサービス- 金融システム採用事例もある- せっかく採用するならうまく使いたい- AWSの公式ドキュメントでも金融システムでの利用例はある- Amazon DynamoDB の変更データキャプチャ- ドキュメントもいい感じにメンテナンスされてる- ベストプラクティスでAmazonが考える利用ケースも理解できそう12
©MIXIDynamoDBの概要をザックリ(1)- フルマネージドなNoSQLデータベース- パーティションキー(以後PK) もしくは, PK + ソートキー(以後SK) でアイテムのプライマリーキーが構成される- プライマリーキーで直接取得もしくは PKを指定してクエリ- PKで分散がかかる, その中でSortKey でデータが並ぶ- SortKeyでは 前方マッチなどのmatch等少し頭のいい検索が効く13
©MIXIDynamoDB の概要をザックリ(2)- 任意のフィールドでインデックスを作ることができる- スパースインデックス- フィールドが未定義の場合はインデックスが作成されない- 大きく2種類の課金体系- オンデマンドキャパシティ(リクエスト課金/マネージドなオートスケール)- プロビジョニング済みキャパシティ(時間課金/手動/ルールベーススケール)- キャパシティが不足するとリクエストが詰まることになる- インデックスは自動生成されるため、インデックス側で詰まる場合にはもとテーブルも影響を受ける- TTLでデータの有効期限を指定できる14
©MIXIデータ整合性を守るための方法- Transactions を利用する- 複数のItemへの操作を一度にできる話- 条件付き(ConditionExpression)書き込みを利用する結果整合なので、条件付きの処理が活躍する場面が非常に多いid: xxxxxxxxxxamount: 1,000lock_version: 11id: xxxxxxxxxxamount: 5,000lock_version: 10先にupdateid: xxxxxxxxxxamount: 0lock_version: 11同時にUpdate5,000円 を使ったことを記録- lock_versionでの制御- lock_version == 10- amount: 0- amountによる制御- amount > 5000- amountを 5,000 引く- lock_version: +115
©MIXI設計方針- DynamoDB を使用した設計とアーキテクチャの設計に関するベストプラクティスに沿って開発する- テーブルはできるだけ少なくする- アクセスパターンやデータの種類に合わせる- 同じテーブルで複数のモデルを扱えるようにする- テーブルの基本ルールは PK,SKを汎用な文字列型にする- “pk”(string), “sk”(string)- モデル間で共通利用できるindexを推奨- 時系列データを表示するためのindex を作るなど- オンデマンドキャパシティを利用する- リクエスト課金でコストメリットが高い- スケールイン・スケールアウトを考えなくて済む16
©MIXIベストプラクティスではDynamoDB Streamもお勧めされている17
©MIXIDynamoDB Streams を活用(1)履歴データや利用状況データの作成● APPは残高の状態を書き換える● DynamoDB Streamにデータが流れる● Lambdaで履歴データなどを作成APP DynamoDBDynamoDBStreamLambdauser: 1, amount: 2000event: {amount: -1000, 決済方法: card_1}updated_at: 2023/03/03 10:00:00user1利用履歴created_at: 10:00:00amount: -1000card_1利用履歴created_at: 10:00:00amount: -1000複数種類作ってみたりStreamには変更前と変更後のデータが流れてくる同じレコードに複数の書き込みがあっても順番に処理できる18
©MIXIDynamoDB Streams を活用(2)長いスパンの遅延処理● TTLでのデータ削除がDynamoDB Streamに流れる● Lambda で処理○ ALBを通してAPPでも処理できる● ※TTLで削除発火はバラつきありInternal ALB APP DynamoDBDynamoDBStreamLambdaacition: データ処理params: hogehogeTTL: 2023/03/03 (unixtime)19
©MIXIお困りごと- 単体で解析ぽいお仕事は非常に苦手- あらかじめ決めたtopicに関するカウンタくらいはすぐ作れる- 解析に関してはDynamoDBのPointTimeRecoveryデータをS3に出力してAWS Glueを通してAthenaで検索したりしている (リアルタイムではない)- 全くスキャンができない訳ではない- 時間かかるので別の方法をとった方が無難、必要なデータはすぐに引けるように設計- リアルタイムな解析以外はなんとか対応、リアルタイム解析はこれから- 結果整合性による問題- Replication遅延みたいなものだけどはまる時はある- GSIに関しては強整合性の取得ができない- どちらもメインテーブルへの強整合性GetItemでなんとかなっている20
©MIXI運用に関してよかったこと楽なことが多い♪- ソフトウェアのバージョン更新に関して考える必要がない- そもそもダウンタイムを気にしないで済む- メンテナンスwindow、 コネクション管理、 バージョン間の違い...- failoverしたらどうなるんだっけ....- なんなら機能が増えて嬉しいことの方が多い- トランザクション制限の増加(25 -> 100 item)- パフォーマンスに関しての運用- スケールアップを考えないでほぼなんとかなってる- スケールアウトはもうされている- 設計に関しては先にコストを払っている21
©MIXI決済システムで開発運用した所感- RDBMS的に制約をもってデータ管理しないと不整合が起きない?トランザクション必要では?- 結果不整合はほぼ起きていない- 決済システムにおいては、結局他のシステムとのデータ整合性を取る仕組みが必要になるので DB だけがそれを行えてもしょうがない- 結果トランザクションを使ってるところは少ない- 新規メンバーの学習って大変じゃない?- 機能が少ないので使うまでは容易い、新規設計は慣れが必要- 新規のテーブルを使うことがあまりないので、既存のデータのアクセス方法を確認しながら設計を把握してもらっています- 非正規化する^q^、制約多くない?- cacheを運用していたり、DBのmemory上のindexだけでどうにかなるようにしたり、シャーディングをしていたことを考えるとあんまり変わらない気持ち22
©MIXIまとめ- 決済システムをDynamoDBで作って運用することはアリだった- オンデマンドキャパシティを使うことでスケールイン、スケールアウトに関して気にせずにパフォーマンス最適- RDBにありがちなメンテナンスが不要- ダウンタイムを考えなくて良いのは大きい- RDBのめんどくさいところを回避できる設計は公式ベストプラクティスを参考にすれば大丈夫23
©MIXI