gRPC Streaming

gRPC 스트리밍

One RPC can send or receive a sequence of messages instead of one pair.

···
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 streaming extends a unary call with server, client, and bidirectional message streams. A server stream returns multiple messages for one request; a bidirectional stream lets both peers send independently. Each stream preserves message boundaries and order.

The demo cycles through arrow directions for the three modes. Production code must handle receiving pace, cancellation, completion, and errors; bidirectional does not mean every message arrives at the same time.

When to use

Use it for progressive updates or larger exchanges within one RPC.

Open as page ↗