Skip to content

Doorkeeper API の504エラーに対するリトライ処理とタイムアウト設定を追加#1798

Merged
yasulab merged 1 commit intomainfrom
fix-doorkeeper-504-retry
Jan 21, 2026
Merged

Doorkeeper API の504エラーに対するリトライ処理とタイムアウト設定を追加#1798
yasulab merged 1 commit intomainfrom
fix-doorkeeper-504-retry

Conversation

@yasulab
Copy link
Copy Markdown
Member

@yasulab yasulab commented Jan 21, 2026

概要

Doorkeeper API で発生する 504 Gateway Timeout エラーに対応するため、リトライ処理とタイムアウト設定を追加しました。

問題

統計/地図スクリプト(rails statistics:aggregation)が Doorkeeper API の 504 エラーで失敗していました。

エラーログ:

the server responded with status 504

解決策

1. タイムアウト設定の追加 (lib/event_service/client.rb)

  • 接続タイムアウト: 10秒
  • 読み取りタイムアウト: 60秒
  • 無限待機を防止し、適切なタイミングでエラーを検出

2. サーバーエラーのリトライ処理 (lib/event_service/providers/doorkeeper.rb)

  • 502/503/504 エラーを検出して自動リトライ
  • Exponential backoff: 10秒 → 20秒 → 40秒
  • 最大3回までリトライ
  • リトライ時に group_id を含む詳細なログを出力

3. 詳細なログ出力 (lib/statistics/tasks/doorkeeper.rb)

  • どの Dojo を処理中かを表示
  • 取得成功時のイベント数を表示
  • エラー発生時に Dojo 名と group_id を記録

動作確認

ローカル環境で以下のタスクを実行し、正常動作を確認:

bundle exec rails statistics:aggregation

Aggregate of doorkeeper
  Fetching events for 富谷 (group_id: 11839)
    ✓ Successfully fetched 1 events
  Fetching events for 多摩センター (group_id: 9608)
    ✓ Successfully fetched 0 events
  ...(51個のDojoを正常に処理)

bundle exec rails upcoming_events:aggregation

Aggregate of connpass
[connpass] Fetched events: 116

Aggregate of doorkeeper
Server error (504) for group_id: 10783.
Retrying in 10 seconds... (attempt 1/3)
[Doorkeeper] dojo_id: 232, group_id: 10783, fetched events: 0
✓ リトライで成功!

重要: 2箇所で一時的に 504 エラーが発生しましたが、リトライ処理により自動的に回復し、正常に完了しました。

テスト

全 216 テストが成功:

bundle exec rspec spec
216 examples, 0 failures

影響範囲

  • lib/event_service/client.rb: 全ての外部 API クライアントにタイムアウト設定が適用
  • lib/event_service/providers/doorkeeper.rb: Doorkeeper API 専用のリトライ処理
  • lib/statistics/tasks/doorkeeper.rb: 統計タスクのログ改善

備考

  • Doorkeeper API サービスが完全にダウンしている場合、3回のリトライ後に適切にエラーとして報告されます(これは正常な動作です)
  • 一時的なサーバー不調の場合、自動的に回復を試みます

## 変更内容

### 1. タイムアウト設定の追加 (lib/event_service/client.rb)
- 接続タイムアウト: 10秒
- 読み取りタイムアウト: 60秒
- 無限待機を防止

### 2. サーバーエラーのリトライ処理 (lib/event_service/providers/doorkeeper.rb)
- 502/503/504エラーを検出して自動リトライ
- Exponential backoff: 10秒 → 20秒 → 40秒
- 最大3回までリトライ
- group_id を含む詳細なエラーログ

### 3. 詳細なログ出力 (lib/statistics/tasks/doorkeeper.rb)
- どのDojoを処理中かを表示
- 取得成功時のイベント数を表示
- エラー発生時にDojo名とgroup_idを記録

## 動作確認

ローカル環境で以下のタスクを実行し、正常動作を確認:
- `bundle exec rails statistics:aggregation`
  - 51個のDojoを正常に処理
- `bundle exec rails upcoming_events:aggregation`
  - Connpass: 116イベント取得
  - Doorkeeper: 2箇所で504エラー発生 → リトライで成功

## テスト

全216テストが成功:
```
bundle exec rspec spec
216 examples, 0 failures
```

## 関連Issue

統計/地図スクリプトの504エラーに対応
@yasulab yasulab merged commit 5c25db4 into main Jan 21, 2026
5 checks passed
@yasulab yasulab deleted the fix-doorkeeper-504-retry branch January 21, 2026 02:26
yasulab added a commit that referenced this pull request Jan 21, 2026
リトライ回数と待機時間を短縮し、Heroku Scheduler での実行時間を削減

## 変更内容

- リトライ回数: 3回 → 2回 に削減
- バックオフ時間: 10秒 → 20秒 → 40秒 から 5秒 → 10秒 に短縮
- 合計待機時間: 最大70秒 → 最大15秒

## 最悪ケースの想定実行時間

以前: 51 Dojos × (60秒 × 3回 + 70秒) = 約213分(3.5時間)
改善後: 51 Dojos × (60秒 × 2回 + 15秒) = 約115分(2時間)

Heroku Scheduler の実行時間制限を考慮し、一時的なエラーには十分対応しつつ、
完全ダウン時の無駄な待機時間を削減。

## テスト

全 216 テストが成功:
`bundle exec rspec spec`
216 examples, 0 failures

関連: #1798
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant