2000件以上を登録する際の処理時間について

お世話になっております。

1アプリに2000件以上を登録する際の処理時間について質問が御座います。

下記のようなソースで2000件以上を登録する際にbulkRequestを使用して再起処理を行っているのですが「保存」ボタンをクリック後に約1分ほど動かなくなってしまう状態となってしまいます。

10秒とかの待ち時間であれば件数も多いから・・・と納得は出来るのですが1分以上はさすがに長すぎるかなと思っておりロジックの見直しをしています。

2000件以上を繰り返す際には再起処理を実行しているのですが処理時間を減らす案みたいなものがあれがご教示いただけませんでしょうか?

bRequest関数を呼び出すあたりまでの処理時間は大体3秒ほどで終わっていることは確認しています。

//新規追加登録後のイベント
kintone.events.on('app.record.create.submit.success', function (event) {
  return new kintone.Promise(function (resolve, reject) {
    kintone.api(kintone.api.url('/k/v1/apps', true), 'GET', {}, function (resp) {
      //レコード情報の取得
      var record = event.record;
      //追加するレコードリスト
      var newRecords;
      //レコード情報の作成
      newRecords = createNewRecords(record);
      //newRecordsで登録する配列を作成
      //(例) [{…}, {…}]
      // 0: {TEST: {…}, TESTコード: {…}, 日付: {…}}
      // 1: {TEST: {…}, TESTコード: {…}, 日付: {…}}
      //...2001: {TEST: {…}, TESTコード: {…}, 日付: {…}}

      //bulkRequestで使用するbodyの配列を作成
      var bulkLists = bulkCreate(newRecords);
      //bodyを作成し、配列化する
      //(例) [{…}, {…}]
      //0:
      // api: "/k/v1/records.json"
      // method: "POST"
      // payload: {app: 1, records: Array(2)}←Arry(2000)にnewRecordsで作成した2000件が入っています。
      //1:
      // api: "/k/v1/records.json"
      // method: "POST"
      // payload: {app: 1, records: Array(1)}

      var bResult = bRequest(bulkLists, 0);

      if (bResult) {
        resolve(bResult);
      } else {
        return event;
      }
    }, function (error) {
      // error
      alert("情報の登録に失敗しました。");
    });
  }).then(function (resp) {
    alert("情報の登録が完了しました。");
    return event;
  });
});

function bRequest(bodyLists, count) {
  return new kintone.Promise(function (resolve, reject) {
    kintone.api(kintone.api.url('/k/v1/bulkRequest', true), 'POST', bodyLists[count], function (resp) {
      resolve(resp);
    }, function (error) {
      console.log(error);
      return false;
    });
  }).then(function (resp) {
    count++;
    //body配列の数がcountと一緒になるまで再起処理を行う
    if (bodyLists.length==count) {
      return ture;
    } else {
      bRequest(bodyLists, count);
    }
  });
}

 

富永さん

RDB だと数千件のレコードでも短時間で追加できますが、kintone だと時間がかかりますね。

大量のレコード追加の処理時間を短縮するには、パラレルでAPI処理するくらいだと思いますが

サーバー側のリソースが競合してあまり短縮にはならないかもしれません。

また kintone サーバー側の負荷が大きくなりますので、避けた方がいいですね。

kintone のレコード追加は、時間がかかるものだという前提で、ユーザーが待ち時間が気にならないしくみを検討してはいかがでしょうか?

処理中に無応答で1分もかかるとユーザーは何かトラブルじゃないかと心配になります。

処理中にプログレスや処理済件数などの情報を表示すると、あとどのくらいかかるか予想出来ますのでユーザーは待てます。

最近、信号で待ち時間が表示されるものがありますが、あれと似てますね。

ご参考にプラグインでレコード更新するときの表示例です。

この例はレコード数が少ないですが、レコード数が多い場合は処理済み件数が更新されていきます。

 

rex0220様

 

前回に続き、ご対応いただきありがとう御座います。

ということは2000件登録で1分くらいかかるのは仕様と捕らえてるのがよいのでしょうか?

今行っている対応としてはspin.jsを使用して「保存」ボタンクリック後にロード中のような画面を出して画面を触らせないようにしています。

どれくらいかかるかを見せるについてですが検討させていただきます。

bulkRequest で、一括登録すると処理時間の大部分は kintone サーバー側の処理ですので、1分かかってしまうのは現在の実力といっていいと思います。

今後のパフォーマンス改善に期待ですね。

rex0220様

 

ご返事いただきありがとう御座います。

サーバー側の処理の問題っていうことですね・・・わかりました!

では登録中に進捗が見れるような処理を作ることで考えてみたいと思います。

ご対応いただきありがとう御座いました!