LoginSignup
11
3

More than 1 year has passed since last update.

Firestore の TTL がリリースされたので挙動を調べてみた

Posted at

概要

先日の Firebase Summit 2022Firestore の TTL (Time-To-Live) 機能がリリースされました。開発する上で、以下の挙動が気になったのでテストデータを作って確認してみました。

  1. Cloud Functions の onDelete トリガーや onWrite トリガーは発火される?
  2. 途中で有効期限を変更した時の挙動は?
  3. どれくらいのスピードで削除される?

調査中に公式ドキュメントも随時アップデートされ、検証する必要のない内容も含まれてしまいましたが、以下に検証方法・結果を記載します。

検証方法

以下の手順で検証を行いました。

  1. items コレクション内の expireAt フィールドを TTL として設定
  2. Firestore に 500 件のテストデータを一括作成し、全て 24 時間後に有効期限を設定
  3. Cloud Functions のスケジュール機能を用いて、 1 から順に 15 分間隔で expireAt を null に更新

結果

結果は以下のようになりました。

1. Cloud Functions の onDelete トリガーや onWrite トリガーは発火される?

onDelete も onWrite も TTL によるデータ削除時に発火しました。onDelete の発火回数はデータの削除数と一致しました。onWrite トリガーの実行回数が削除数より多いのは検証手順 3 で expireAt を更新する際にも発火するためです。

onDelete トリガー

Firestore TTL による onDelete トリガー実行ログ

onWrite トリガー

Firestore TTL による onWrite トリガー実行ログ

この結果から、 onDelete, onWrite トリガーが発火する前提で設計できます。具体的な利用シーンとしては Firestore のデータに紐づく Storage のファイル削除を onDelete トリガーで処理する、などが考えられます。

Manage data retention with TTL policies

Deletion through TTL calls all active snapshot listeners and triggers Cloud Functions Firestore triggers.

検証期間中に公式ドキュメントにも上記の記述が追加され、検証結果とも合致しました。

2. 途中で有効期限を変更した時の挙動は?

有効期限前に expireAt を null に更新したデータは 1 件も削除されませんでした。TTL の削除処理は事前に削除対象が予約されているのではなく、実行時に逐一クエリして該当データのみ削除しているようです。

Manage data retention with TTL policies

Deletion through TTL is not an instantaneous process. Expired documents continue to appear in queries and lookup requests until the TTL process actually deletes them. TTL trades deletion timeliness for the benefit of reduced total cost of ownership for deletions. Data is typically deleted within 72 hours after its expiration date.

公式ドキュメントに記載がある通り有効期限を過ぎても即時にデータは削除されないため、有効期限を過ぎても削除前であれば expireAt を null に更新することで削除対象から除外することが可能です。

この結果から、論理削除したデータの削除期限を N 日後に設定し、復元する時に期限をなくす処理を行うことで、 Google Drive のゴミ箱のような機能(ゴミ箱に入れてから N 日後に自動的に削除)を実現できそうです。

3. どれくらいのスピードで削除される?

以下の画像は 1 時間毎の削除件数を表したものです。1 時間あたり 10 件前後のデータが削除されています。有効期限を迎えた時点(24時間経過時)では 500 件中 400 件ほどが削除対象(expireAt を null に更新していないデータ)であったため、 2 日程度で全て削除するように処理を分散しているようです。
スクリーンショット 2022-11-09 8.49.50.png

Deletion through TTL is not an instantaneous process.

公式のドキュメントでも言及されている通り、即時削除されるものではないという前提で設計する必要があります。

まとめ

今回の検証で以下のことが分かりました。

  • TTL による削除時にも onDelete, onWrite トリガーが発火される。
  • 有効期限を途中で変更すれば削除対象から除外できる。
  • 同時に有効期限を迎えたデータは一括で削除されず、分散して削除される。

実際に利用したソースコードは tanabee/research-firestore-ttl にアップロードしていますので、何か検証したい方はご参考ください。

11
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
11
3