Redisでgspreadキュー管理システムを組んでみる

前回、Redisを使って並行処理のサンプルを書きました。
今回から何回かに分けて、gspreadのキュー管理システムを組んでみます。

解決したい課題 : gspreadのエラー回避

Google SpreadsheetをPythonから扱えるgspread。
非常に便利なのですが、エラーが頻発してなかなか安定して使えないという課題があります。
困るのが、「同じコードを動かしても、正しく動作するときと失敗するときがある」こと。
エラーメッセージもInternal ErrorだったりUNAUTHENTICATED だったりです。

以下の記事と同じエラーが度々出ます。
Google API – Google API利用時にAPI errorが発生する|teratail

これまでの要因・対処法

これまで、要因と考えられるものについて以下の対応をしてきました。

  • APIリクエスト制限に引っかかってる → sleepなどをいれて制限を超えないよう調整
  • 認証情報が古くなっている → 定期的に認証処理を実行

これらは一定の効果があり、エラーに遭遇する回数は減りました。
(具体的な内容については機会があればまとめます)

ただ、頻度こそ減ったもののいまだに同様のエラーが発生します。

特に、複数プロセスでgspreadを使う処理を動かしているとエラーが発生する気がしていて、
シングルプロセスではある程度コントロールできているものが、複数プロセスで使うことでうまく扱えていないのではと考えています。

なので、これを解決するアプローチを試してみます。

※もしAPIリクエスト制限超えている旨のエラーメッセージを出そうなものですが…
確証はないものの、並行処理の練習も兼ねて作ってみます。

Redis + 並行処理での解決アプローチ

課題の仮説を整理すると、

  • gspreadはAPI制限、認証のリフレッシュなどがうまく管理できないとエラーを吐く(のではないか)
  • 複数プロセスでgspreadを動かし、かつそれらが同一のアカウントを使用している場合、上記の管理がうまくできず、エラーの原因になっている(のではないか)

となります。
以下のアプローチで、課題の解決を試みます。

  • gspreadを扱うのは一つの専用プロセスだけにする
  • 複数プロセスでgspreadを使用する処理がある場合、専用プロセスにタスクを投げる
  • 専用プロセスは、別プロセスからタスクを受け取りながら、API制限と認証リフレッシュを適切に行いながらタスクを処理する

これらをRedisで実装します。

今日はまず何を作るかを整理しました。
次回から、具体的にコードを書いていきます。

参考

そもそもgspreadとは?どうやって使うの?などは以下のリンクを参考