@@ -17,35 +17,48 @@ def search(keyword:)
1717 end
1818
1919 # NOTE: since_at, until_at は DateTime で指定
20- def fetch_events ( group_id :, since_at : @default_since , until_at : @default_until )
21- begin
22- params = {
23- page : 1 ,
24- since : since_at . utc . iso8601 ,
25- until : until_at . utc . iso8601
26- }
27- events = [ ]
20+ def fetch_events ( group_id :, since_at : @default_since , until_at : @default_until , retry_count : 0 )
21+ params = {
22+ page : 1 ,
23+ since : since_at . utc . iso8601 ,
24+ until : until_at . utc . iso8601
25+ }
26+ events = [ ]
2827
29- loop do
30- part = @client . get ( "groups/#{ group_id } /events" , params )
28+ loop do
29+ part = @client . get ( "groups/#{ group_id } /events" , params )
3130
32- break if part . size . zero?
31+ break if part . size . zero?
3332
34- events . push ( *part . map { |e | e [ :event ] } )
33+ events . push ( *part . map { |e | e [ :event ] } )
3534
36- break if part . size < 25 # 25 items / 1 request
35+ break if part . size < 25 # 25 items / 1 request
3736
38- params [ :page ] += 1
39- end
40-
41- events
42- rescue Faraday ::ClientError => e
43- raise e unless e . response [ :status ] == 429
37+ params [ :page ] += 1
38+ end
4439
40+ events
41+ rescue Faraday ::ClientError => e
42+ # 429: Rate Limit
43+ if e . response [ :status ] == 429
4544 puts 'API rate limit exceeded.'
4645 puts "This task will retry in 60 seconds from now(#{ Time . zone . now } )."
4746 sleep 60
4847 retry
48+ else
49+ raise e
50+ end
51+ rescue Faraday ::ServerError => e
52+ # 502, 503, 504: Server errors
53+ if [ 502 , 503 , 504 ] . include? ( e . response [ :status ] ) && retry_count < 3
54+ wait_time = 2 ** retry_count * 10 # Exponential backoff: 10, 20, 40 seconds
55+ puts "Server error (#{ e . response [ :status ] } ) for group_id: #{ group_id } ."
56+ puts "Retrying in #{ wait_time } seconds... (attempt #{ retry_count + 1 } /3)"
57+ sleep wait_time
58+ fetch_events ( group_id : group_id , since_at : since_at , until_at : until_at , retry_count : retry_count + 1 )
59+ else
60+ puts "Failed to fetch events for group_id: #{ group_id } after #{ retry_count } retries."
61+ raise e
4962 end
5063 end
5164 end
0 commit comments