こんにちは!Cloud Spannerの世界へようこそ。
チーフアーキテクトの私です。
「Cloud Spannerって名前はカッコいいけれど、なんだか難しそう……」
「普通のデータベースと何が違うの?」
そんな風に思っていませんか?大丈夫、安心してください。今日は、Cloud Spannerの数ある武器の中でも、特に強力で日常のシステム開発でめちゃくちゃお世話になる「読み取り専用トランザクション(スナップショット読み取り)」について、専門用語をできるだけ使わずに、私の直伝のたとえ話を交えて徹底的に解説します。
ここをクリアすれば、Cloud Spannerの基本はバッチリマスターできますよ!それでは、いってみましょう。
—
1. なぜ「読み取り」で頭を悩ませるのか?(現実世界でのたとえ)
想像してください。あなたは超人気テーマパークの「公式ガイドマップ」の在庫管理スタッフです。
毎日、何万人ものゲスト(ユーザー)が、アプリで「今、このアトラクションの待ち時間は何分?」とデータを見ています。
もし、この「待ち時間を見るだけ(=データの読み取り)」の人たち全員に対して、スタッフが「ちょっと待って!今このノートに書き込み中だから、誰も見ちゃダメ!」と鍵(ロック)をかけてしまったらどうなるでしょうか?
……園内は大パニックですよね。「情報を見たいだけなのに、なんで待たされるんだ!」と大クレームになります。
従来の一般的なデータベースは、データを安全に保つために、この「見るだけの人」に対しても一時的に鍵をかけたり、お互いの邪魔をし合ったりすることがありました。これが、システムが重くなる大きな原因だったのです。
—
2. Cloud Spannerの魔法:「タイムマシン写真」の正体
ここで登場するのが、Cloud Spannerの読み取り専用トランザクション(スナップショット読み取り)です。
Cloud Spannerは、いわば「パーフェクトなタイムマシンカメラ」を持っています。
データを読み込むとき、データベース全体に鍵をかける……なんて野暮なことはしません。その代わり、こう言います。
> 「〇月〇日 12時00分00秒時点の、世界の一瞬を切り取った『写真』をあげるね。この写真はもう変わらないから、ゆっくり見ていっていいよ!」
これがスナップショット読み取りの本質です。
データを書き込んでいる人(スタッフ)の邪魔を一切せず、過去のある一瞬の「完璧に一貫性の取れた状態のデータ」を、ロックなし(待たされずに)でスパッと取得できるのです。
- 書き込みの邪魔をしないから、システムが遅くならない。
- 鍵をかけないから、何万人が同時にアクセスしても絶対に渋滞しない。
これが、世界中の巨大なシステムがCloud Spannerを選ぶ理由の一つです。
—
3. 実践!「過去の一瞬」を切り取るスマートなクエリ
百聞は一見にしかず。実際にコードを書いて、このスナップショット読み取りを体験してみましょう。
Cloud Spannerで読み取り専用トランザクションを使うときは、「この瞬間のデータが欲しい」という指定(あるいはシステムにおまかせする設定)を行います。
以下は、あるユーザーの残高データを安全かつ高速に読み出すコードの例です。(Pythonをベースにしたイメージで書いています)
from google.cloud import spanner
クライアントの初期化
client = spanner.Client()
instance = client.instance(“my-instance”)
database = instance.database(“my-database”)
読み取り専用トランザクションをスタート!
「ロックは一切かけないで、安全なスナップショットをちょうだいね」と指示します
with database.snapshot() as snapshot:
# ユーザーの残高データを取得するSQL
# スナップショットのおかげで、他の人が書き込み中でも待ち時間ゼロで取得できます
query = “SELECT user_id, balance FROM Accounts WHERE user_id = @user_id”
params = {“user_id”: “user_12345″}
result = snapshot.execute_sql(query, params=params)
for row in result:
print(f”ユーザーID: {row[0]}, 残高: {row[1]}円”)
# ここで行っている読み取りは、世界がどれだけ忙しくても
# 他の処理をブロック(邪魔)しません!
コードのポイント
- `database.snapshot()` が、まさに「タイムマシンカメラのシャッター」を切る瞬間です。
- この中で実行されるSQLは、他の書き込み処理とケンカをしません。「読む人は読む、書く人は書く」が完全に並行して行えるため、圧倒的なパフォーマンスを発揮します。
—
4. チーフアーキテクトからの実務アドバイス
さて、このスナップショット読み取り、実務ではどんな場面で使うのが正解でしょうか?
結論から言うと、「データの更新(書き込み)を伴わない処理は、すべて読み取り専用トランザクション(スナップショット)に寄せる」のが鉄則です。
- マイページの残高・プロフィール表示
- ECサイトの商品一覧や詳細ページの表示
- 裏側で行う重いデータ集計やレポート出力
これらはすべて「見たいだけ」の処理です。ここに通常のトランザクション(ロックを使うもの)を使ってしまうと、システムのポテンシャルをドブに捨てるようなものです。もったいない!
「データを変更しないなら、迷わずスナップショット!」
これを合言葉にするだけで、あなたの作るシステムの安定性とスピードは劇的に向上します。
—
おわりに
いかがでしたでしょうか?
Cloud Spannerの読み取り専用トランザクション(スナップショット読み取り)は、難解な理論ではなく、「みんながストレスなくデータを見られるようにする優しい工夫」なんだと感じていただけたなら嬉しいです。
この基本さえ押さえておけば、Cloud Spannerの強みの半分はもうあなたのものです。
明日からの設計やコーディングで、ぜひこの「ロックしない贅沢」を味方につけてみてくださいね。
それでは、また次のアーキテクチャの旅でお会いしましょう!
コメント