gRPC 스트리밍

gRPC Streaming

한 RPC 안에서 메시지를 여러 번 보내거나 받아 긴 데이터 흐름을 구성합니다.

···
html
<div class="viz"><h3 id="mode">SERVER STREAM</h3><div class="row"><div class="box">client</div><div class="flow" id="flow">→<br>← ← ←</div><div class="box">server</div></div><div class="muted" id="desc">one request · many responses</div></div>
css
.viz{width:94%;height:88%;max-width:960px;padding:clamp(10px,2vmin,18px);border:1px solid var(--line);border-radius:14px;background:var(--surface);font:600 clamp(12px,1.35vw,16px)/1.35 var(--font-sans,system-ui,sans-serif);display:flex;flex-direction:column;gap:clamp(7px,1.8vmin,13px);overflow:hidden}.viz h3{margin:0;color:var(--accent);font:700 clamp(12px,1.35vw,16px)/1.2 var(--font-sans,system-ui,sans-serif);letter-spacing:.04em}.viz .row{display:flex;align-items:center;justify-content:center;gap:clamp(5px,1.4vmin,12px);flex:1;min-height:0}.viz .box{padding:clamp(5px,1.5vmin,12px);border:1px solid var(--line);border-radius:9px;background:var(--bg);text-align:center}.viz .muted{color:var(--muted)}.viz .accent{color:var(--accent)}.viz .code{font-family:ui-monospace,monospace}.viz .pill{padding:3px 7px;border:1px solid var(--line);border-radius:99px;white-space:nowrap}.viz .active{border-color:var(--accent);background:color-mix(in srgb,var(--accent) 12%,var(--surface))}.viz .arrow{color:var(--accent);font:700 18px ui-monospace,monospace}.flow{font:700 clamp(18px,2.4vw,30px)/1.3 ui-monospace,monospace;color:var(--accent);white-space:nowrap;animation:pulse 1s ease-in-out infinite alternate}@keyframes pulse{from{opacity:.75;transform:translateX(-4px)}to{opacity:1;transform:translateX(4px)}}
js
const modes=[['SERVER STREAM','→<br>← ← ←','one request · many responses'],['CLIENT STREAM','→ → →<br>←','many requests · one response'],['BIDI STREAM','→ →<br>← ←','both sides send messages']];let i=0;function draw(){const m=modes[i];document.getElementById('mode').textContent=m[0];document.getElementById('flow').innerHTML=m[1];document.getElementById('desc').textContent=m[2];i=(i+1)%modes.length}draw();setInterval(draw,1700)

gRPC 스트리밍은 단일 요청·응답을 넘어 서버 스트림, 클라이언트 스트림, 양방향 스트림을 제공합니다. 서버 스트림은 한 요청에 여러 응답을 보내고, 양방향 스트림은 양쪽이 독립적으로 메시지를 흘려보냅니다. 각 스트림은 메시지 경계가 있는 순서를 가집니다.

데모는 세 모드의 화살표 방향이 바뀌는 모습을 반복합니다. 실서비스에서는 수신 속도, 취소, 종료 상태와 오류를 함께 다뤄야 하며 양방향이라고 모든 메시지가 동시에 도착한다는 뜻은 아닙니다.

언제 쓰나

지속적 업데이트나 큰 데이터 묶음을 한 연결 안에서 점진적으로 주고받을 때 사용합니다.

페이지로 열기 ↗