【要約】requests.get() しか使っていない人へ — Session・Retry・hooks・links・AuthBase [Zenn_Python] | Summary by TechDistill
> Source: Zenn_Python
Execute Primary Source
// Problem
開発者がrequests.get()等のモジュールレベル関数を常用することで、通信効率と保守性に課題が生じている。具体的には以下の問題が発生する。
- ・接続の都度破棄によるオーバーヘッド:呼び出しのたびにSessionが破棄され、TCP/TLSハンドシェイクが繰り返される。
- ・責務の混在:リトライ、認証、ログ出力といった通信制御ロジックが、各API呼び出しのコード内に散在する。
- ・タイムアウト管理の欠如:デフォルトのタイムアウト設定がないため、リクエストが無限に待機するリスクがある。
// Approach
筆者は、requests.Sessionを基盤として、通信制御の責務をアプリケーション層から接続層へ集約する手法を採用した。
- ・Sessionによる接続再利用:Keep-aliveを利用し、同一ホストへの複数リクエストにおけるハンドシェイクを削減する。
- ・HTTPAdapterによるリトライ制御:urllib3.Retryをマウントし、指数バックオフを含むリトライを接続層で自動化する。
- ・event hooksによる一元処理:全レスポンスに対するログ出力や機密情報のマスク処理を、Sessionの性質として実装する。
- ・AuthBaseによる認証の隠蔽:トークンリフレッシュ等の複雑な認証ロジックを、カスタム認証クラスとしてカプセル化する。
- ・Lambda最適化:Sessionをハンドラ外で保持し、実行環境のウォームスタート時に接続を再利用する。
// Result
Sessionへの移行により、通信パフォーマンスと開発効率の両面で顕著な改善が得られた。
- ・通信速度の向上:GitHub APIへの10回のリクエストにおいて、実行時間が604msから244msへ約2.5倍高速化した。
- ・コードの簡潔化:ページネーション処理をresponse.linksにより1行で記述可能にし、認証ロジックを呼び出し側から隠蔽した。
- ・堅牢性の向上:リトライやタイムアウト設定をSessionに集約することで、実装漏れを防ぐ構造的な防御を実現した。
Senior Engineer Insight
> 本記事は、ライブラリを「動く」レベルから「使いこなす」レベルへ引き上げる実践的な指針である。特に、リトライや認証を接続層(Session)へ寄せる設計は、責務の分離という観点から極めて正しい。大規模システムでは、こうした共通基盤の作り込みが、個々のビジネスロジックの記述ミスを防ぎ、運用コストを劇的に下げる。LambdaでのSession再利用は、サーバーレス特有のレイテンシを制御する上で必須のテクニックである。