Open5

Datastore モードの Cloud Firestoreなのにトランザクションの制限が掛かったままになる

IssuyIssuy

GCPのCloud Datastoreを使っている場合、2021年6月から順次「Datastore モードの Firestore」に自動的に移行されていく。

Cloud Datastoreではデータ更新にまつわるいくつかの制限があったが、Datastore モードの Firestoreではこの制限がなくなる。
特に自分の周辺環境では「25 エンティティ グループまでというトランザクションの制限」というのが厳しい場面があったので非常に嬉しい話だった。

https://cloud.google.com/datastore/docs/upgrade-to-firestore?hl=ja

IssuyIssuy

いざ「Datastore モードの Firestore」に移行されが違和感に気付く。
期待した通りの挙動ではないかもしれない?いや、自分のDatastoreへの仕様理解が不足しているかも?

もしこの記事を見てる人がそんな違和感を感じていたら是非続きを見て欲しい。
大きな事故に繋がる前に。。。

結論を先に書くと、Datastore モードの Firestoreに移行された後には各環境のconcurrency modeを確認して欲しい。
このconcurrency modeには3つのモードが存在していて、上記の制限が解除されないケースがあるので確認して欲しい。

IssuyIssuy

実はドキュメントにも書いてあるが、Datastore モードの Firestoreであっても制限がかかったままになるケースが存在する。

https://cloud.google.com/datastore/docs/upgrade-to-firestore?hl=ja#one

これはDatastoreの同時実行モード(concurrency mode)が「エンティティ グループによるオプティミスティック」になってる場合に起こる。
https://cloud.google.com/datastore/docs/upgrade-to-firestore?hl=ja#transactions

以下のコマンドで自分の環境の concurrency mode の確認ができる。

curl -X GET -H "Authorization: Bearer "$(gcloud auth print-access-token) \
"https://firestore.googleapis.com/v1/projects/PROJECT_ID/databases"

もしもあなたが自分の環境の concurrency mode を見たことがないのであれば、今すぐ見て欲しい。
Datastore モードの Firestoreへの自動アップグレードにあたって、concurrency mode は自動的に判別されて設定される。
GCPのログを見れば自動アップグレードの進捗状況が確認できるが、ここからも確認できる模様。
https://cloud.google.com/datastore/docs/upgrade-to-firestore#logs

ちなみに自分の周辺環境では concurrency mode が自動で設定されることで、Production環境とStaging環境でモードが異なる状態になっていた。

IssuyIssuy

concurrency mode を 楽観的(OPTIMISTIC)に変更すると上記の制限が解除される。
そのための手順は以下のドキュメントに記載されている通り、テストプロジェクトで動作確認した上で実施すること。
https://cloud.google.com/datastore/docs/upgrade-to-firestore?hl=ja#optimistic_with_entity_groups_concurrency_mode

OPTIMISTIC と OPTIMISTIC_WITH_ENTITY_GROUPS の切り替えを試した範囲では、モードは即座に切り替わる模様。
Staging環境でモードを切り替えてQAした後、Production環境でモードを切り替える。もし動作異常やアラートが発生した場合は元のモードに切り替えることで事態を収拾できそう。

IssuyIssuy

実際に切り替えて1週間ほど経過。
しばらく様子を見てみたが、特に問題は起きてない。
※切り戻しもすることはなかった

一件落着!