大量(10000件)のレコードのステータス更新について

いつもお世話になっております。

10000件のレコードのステータス更新にかなり時間がかかってしまいます。

APIの仕様上、100件ずつ分割してPUTリクエストしています。

並列処理だと15分くらいで終わるのですが、たまにデータベースロックのエラー(520?)が出るのでやめました。

順次処理だとエラーは出ませんが、40分近くかかります。

速度改善のなにかいいアイデア在りましたら是非お願いします。。

fetchRecords(kintone.app.getId()).then(function (resp) {

// GETで全レコード取得してくる

let obj;

let result = [];

resp.forEach(function (val) {

if (val.ステータス.value === status) {

obj = {

id: val.$id.value,

action: action,

};

result.push(obj);

}

});

// 更新対象のレコードが無かったら終わり

if (result.length === 0) {

alert('更新対象のレコードがありません。');

return;

}

const params = result.reduce(function (arr, item) {

const last = arr[arr.length - 1];

if (last.length === 100) {

arr.push([item]);

return arr;

}

last.push(item);

return arr;

}, [[]]);

let promiseArr = [];

let count = 0;

for (let i = 0; i < params.length; i++) {

let body = {

app: kintone.app.getId(),

records: params[i]

};

promiseArr.push(body);

}

const promises = promiseArr.map(function (item) {

return function (arg) {

return kintone.api(kintone.api.url("/k/v1/records/status", true), "PUT", item).then(function (resp) {

console.log(resp);

}).catch(function (error) {

alert(error.message);

});

};

});

promises.reduce(function (pre, cur) {

return pre.then(cur);

}, kintone.Promise.resolve());

}).catch(function (error) {

console.log(error);

alert("更新に失敗しました。" + error.message);

});

お試しされている通り、(自身の経験からも)PUTを並行リクエストするのが難しいため、時間の短縮は難しい内容だと考えます。

Yamashitaさん

コメントありがとうございます!

リクエストの送り方で速度改善できるかと挑戦してましたが難しいですかねー・・・

DBの性能アップ待ちですかね。

サーバーの負荷を一切考えなければ、

1)並列処理で全部走らせる。

2)ステータス変更に失敗したレコードだけを、順次処理で再度処理する。

これで、トータル時間は短縮できるかもしれません。

(サイボウズさんのインフラ担当さんに嫌われるかもしれませんが)

 

あとは、10000件のレコードのステータス更新をしなければいけない状況自体を、避けられないかについて、運用とか設計レベルで見直しをしてみるかでしょうか。メンテナンスとかで10000件のステータス変更とかは想像つきますが、日常的にその処理が必要なのは、私の経験内だとちょっとイメージがわかないので、運用的な逃げ道がありそうな気もします。

そもそも論的に10,000を一度に処理しないといけない状態を生み出さなくて済む運用・条件が作り出せればそれが一番だと思います。
もしくは、バックエンドで処理する等ですね。

PUTの失敗率は結構波がある様子で、失敗分だけ後追いする
逐次系も結果的にまぁまぁ時間かかったり、エラーのハンドリングが微妙な書き方になってくので、50歩100歩かもしれません。
ロックさせると暫く生き返らなくなって連続処理にできなくなることもありますし。

松村さん

サーバに負荷かけるのはやっぱり避けたいですよねー。

 

>あとは、10000件のレコードのステータス更新をしなければいけない状況自体を、避けられないかについて、運用とか設計レベルで見直し

 

やっぱりそうなっちゃいますよねー

相手側に運用で何とかしてもらえるよう打診します!

ありがとうございました!

 

 

Yamashitaさん

 

>ロックさせると暫く生き返らなくなって連続処理にできなくなることもありますし。

 

これは知りませんでした!これからは並列処理はできるだけしないようにします。

ありがとうございました!

>>ロックさせると暫く生き返らなくなって連続処理にできなくなることもありますし。

 

レコードの更新、ステータス更新もPUTは負荷がかかりやすいようで、1万くらいではロックしないと思いますが、

感覚的に数十万くらいから危ない感じです。API通らないなぁと思ってブラウザでアクセスしようとすると、

困り顔アイコンの520の画面になってて画面からも暫く操作できなくなるってことが起きたりします。

他方しっかり処理の順序制御してて困り顔に出会ったことは、ブラウザからの同時アクセス(利用ユーザー)が多い

ケースであったような、なかったようなといった感じです。

Yamashitaさん

 

数十万件ですか・・・経験したことないので為になります!

規模が大きくなるとAPI同時リクエスト数とかも視野に入れないとダメなんですねー。