アクセス権の事前評価とアプリの更新時間について

目次

はじめに

kintone はサービスの性質上、リアルタイムでアクセス権の評価をするとレコード取得の時間が遅くなってしまう、といった問題がありました。
そこで kintone では、レコード参照時、高速にアクセス権の評価ができるよう、事前に計算可能な部分を計算しています。

この「アクセス権の事前評価」により、kintone の高速なレコードの参照を実現しているのですが、レコード件数やアクセス権の設定件数によっては「アプリの更新」が遅くなってしまう場合もあります。

本記事では、kintone の「アクセス権の事前評価」の処理概要と、アプリの更新が遅くなる理由およびその緩和策について説明します。

アクセス権の事前評価とは

kintone では『 アクセス権の設定 - kintoneヘルプ (External link) 』にあるとおり、アプリ、レコード、フィールドに対しアクセス権の設定が可能です。
アクセス権設定は kintone の重要な機能のひとつですが、性能面への影響を最小限にするため、内部では複雑な処理をしています。

kintone にはレコードの検索や一括取得といったリクエストが大量にやってきます。
これらのリクエスト内でアクセス権評価をするのですが、ナイーブに実装すると処理が重くなりユーザー体験の悪化につながります。
これを防ぐために「アクセス権の事前評価」として、事前に計算可能な部分についてはアプリのレコードを保存する時に計算しています。

「アクセス権の事前評価」の動作イメージは以下の図のとおりです(図はレコードアクセス権でのイメージ)。
レコードを保存(追加や編集)をする際、 "アクセス権の設定されたレコード/フィールド" と "アクセス権の設定されたユーザー/組織/グループ" の組み合わせで決まるアクセス権を事前に計算して、データベースに保存します。

これにより "アクセス先のレコード/フィールド" と "ログインユーザーの情報" を元に事前評価結果を調べれば、即座にアクセス権の有無が分かます。

アクセス権の事前評価のデメリット

上記のように kintone ではアクセス権を事前に評価し、その結果をデータベースに保存しています。
そのため、レコード/フィールドのアクセス権を変更した場合、アクセス権の事前評価結果を再計算しなければいけません。

そして、レコード数やアクセス権の設定件数が多くなると、以下の問題が発生する場合があります。

  • 「アプリの更新」で時間がかかる。
  • アクセス権の事前評価の処理中にデータベースロックエラーとなる処理がある。

アプリの更新で時間がかかる

通常なら事前評価結果の再計算もすぐに終わるのですが、レコード数やアクセス権の設定件数が多いと、アプリの更新に時間がかかってしまいます。
そのため、アプリによっては設定した内容がすぐに運用環境に反映できない場合もあります。
(過去の例では更新処理に一時間以上かかるケースもありました)

なお、事前評価結果が再計算されるタイミングは以下 3 点です。

  1. アプリの設定画面でレコード/フィールドのアクセス権を変更し、「アプリの更新」を実行した場合
  2. kintone REST API でテスト環境のレコード/フィールドのアクセス権を変更し、テスト環境の設定を運用環境に反映した場合
  3. kintone REST API で運用環境のレコード/フィールドのアクセス権を変更した場合

アクセス件の事前評価処理で時間がかかっている場合、アプリの設定画面では以下のように表示されます。

もしこの表示がされた場合は、もうしばらくお待ちいただければと思います。

アクセス権の事前評価の処理中にデータベースロックエラーとなる処理がある

アクセス権の事前評価結果を再計算している間は、データベースの書込み競合を防ぐために以下の処理ができなくなります。

  1. アクセス権の変更をしたアプリに対するレコードの追加・更新
  2. 同一ドメイン内のすべてのアプリでのアプリの設定変更

この場合、処理を行った画面で以下のようなデータベースロックエラーが表示されます。

データベースロックエラー自体はアクセス権の事前評価以外でも発生する可能性がありますが、過去の例ではアプリの更新がきっかけになっているケースが多いです。
こういった場合は、時間をおいてから処理をやり直していただければと思います。

測定

以下では、アプリの更新時間が実際にどの程度変わるのかを測定しました。

アプリのレコード数とアプリの更新時間の関係

以下のアプリ設定で、レコード数別にアプリの更新時間を計測しました。

  • アクセス権:レコード
    • アクセス権を設定したユーザー数(1 レコードあたり):60 ユーザー
  • レコード数:1000 件、3000 件、5000 件

グラフのとおり、レコード数が増えるほどアプリの更新時間が増加します。

アクセス権を設定するフィールド数とアプリの更新時間の関係

以下のアプリ設定で、アクセス権を設定するフィールド数別にアプリの更新時間を計測しました。

  • アクセス権:フィールド
    • アクセス権を設定したユーザー数(1 フィールドあたりの):60 ユーザー
    • アクセス権を設定したフィールド数:1 個、2 個、3 個
  • レコード数:3000 件

グラフのとおり、アクセス権を設定するフィールドが増えるほどアプリの更新時間が増加します。

アクセス権を設定するユーザー(/組織/グループ)数とアプリの更新時間の関係

以下のアプリ設定で、アクセス権を設定されるユーザ数別にアプリの更新時間を計測しました。

  • アクセス権:フィールド
    • アクセス権を設定したユーザー数(1 フィールドあたり):1~100 ユーザー
    • アクセス権を設定したフィールド数:1 個
  • レコード数:3000 件

グラフのとおり、1 アクセス権あたり設定されるユーザー数が増えるほどアプリの更新時間が増加します。
フィールドアクセス権だけでなく、レコードアクセス権でも同様の傾向となります。
また、ユーザーだけではなく組織やグループでも、1 アクセス権あたりの設定数が増えるほどアプリの更新時間が増加しました。

これらの測定からわかるとおり、レコード/フィールドのアクセス権を設定した場合、レコード数やアクセス権の設定数が増えるほど、
アクセス権の事前評価処理の時間が増えて、アプリの更新時間が長くなる傾向にあります。

緩和策

上記でアクセス権の事前評価に関する問題について説明しましたが、この節ではその緩和策について説明します。

簡単にいうと 、アクセス権の事前評価は "レコード数" × "アクセス権の設定数" × "アクセス権をもつユーザー/組織/グループの数" 回実行されます。
そのため、次のような方法でこれらの数を減らすことができればアクセス権の事前評価処理の時間を短縮できます。

  • アプリのレコード数を減らす(レコード数が多くなった場合はアプリを分割するのも手)
  • アクセス権の数を減らす(条件をまとめる、アクセス権の粒度を緩くする等)
  • アクセス権をもつユーザー/組織/グループの数を減らす(複数のユーザーを登録している場合、グループや組織にする)

またあくまで目安ですが、10 万レコードを超えるデータを扱っている場合はアクセス権の設定変更に時間がかかると想定されるので、夜間に行うことをおすすめします。

おわりに

今回の記事では、kintone の「アクセス権の事前評価」について説明しました。
アクセス権の事前評価により kintone の高速なレコード参照を実現していますが、条件によってはアプリの更新が遅くなります。
もし「アプリの更新」に時間がかかり困っているということでしたら、本記事を参考に設定の見直しをご検討ください。

補足

2023 年 2 月の定期メンテナンスにより挙動が変わり、アクセス権の設定が順次反映されるようになりました。
詳細は 「各レコードにアクセス権設定の変更結果を反映中です」と表示される場合 | kintone ヘルプ (External link) を確認してください。

information

この Tips は、2019 年 3 月版 kintone で動作を確認しています。