kintone のデータを毎日まるごと別の場所に取り続ける、という処理を書いています。
全アプリのレコード・添付ファイル・コメント・アプリ設定を毎日1世代として取得し、前日と突き合わせて差分を出す、という形です。
作ってみると、難しいのは取得そのものではなく API リクエスト枠の設計 でした。
自分が最初に誤解していたことが3つあったので共有します。同じことをやる方の役に立てば幸いです。
1. リクエスト数のリセットは 0時ではなく JST 9:00
1アプリ1日あたりのリクエスト数に上限がある、というのは知っていたのですが、集計期間が 9:00〜翌8:59 だというのを見落としていました。0時で切り替わるものだと思い込んでいて、夜間バッチの時刻を決めるときに前提がずれていました。
夜中の2時台に回すと、「利用者が日中に使ったあとの残り枠」 を使うことになります。枠が欲しいだけなら9時直後のほうが有利ですが、それは業務時間帯に負荷をかけることになるので、結局は夜間のままにしました。順番としてはこれでいいと思っています。
2. 上限を超えても、その場でエラーにはならない
これも誤解していました。超えた瞬間に 4xx が返ってくるものだと思っていたのですが、実際に起きるのは 翌日9時ごろ、cybozu.com のストア管理者に超過メールが届く ことでした。公式には「他のユーザーの環境に重大な影響を及ぼす場合、API処理を中断することもある」とも書かれています。
即座に止まらないぶん、気づくのが利用者側になる のが厄介だと思いました。ツールを入れた結果、管理者に警告メールが飛ぶのは避けたいので、自分の側で上限を持つ ことにしました。既定は公式上限の半分にして、残りは利用者の業務のために空けています。
3. コメントの取得だけ桁が違う
レコード本体は 1リクエスト 500件なので、1万件のアプリでも 20リクエストです。ところが コメントは一括取得のエンドポイントが無く、アプリとレコードを1件ずつ指定 します。1リクエストで取れるのは最大10件。
レコード 10,000件のアプリを1回走査する場合
レコード本体 : 20 リクエスト
コメント : 10,000 リクエスト(1レコード1リクエスト以上)
これだけで1日の枠を使い切ります。しかも コメントの投稿・削除ではレコードの revision も更新日時も動かない ので、「前回から変わったレコードだけ見る」という安い差分が取れません。毎回全件なめることになります。
結局、全部いっぺんに取るのは諦めて、1日に使う予算を決めて、前回の続きから少しずつ舐める(カーソルを持つ)形にしました。
おまけ: アプリ設定は 17 か所に散らばっている
ついでに踏んだ話です。「アプリの設定」を一式取ろうとすると、エンドポイントが 17 本ありました。
app / app/settings / app/form/fields / app/form/layout / app/views /
app/status / app/actions / app/reports /
app/notifications/general / app/notifications/perRecord / app/notifications/reminder /
app/acl / record/acl / field/acl /
app/customize / app/plugins / app/adminNotes
アクセス権だけで3本(アプリ・レコード・フィールド)あります。
また /k/v1/app.json だけアプリ指定のパラメータが id で、他は app でした。ここを揃えて書いて 400 (CB_VA01) を出しました。
権限やプランによって 403/404 が返るエンドポイントもあるので、取れなかったものは握り潰さず、理由つきで残す ようにしています。「取れなかった」と「変わっていない」を混ぜると、あとで差分を見たときに嘘をつくことになるので。
伺いたいこと
枠の使い方について、皆さんがどうされているか知りたいです。
- 定期的に全件を取りにいく処理で、1日に使うリクエスト数をどれくらいに抑えていますか
- 利用者の業務と枠を分け合う前提で、実行時刻はどう決めていますか
- コメントのように差分が取れないデータを扱うとき、他に手はあるでしょうか
(株式会社VILLION で kintone のデータ保護まわりを作っています)