こんにちは、MLBお兄さんこと松村です。
福岡出身の今永昇太投手がシカゴ・カブスと契約しましたね。ぜひ頑張ってほしいと思います。
今回は Azure Cosmos DB for NoSQL のデザインパターン解説記事の第4弾です。
前回は「グローバル分散カウンター (Global distributed counter) パターン」を解説しました。
今回は「グローバル分散ロック (Global distributed lock) パターン」について解説をします。
このデザインパターンについては、Cosmos DB の GitHub リポジトリやブログで紹介されていますので、詳しく読みたい方はこちらもご覧ください。
Azure Cosmos DB とはグローバル規模にスケールし、高可用性・高スループットなデータベース基盤である特徴があるため、データの一貫性や整合性を保証するためにグローバル分散ロックパターンは有効な方法です。
グローバル分散ロックパターンは、以下のシナリオに適用することができます。
- クリティカルセクション
- 競合が発生してはいけないデータを管理し、データの一貫性を確保する
- リソースの同期
- 複数のノードが1つのデータを更新しようとしたとき、1つのノードだけがデータを更新することができる
- データの整合性を維持する
- 同時実行制御
- 同時処理により特定データの不整合が起きることを防ぐ
- 分散トランザクション
- 異なるノードにわたる複数の操作をアトミックに実行する場合
グローバル分散ロックパターンの実装例は、リポジトリで公開されています。
ここで重要なのは TTL (Time to Live) と ETag です。
TTL はアイテムが自動削除されるまでの時間(秒)であり、ETag はオプティミスティック同時実行制御を実現するための仕組みです。
ロックをかける処理が、以下のようなロック用のアイテムを作成します。
このアイテムがある間は、他の処理が実行できないような条件判定を設けます。
{ "id": "test3", "_etag": "\"030095b1-0000-2300-0000-65abd4020000\"", "OwnerId": "a75fe7b0-00da-46d5-bc57-42c7e19fb16f", "FenceToken": 2, "_rid": "O+Y2AOLqcd8oAAAAAAAAAA==", "_self": "dbs/O+Y2AA==/colls/O+Y2AOLqcd8=/docs/O+Y2AOLqcd8oAAAAAAAAAA==/", "_attachments": "attachments/", "_ts": 1705759746 }
ロックが必要な処理が終わったら、明示的にロック用のアイテムを削除するか、TTL の経過後に自動削除を待ってロックを解除します。
サンプルでは Cosmos DB のコンテナーレベルで TTL が設定されています。
こういった実装を行うことで、分散アプリケーションでも安全に Cosmos DB のデータを扱うことができるようになります。
デザインパターンのサンプルでは C# の lock ステートメントと組み合わせたマルチスレッド処理が実装されていますので、あわせて参考にしてみてください。
サービス一覧 www.alterbooth.com cloudpointer.tech www.alterbooth.com