rex0220 様
ご報告が遅くなりまして申し訳ございません。
お陰様でご案内頂いた内容を元に、全体的に仕様を見直し、fields指定やqueryで取得条件を絞り出来る限り不要なデータは取得しないようにしました。
また、事前に集計をしておけるものは別アプリに集計をしておくなどして、オペレータの操作時に余計な処理が実行されないように対応をさせて頂きました。
具体的な対策前後の処理時間の差は記載しておりませんが、いずれもオペレータは1~2秒の待ち時間となり、ストレスを感じ無いようになりました。
ご助言ありがとうございました!
ご指摘頂きましたとおり、サイボウズのサポートご担当者様からも同様にサーバーに負荷の掛かるようなパラレル処理は遠慮して欲しいと言われておりましたので、
今回は下記の対策を実施することとさせて頂きました。
(1) fields指定
▼目的: 取得するデータの項目(field)数をできるかぎり減らして、処理時間を短くする。
▼対策: すべてのGETコマンドのオプションにfields:指定をして、取得する項目を限定することで取得する。
▼結果: 取得するデータ量が減り、処理に掛かる時間が短縮されました。
//■ 修正前 ■-----------------------------------------
kintoneUtility.rest.getAllRecordsByQuery({
app:kintone.app.getId(),
totalCount:true,
isGuest:false
}).then(function (response) {
varrecords=response.records;
}).catch(function (error) {
console.log(error.message);
});
//■ 修正後 ■-----------------------------------------
kintoneUtility.rest.getAllRecordsByQuery({
app:kintone.app.getId(),
// ↓ 取得するフィールドコード指定:指定しない場合はアクセスできるすべてのフィールドが返却される
fields: [‘商品名’, ‘料金’, ‘種別’],
totalCount:true,
isGuest:false
}).then(function (response) {
varrecords=response.records;
}).catch(function (error) {
console.log(error.message);
});
(2) 一覧に表示されているレコードのみを処理
▼目的: 取得するレコード数をできるかぎり減らして、処理時間を短くする。
▼対策: 表示に関するGETコマンド処理を実行する箇所は、kintone.app.getQuery()や、queryでlimit指定をして、一覧に表示されるレコードのみを限定して取得する。
▼結果: 取得するレコード数が一覧に表示されている20件~最大で100件までに減ったため、処理に掛かる時間が短縮されました。
//■ 修正前 ■-----------------------------------------
kintoneUtility.rest.getRecords({
app:kintone.app.getId(),
totalCount:true,
field: [‘商品名’, ‘料金’, ‘種別’],
isGuest:false
}).then(function (response) {
records=response.records;
}).catch(function (error) {
console.log(error.message);
});
//■ 修正後 ■-----------------------------------------
kintoneUtility.rest.getRecords({
app:kintone.app.getId(),
// ↓ kintone.app.getQuery() 一覧のクエリ文字列を取得(order by, limit, offset付き)
query:kintone.app.getQuery(),
totalCount:true,
field: [‘商品名’, ‘料金’, ‘種別’],
isGuest:false
}).then(function (response) {
records=response.records;
}).catch(function (error) {
console.log(error.message);
});
(3) 集計用の別アプリを作成
▼目的: 集計結果を別アプリから取得するだけの処理にして、処理時間を短くする。
▼対策: 特定の操作の都度、集計をするのでは無く集計用の別アプリに集計結果を記録する。
▼結果: オペレータの操作時は結果のみ取得するだけとなり、処理時間を短縮できました。
(4) 各レコードの状態フラグ管理用のチェックボックス項目を追加し、定期的にフラグを更新する処理を追加
▼目的: バックグラウンドで定期的にレコードの状態だけ確認・更新する処理を実行させて、オペレータに処理待ち待ちさせないようにする。
▼対策: 全レコードの状態を確認する必要のある機能は、各レコードごとの状態フラグ管理用のチェックボックス項目を用意して、
外部サーバーからかもしくはアプリ内のタイマー処理で定期的にレコードの状態フラグを更新するだけの処理を追加。
▼結果: オペレータによる特定の操作をする際に全レコードの状態を確認する処理をいちいち実行する必要がなくなりました。
//-------------------------------------------------------------------------------------------------------
// タイマー処理:1時間に1回ステータス確認と状態フラグの更新
//-------------------------------------------------------------------------------------------------------
functionRecordStatusUpdate() {
vartimer=setInterval(function () {
//レコード全件取得
kintoneUtility.rest.getAllRecordsByQuery({
app:kintone.app.getId(),
fields: ['商品名', '料金', '種別'],
totalCount:true,
isGuest:false
}).then(function (response) {
varrecords=response.records;
//レコードの状態を確認して、フラグを立てるデータを作成
//var data = {
//~省略~
varparam= {
app:kintone.app.getId(),
records:data,
isGuest:false
};
//レコードのフラグを立てる
kintoneUtility.rest.putAllRecords(param).then(function (resp) {
}).catch(function (error) {
console.log(error.message);
});
}).catch(function (error) {
console.log(error.message);
});
}, 3600000); /* 1時間に1回 */
}