実現したいこと
FX情報サイトhttps://song.co.jp/fx/で、複数のFXブローカーが提供するREST APIから
USD/JPYの為替レートを取得して比較表を作成しています。
Pythonのrequestsライブラリを使って各APIにアクセスしていますが、
一部のブローカーAPIで頻繁にタイムアウトエラーが発生し、
データ取得が不安定になっています。
安定してデータを取得できるようにしたいです。
発生している問題・分からないこと
5つのブローカーAPIから順次データを取得していますが、
そのうち2つのAPIで約50%の確率でタイムアウトエラーが発生します。
特にアクセスが集中する時間帯(NY市場オープン時など)に頻度が高くなります。
エラーメッセージ
error
1requests.exceptions.ReadTimeout: HTTPSConnectionPool(host='api.broker-example.com', port=443): Read timed out. (read timeout=5) 2
該当のソースコード
特になし
試したこと・調べたこと
- teratailやGoogle等で検索した
- ソースコードを自分なりに変更した
- 知人に聞いた
- その他
上記の詳細・結果
【試したこと1】
timeoutを5秒から10秒、30秒と延長してみました。
→ 結果: エラー頻度は減りましたが、完全には解決せず。
また、レスポンスが遅いAPIのせいで全体の処理時間が大幅に増加しました。
【試したこと2】
requests.Sessionを使ってコネクションプールを有効化しました。
→ 結果: わずかに改善しましたが、根本的な解決には至りませんでした。
【試したこと3】
Googleで「requests timeout retry」で検索し、
retry処理の実装例を探しましたが、どの方法がベストプラクティスか判断できませんでした。
【質問したいこと】
・タイムアウトを回避するための推奨実装方法
・リトライ処理を組み込む際のベストプラクティス
・複数APIを効率的に処理する方法(並行処理など)
現在のコード:
python
1import requests 2 3def get_forex_rate(url): 4 try: 5 response = requests.get(url, timeout=5) 6 return response.json()['rate'] 7 except requests.exceptions.ReadTimeout: 8 print("タイムアウト") 9 return None 10 11urls = [ 12 "https://api.broker-a.com/rates/USDJPY", 13 "https://api.broker-b.com/rates/USDJPY" 14] 15 16for url in urls: 17 rate = get_forex_rate(url) 18 print(f"Rate: {rate}") 19 20### 補足 21特になし