path
Jin's Lab
코드로 실험하고 기록하는 개발 일지 · J.Lab

Jin's Lab

코드로 실험하고 기록하는 개발 일지. 커리어와 삶의 방향을 탐색하며 기록하는 공간입니다

api-retry-strategy

Pollinations API 429 오류 해결기: 재시도와 대기 시간 튜닝

J.Lab ·
목차

    최근 개인 프로젝트를 진행하며 무료 이미지 생성 API인 Pollinations API를 아주 유용하게 사용하고 있었다. 빠르고 간편하게 이미지를 얻을 수 있어 만족스러웠는데, 어느 날 청천벽력 같은 에러를 마주했다. 이미지 3장을 연속으로 생성하는 과정에서 HTTP 429 Too Many Requests 오류가 화면을 채운 것이다.

    알고 보니 짧은 시간 내에 너무 많은 요청을 보내서 서버로부터 차단을 당한 상태였다. 무료로 서비스를 제공하는 고마운 API인 만큼 엄격한 속도 제한이 걸려 있는 것은 당연한 일인데, 나의 대처가 너무 안일했다는 생각이 들었다. 문제를 해결하기 위해 곧바로 코드 분석과 수정 작업에 착수했다.

    속도 제한의 벽, 4초의 지연 시간이 남긴 에러 로그

    원인을 분석해보니 기존 코드에 설정되어 있던 이미지 생성 간 딜레이가 겨우 4초에 불과했다. 이미지 하나를 만들고 4초 뒤에 바로 다음 이미지를 요청하니, 서버 입장에서는 악성 디도스 공격이나 매크로 요청으로 판단하기 딱 좋은 패턴이었던 셈이다.

    연속으로 3장을 뽑아낼 때 두 번째나 세 번째 이미지 요청에서 여지없이 429 에러가 터져 나왔다. Pollinations API 429 오류를 해결하려면 단순히 요청 속도를 늦추는 것뿐만 아니라, 오류가 발생했을 때 서버에 부담을 주지 않으면서 우아하게 재시도하는 전략이 절실했다.

    API 서버로부터 HTTP 429 Too Many Requests 에러가 발생하여 빨간 경고 신호가 들어온 상태를 표현한 아이소메트릭 일러스트

    지수 백오프와 대기 시간 재설계로 우회하기

    가장 먼저 손을 댄 부분은 요청 간 기본 딜레이 시간이었다. 기존의 너무 짧았던 4초의 대기 시간을 15초로 대폭 늘렸다. 연속 요청 시 서버가 숨을 고를 수 있는 충분한 최소한의 시간을 확보해 주기 위함이었다.

    다음으로 재시도 전략을 전면 수정했다. 기존에는 에러 발생 시 재시도 횟수가 2회에 불과했고, 대기 시간도 각각 20초와 40초로 다소 획일적이었다. 이를 극복하기 위해 재시도 횟수를 3회로 늘리고, 대기 시간을 지수 백오프 개념을 도입해 30초, 60초, 90초로 차등화했다.

    여기에 결정적인 안전장치를 하나 더 추가했다. API 요청 중 실제로 HTTP 429 응답 코드를 감지하면, 즉시 다음 재시도 단계로 넘어가기 전에 무조건 30초의 추가 대기 시간을 갖도록 별도 분기 처리를 구현했다. 이렇게 하면 일시적인 트래픽 폭주 상황에서도 안전하게 대기한 뒤 재시도를 수행할 수 있다.

    30초, 60초, 90초 대기 시간 간격을 보여주는 지수 백오프 재시도 알고리즘의 타임라인 일러스트

    세 개의 코드 파일에 동일한 처방 내리기

    이번에 수정한 rate limit 대처 로직은 특정 한 곳에만 적용해서는 의미가 없었다. 내가 관리하는 프로젝트 중 Pollinations API를 연동하여 동작하는 KidStory, 이슈로그, JinsLab까지 총 3개의 파일에 이 새로운 재시도 및 대기 시간 공식인 지수 백오프 알고리즘을 동일하게 적용했다.

    각 파일의 통신 모듈을 열어 딜레이와 재시도 카운트, 그리고 추가 대기 분기문을 꼼꼼하게 삽입했다. 하나의 파일만 고쳤다가 다른 곳에서 에러가 재발하면 전체 시스템의 신뢰도가 떨어지기 때문에, 동일한 구조를 가진 세 군데의 코드를 일관성 있게 업데이트하는 과정이 필수적였다.

    KidStory, 이슈로그, JinsLab 세 개의 파일에 동일하게 안정적인 API 연동 패치가 적용된 것을 표현한 아이소메트릭 디자인

    안정적인 API 연동을 마치며

    작업을 모두 완료한 뒤 수십 번의 테스트를 거쳐 이미지 3장을 연속으로 생성해 보았다. 가끔 서버 혼잡도가 높을 때 429 에러가 감지되기도 했지만, 새롭게 설계한 지수 백오프와 추가 대기 시간 분기 처리 덕분에 프로그램이 멈추지 않고 안전하게 대기했다가 모든 이미지를 성공적으로 받아왔다.

    무료 API를 가져다 쓸 때는 항상 제공자의 정책을 존중하고 방어적인 코드를 작성해야 한다는 기본을 다시금 뼈저리게 느꼈다. 4초에서 15초로 늘어난 시간만큼 대기 시간은 조금 길어졌을지 몰라도, 프로그램이 도중에 뻗어버리는 일 없이 끝까지 작업을 완수하는 신뢰성 높은 시스템을 갖추게 되어 뿌듯하다.

    api-retry-strategy exponential-backoff http-429 pollinations-api rate-limiting
    ← 이전 글
    최근 게시물
    다음 글 →
    이전 게시물
    ≡ 글 목록으로
    소개
    path
    J.Lab

    커리어와 삶의 방향을 탐색하며
    기록하는 공간입니다

    카테고리
    403 Forbidden Error 1 AdSense 1 AdSense Bot Detection 1 AI Automation 1 AI Image Generation 1 ai-automation 2 AI-Prompting 1 AIBlogAutomation 1 AICodeLog 1 AIContentGeneration 1 AIImageGeneration 1 AIWritingErrors 1 API Automation 2 API Retry Design 1 api-automation 1 API-Deprecation 1 api-error 1 api-fallback 1 api-retry-strategy 1 api-troubleshooting 1 APIDebugging 1 APIError 1 APIErrorHandling 1 APIIntegration 1 APITokenRenewal 1 AppsScript 1 appsScriptAutomation 1 AutomatedBlogging 1 automation 1 Automation 2 AutomationTroubleshooting 1 Backoff Algorithm 1 Base64Encoding 1 BatchProcessing 1 blog-automation 1 blog-customization 1 blog-migration 3 Blog-Sorting 1 blog-strategy 1 blog-theme-customization 1 blog-workflow 1 blogautomation 1 BlogAutomation 2 Blogger 4 Blogger API 2 Blogger Automation 1 Blogger SEO 1 blogger-api 3 blogger-automation 1 blogger-error-400 1 blogger-labels 1 blogger-seo 1 blogger-tips 1 Blogger-Tips 1 BloggerAPI 3 BloggerBypath 1 BloggerCustomization 2 BloggerFavicon 1 BloggerTemplate 1 BloggerTemplateEditing 1 BloggerTheme 1 BloggerThemeCustomization 1 BloggerXMLStructure 1 Blogging-Automation 1 BloggingTools 1 BlogQuality 1 BlogSpot 1 BWidgetBIncludable 1 CardClickHandler 1 CDATA 1 clamping-text 1 Code Integration 1 codelog 1 CodeLog 1 codeRefactoring 1 contentsequencing 1 cost-reduction 1 CSSOverlay 1 data-parsing 1 DatabaseDesign 1 DataRecovery 1 DateInjection 1 Debugging 2 dev-journey 1 DeveloperJourney 2 DevJourney 1 display-none-seo 1 dom-manipulation 1 dynamic-menu 1 Error-Handling 1 ErrorHandling 1 Execution Timeout 1 ExecutionLimit 1 exponential-backoff 1 FactChecking 1 FaviconEmbedding 1 Feed-API 1 filesystem 1 Flat Illustration 1 FluxModel 1 FreeAIImage 1 FrontEndDev 1 FrontendTips 1 GAS Blogger API 1 gas-automation 1 gas-optimization 1 gas-trigger 1 GASTimeout 1 gasTriggerManagement 1 GCP Project Linkage 1 Gemini 1 Gemini API 1 gemini-api 1 GeminiAPI 1 GeminiPrompt 1 GeminiPromptEngineering 1 GmailRestrictions 1 Google Apps Script 7 Google Discover 1 google-apps-script 3 Google-Apps-Script 1 google-blogger 1 googleAppsScript 1 GoogleAppsScript 6 googlesapps-script 1 hero-image 1 HTMLWidgetBlogger 1 http-429 1 HuggingFace 1 HuggingFaceAPI 1 ico-generator 1 Image Optimization 1 image-automation 1 image-optimization 1 In-App Browser 1 invalid-argument 1 javascript 3 JavaScript 2 javascript-automation 1 javascript-toc 1 jlab-codelog 1 JLabDevLog 1 json-schema 1 label-length-limit 1 linux 1 meta-description 1 Negative Prompt 1 notion-api 1 notion-database 1 notion-gas-integration 1 NotionAPI 1 NotionAutomation 1 notionintegration 1 NotionIntegration 1 OAuth Scope 1 pagination 1 payload-validation 1 permalink-management 1 PersonaDesign 1 pil-image-processing 1 Pinterest 1 Pollinations 1 Pollinations Flux 1 pollinations-api 1 PollinationsAI 1 PositionAbsolute 1 Prompt Design 1 Prompt Engineering 1 prompt-engineering 1 Prompt-Engineering 1 PromptEngineering 1 publishorder 1 python-favicon 1 queue-stuck 1 RandomDelay 1 rate-limiting 1 Refactoring 1 rfc3339 2 Robots Meta Tag 1 RSS Feed 1 scriptNotFound 1 Search Engine Optimization 2 Search-Engine-Optimization 1 SEO Tips 1 seo-optimization 4 SEO-Optimization 1 seriesmanagement 1 SidebarLinks 1 SNSMarketing 1 SVGIcon 1 table-of-contents 1 TechJournal 1 Template 1 ThreadsAPI 1 tistory-migration 1 transparent-favicon 1 triggerCleanup 1 Troubleshooting 1 unzip 1 URL Slug 1 vanilla-js 1 Web Development 1 Web Publishing 2 Web Security 1 web-development 1 Web-Development 1 web-development-tips 1 web-performance 1 web-scraping 1 WebAccessibility 1 WebDevelopment 3 WebDevelopmentTips 1 WebDevJourney 1 windows 1 WorkflowAutomation 1 XMLParser 1 XMLSpecialCharacters 1 XMLTheme 1 zip 1
    인기 글
    GAS에서 Blogger API 403 오류 완전 정복 — appsscript.json 스코프와 GCP 프로젝트 연결
    GAS에서 Blogger API 403 오류 완전 정복 — appsscript.json 스코프와 GCP 프로젝트 연결
    Google Apps Script 실행 시간 6분 제한 — Gmail 계정 함정과 랜덤 딜레이 설계
    Google Apps Script 실행 시간 6분 제한 — Gmail 계정 함정과 랜덤 딜레이 설계
    Blogger 테마 XML 직접 뜯어봤더니 알게 된 것들
    Blogger 테마 XML 직접 뜯어봤더니 알게 된 것들
    다른 블로그
    IssueLog
    IssueLog
    issuelog.jinbytes.com
    KidStory
    KidStory
    kidstory.jinbytes.com
    IT Story
    IT Story
    jinbytes.com
    © Jin's Lab · J.Lab · All Rights Reserved
    jinbytes.com · Powered by Blogger