はじめに
この記事は アイスタイル Advent Calendar 2024 8日目の記事です。
はじめまして。 アイスタイルで店舗系システムの運用をしています、shirakiyです。
これまでは見る専門だったのですがQiitaデビューのチャンスだと思い、業務の振り返りとやったことをまとめることにしました。
プライベートなことを少し挟むのがアドカレらしいと感じるので挟むと、最近幽遊白書のアニメを見始めました。幻海の門下生大選考会に入りました。
対象のバッチ
月初に店舗在庫の集計バッチが動き、集計結果をgoogleスプレッドシートに出力し事業部の方に連携しています。
バッチ作成当時からすると店舗数・取り扱い商品数ともに増加しているのでデータ量も増加しています。
バッチで発生したエラー
公式Doc:https://developers.google.com/sheets/api/troubleshoot-api-errors?hl=ja
1. バックエンドエラー
"error": {
"code": 500,
"message": "Internal error encountered.",
"errors": [
{
"message": "Internal error encountered.",
"domain": "global",
"reason": "backendError"
}
],
"status": "INTERNAL"
}
調べると、ピボットテーブルがシート上に存在することでもこのエラーが発生してしまうそうです。
(今回はピボットテーブル不使用です。)
リクエスト上限が割り当てられており、リクエストが過多になるとエラーが発生します。
公式の表を見ていると1分のスリープ入れれば分間リクエスト上限はクリアできそうです。
書き込み | リクエスト上限値 |
---|---|
1 プロジェクト、1 分あたり | 300 |
1 プロジェクト、1 ユーザー、1 分あたり | 60 |
対処方法:処理中に1分間のタイムスリープを入れる
sleep(60)
2. サービス利用不可エラー
"error": {
"code": 503,
"message": "The service is currently unavailable.",
"errors": [
{
"message": "The service is currently unavailable.",
"domain": "global",
"reason": "backendError"
}
],
"status": "UNAVAILABLE"
}
公式ドキュメントによると
リクエストまたはスプレッドシートの複雑度が高いときに 503 エラーを返します。
とのことです。
手動実施の場合、データ量の多い部分から再実施をしていることが多いので要求過多が原因のような気がします。
対処方法:現状だとバッチの実施タイミングの時間を数分置くことで解決してます
↑ログを確認していたりすると時間が経過していることが多いので、再実施すると大体うまくいっています。
今後の対応として
対象のバッチは、リカバリの手動実施2−3回行うことで成功することができています。
とはいえ手動なこともあり完全自動完結を目指して、リトライ処理を入れているところになります。
やはり細かく実施していくしかなさそうです。
$retryCount = 3;
// 店舗ごとにスプレッドシートを作成
foreach ($shops as $shop) {
// スプレッドシートへの分間リクエスト数を調整する為sleepを実行
sleep(60);
for (; $retryCount > 0; $retryCount--) {
try {
// シート作成メソッドをコール
$this->createSheet($shop);
} catch (\Exception $e) {
log("Googleリクエスト上限となったため、5分待機します");
sleep(300);
}
}
}
最後に
売り上げが伸びている事は大変喜ばしいことですが、サービスが伸びていくごとにサーバーだけではなく
管理機能への負荷も高くなっていくので、ある程度見越した適切な対応が必要になってくると感じました。
最後までお読みいただきありがとうございました!
それでは、良いクリスマス&年末をお過ごしください!