Retries and backoff

재시도와 백오프

Retries spread out after failures, giving an overloaded service time to recover.

···
html
<div class="n-demo"><div class="n-head"><strong>BACKOFF TIMELINE</strong><span>LIVE TRACE</span></div><div class="n-stage"><div class="back"><div class="back-track"><span id="b0">1</span><span id="b1">2</span><span id="b2">3</span><span id="b3">OK</span></div><div class="back-times mono">0s <span>+1s</span><span>+2s</span><span>+4s</span></div><div id="back-note">attempt 1 failed</div></div></div><div class="n-foot">tap to step · auto replay</div></div>
css
.n-demo{width:min(94vw,760px);height:min(88vh,324px);padding:clamp(9px,2.2vmin,18px);border:1px solid var(--line);border-radius:13px;background:var(--surface);display:flex;flex-direction:column;gap:clamp(5px,1.3vmin,10px);font:600 clamp(12px,2.4vmin,16px)/1.3 "Pretendard Variable",Pretendard,-apple-system,BlinkMacSystemFont,"Apple SD Gothic Neo",sans-serif;overflow:hidden}.n-head,.n-foot{display:flex;justify-content:space-between;align-items:center;color:var(--muted)}.n-head strong{color:var(--accent)}.n-head span,.n-foot{font-size:12px}.n-stage{flex:1;min-height:0;position:relative;display:flex;align-items:center;justify-content:center;gap:clamp(4px,1vmin,10px)}.mono{font-family:ui-monospace,SFMono-Regular,Consolas,monospace}.n-box{padding:clamp(5px,1.5vmin,11px);border:1px solid var(--line);border-radius:8px;background:var(--bg);text-align:center}.n-on{border-color:var(--accent)!important;color:var(--accent)!important;background:color-mix(in srgb,var(--accent) 12%,var(--surface))!important}.n-muted{color:var(--muted)}@media(max-width:400px){.n-head span{display:none}}.back{width:96%;display:grid;gap:10px}.back-track{height:34px;border-bottom:2px solid var(--line);display:flex;align-items:center;justify-content:space-between}.back-track span{display:grid;place-items:center;width:28px;height:28px;border-radius:50%;background:var(--bg);border:1px solid var(--line)}.back-track span:nth-child(2){margin-left:3%}.back-track span:nth-child(3){margin-left:13%}.back-track span:nth-child(4){margin-left:27%}.back-times{display:flex;justify-content:space-between;color:var(--muted);font-size:12px}#back-note{text-align:center;color:var(--accent)}
js
let step=0;function advance(){for(let i=0;i<4;i++)document.getElementById('b'+i).classList.toggle('n-on',i===step);document.getElementById('back-note').textContent=step===3?'recovered after delay':'attempt '+(step+1)+' failed';step=(step+1)%4}
const clickTarget=document.querySelector('.n-demo');if(clickTarget&&typeof advance==='function'){advance();const timer=setInterval(advance,1050);clickTarget.addEventListener('pointerdown',()=>{clearInterval(timer);advance()})}

Retries can help with temporary failures. Exponential backoff lengthens the delay between attempts, and jitter reduces synchronized retry storms across clients.

The demo spreads failure marks farther apart before a successful attempt. Retrying writes without idempotency protection can duplicate side effects.

When to use

Use bounded retries, jitter, and stopping rules for transient 5xx or connection failures.

Open as page ↗