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

Jin's Lab

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

API Retry Design

GAS 재시도 설계, 6분 타임아웃을 극복하는 현실적 처방

J.Lab ·
목차

    내가 편리하게 사용하고 있던 Google Apps Script(GAS) 기반의 자동 포스팅 시스템에서 갑자기 동작 정지 오류 메일이 쏟아지기 시작했다. 에러 로그를 살펴보니 원인은 GAS의 최대 실행 시간 제한인 360초를 초과하여 프로세스가 강제로 종료된 타임아웃 오류였다. 무료 Gmail 계정이 제공하는 6분이라는 제약 조건에 가로막히는 순간은 늘 당혹스럽기 그지없다.

    문제의 주범을 추적해 보니 본문에 삽입할 이미지를 생성하는 영역에서 병목이 발생하고 있었다. AI 기반 이미지 생성 도구인 Pollinations API를 연동하여 이미지를 그려오는데, 가끔 API 응답이 늦어지거나 일시적으로 오류가 나면 이를 처리하는 대기 시간 설계가 너무 길게 잡혀 있었던 것이다. 효율적인 GAS 재시도 설계가 절실한 시점이었다.

    실행 시간 제한을 나타내는 스톱워치와 코드 화면의 아이소메트릭 일러스트

    왜 6분 실행 시간 제한에 걸렸을까? 기존 설계 분석

    기존에 작성해 두었던 코드의 재시도 로직은 다소 안일하게 구현되어 있었다. API 요청이 실패할 때를 대비한 백오프(Backoff) 대기 시간이 무려 [30, 60, 90]초로 배열 형태로 잡혀 있었던 것이다. 여기에 일시적 과부하 상태를 나타내는 429 에러가 발생할 경우, 추가로 30초를 더 쉬어 가도록 코딩해 두었다.

    이 구조의 치명적인 문제는 이미지 생성 API가 연속적으로 세 번 모두 실패했을 때 발생한다. 총 대기 시간만 계산해도 30초 + 60초 + 90초에 429 가산 시간 30초까지 더해져 최대 240초(4분) 동안 대기 상태에 빠지게 된다. 전체 제한 시간인 360초 중에 240초를 순수 대기 시간으로 허비하니, 남은 2분 남짓한 시간 동안 다른 자동화 작업을 끝마치지 못하고 타임아웃에 빠지는 것은 필연적이었다.

    효율적인 재시도 및 백오프 전략을 시각화한 서버 기어 디자인 일러스트

    대기 시간 축소와 재시도 횟수 조정으로 해결하기

    6분이라는 명확한 제한 내에 안전하게 안착하기 위해 기존의 과도한 대기 규칙을 칼질하기로 결정했다. 우선 최대 재시도 횟수를 기존 3회에서 2회로 축소했다. 실패가 잦다면 굳이 3번까지 끌고 갈 필요 없이 일찌감치 차단하는 것이 전체 시스템 안정성에 훨씬 이롭기 때문이다.

    동시에 대기 시간 배열 역시 기존의 무거운 구조에서 [15, 25]초로 대폭 줄였다. 그리고 429 상태 코드 발생 시 무조건 추가 대기하던 30초 규칙 또한 완전히 덜어냈다. 이렇게 조정을 완료하자, 아무리 API 요청이 지연되고 오류가 발생하더라도 재시도로 소모하는 대기 시간이 최대 40초를 넘지 않게 되었다.

    이미지 생성 실패 시 단호한 발행 중단 정책 유지하기

    이번에 재시도 횟수를 줄이면서 이미지 생성이 끝내 실패할 경우 글이라도 그냥 발행할 것인가에 대한 고민이 깊어졌다. 하지만 내 생각은 확고했다. 비주얼 요소가 빠진 밋밋한 텍스트 중심의 포스팅은 독자에게 정보를 제대로 전달하기 힘들고 가치도 현저히 떨어진다고 생각한다.

    따라서 이미지가 누락된다면 차라리 포스팅 발행 자체를 즉시 중단하는 엄격한 예외 처리 정책을 그대로 고수하기로 했다. 정상적인 형태의 글만 완성도 있게 세상 밖으로 내보내는 편이 블로그의 장기적인 신뢰도 향상에 도움이 되기 때문이다. 이 수정된 효율적 재시도 로직을 내가 운영 중인 KidStory, 이슈로그, JinsLab 세 가지 파일에 동일하게 적용하여 일관성을 맞추었다.

    여러 화면에 성공적으로 발행된 포스트들을 보여주는 미니멀한 디지털 작업 공간 일러스트

    마치며: 환경 제약 속에 찾은 현실적인 최적화

    이번 삽질을 통해 플랫폼이 정해 둔 명확한 한계 시간 내에서 움직여야 하는 클라우드 자동화 서비스의 경우, 타이트한 설계야말로 가장 우아한 해법이 된다는 점을 깨달았다.

    현재는 위와 같이 설계를 개선한 이후로 6분 타임아웃 장벽을 단 한 번도 만나지 않고 세 개 파일 모두 매우 매끄럽게 돌아가고 있다. 제한 시간 내에 확실하게 작업을 끝마칠 수 있도록 최적화된 백오프 타이밍을 세팅하는 일, 이것이 바로 안정적인 자동화의 핵심 비결이다.

    API Retry Design Backoff Algorithm Execution Timeout Google Apps Script Pollinations
    ← 이전 글
    최근 게시물
    다음 글 →
    이전 게시물
    ≡ 글 목록으로
    소개
    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