100件を超えるレコードを並列処理で更新

背景・実現したいこと

 100件を超えるレコードを並列処理で更新したいのですが、以下のエラーが発生します。

 この記事で「経験上kintoneのREST APIのリクエストでPUTメソッドの同時処理はその幾つかが落ちます」と述べておられる方もいらっしゃいます。

https://developer.cybozu.io/hc/ja/community/posts/208310706-%E3%82%B9%E3%83%86%E3%83%BC%E3%82%BF%E3%82%B9%E6%9B%B4%E6%96%B0%E3%82%92%E8%A1%8C%E3%81%86%E3%81%A8%E3%82%A8%E3%83%A9%E3%83%BC%E3%81%AB%E3%81%AA%E3%82%8B

 エラー内容は少々異なるようですが、やはり並列処理でなく順次処理を行なうしかないのでしょうか。

 ○○件程度だったら並列処理を行なってもあまりエラーが発生しないといった知見をお持ちの方はいらっしゃるでしょうか。

エラー情報

複数回実行しても以下のエラーが発生する

「データベースのロックに失敗したため、変更を保存できませんでした。時間をおいて再度お試しください。」

利用したソースコード

//100件ずつに分割

const slice_by_number = array => {

    const length = Math.ceil(array.length / 100)

    return new Array(length).fill().map((_, i) =>

        array.slice(i * 100, (i + 1) * 100)

    )

}

 

 

//100件のレコードを更新

function put_records(app_id, param_put) {

    return new Promise(function(resolve, reject) {

        const body = {

            “app”: app_id,

            “records”: param_put

        };

        kintone.api(kintone.api.url(‘/k/v1/records’, true), ‘PUT’, body).then(resp => {

            resolve(resp);

        }, error => {

            reject(error);

        });

    });

}

 

//全レコードを更新

const put_all_records = async(function_name, app_id, all_records_json) => {

    const sliced_records = slice_by_number(all_records_json);

    let promises_array = [];

    sliced_records.forEach(records => {

        promises_array.push(new put_records(app_id, records));

    });

    return await kintone.Promise.all(promises_array).then(resp => {

        console.log(“DEBUG”, ${function_name} 更新処理終了後, JSON.stringify(resp));

        return true;

    }).catch(error => {

        console.log(“ERROR”, ${function_name} 更新処理, JSON.stringify(error));

        return false;

    });

}

下記のようなライブラリを使い、並行処理を、ある程度絞る方法で妥協することができるかとおもいます。

https://www.npmjs.com/package/promise-parallel-throttle

 

自分の場合ですが、20程度であれば現状はうまくいってそうです。