X-Accel-Buffering
μ€λμ μ κ°μΈμ μΌλ‘ μμ§μμ€λ‘ μμ보λ 리λ²μ€ νλ‘μλ₯Ό νμ΅νλ©΄μ μ΄λ²€νΈ μ€νΈλ¦Όμ λν νλ‘μ κ΅¬μ± μ proxy_buffering κ³Ό κ°μ λ²νΌλ§ μ΅μ μ λΉνμ±ν ν΄μΌνλ€κ³ μ 리νμμ΅λλ€. HTTP/2 μ°κ²°κ³Ό ν¨κ» SSE(Server Sent Event)λ₯Ό νμ©νλ©΄ κ΅³μ΄ μΉμμΌ κ΅¬νμ νμ§ μμλ μλ² μΈ‘μμ ν΄λΌμ΄μΈνΈλ‘ μνλ λ°μ΄ν°λ₯Ό μ§μμ μΌλ‘ μ λ¬ν μ μμ΅λλ€.
νμ§λ§, Nginx μΈ‘μμλ Nginx ꡬμ±μ λν 10κ°μ§ μ€μμμ Mistake 5: The proxy_buffering off DirectiveμΌλ‘ λ²νΌλ§ μ΅μ μ λν λΉνμ±νμ λν΄μ μ΄μΌκΈ°ν©λλ€.
Buffering can also be enabled or disabled by passing βyesβ or βnoβ in the βX-Accel-Bufferingβ response header field. This capability can be disabled using the proxy_ignore_headers directive.
μμ κ°μ΄ μμ§μμ€ κ³΅μ λ¬Έμ μμλ νλ‘μ λ²νΌλ§μ 무μν μ μλ ν€λμ λν μ€λͺ μ ν΄μ£Όκ³ μμΌλ©° νμ¬ λ΄ μΈνλΌ μμ§λμ΄ λΆμ μ견μ λ°λΌμ νλ‘μ κ΅¬μ± μ λ²νΌλ§ μ΅μ μ μΌκ΄μ μΌλ‘ λ³κ²½ν기보λ€λ μ ν리μΌμ΄μ μλ²μμ μ΄λ²€νΈ μ€νΈλ¦Όμ λν μλ΅μ μνν λ X-Accel-Buffering ν€λλ₯Ό μλ΅νλ κ²μΌλ‘ μ΅μ’ κ²°μ νμ΅λλ€.
X-Accel-Buffering ν€λ μλ΅νκΈ°
μ€νλ§ νλ μμν¬μμλ SseEmitterλ₯Ό μ 곡νλ―λ‘ κ°λ¨νκ² SSE μ°κ²°μ ꡬνν μ μμΌλ©° μ΄ ν΄λμ€λ ResponseBodyEmitterλ₯Ό νμ₯νμκΈ°μ extendResponse ν¨μλ₯Ό ν΅ν΄ μλ΅νκΈ° μ HTTP μνμ½λ λλ μλ΅ ν€λλ₯Ό λ³κ²½ν μ μκ² μ§μν©λλ€. λ°λΌμ, 컨νΈλ‘€λ¬ νΈλ€λ¬ ν¨μμμ HttpServletResponseλ₯Ό μΈμλ‘ λ°μ ν X-Accel-Buffering ν€λμ λν κ°μ noλ‘ μ€μ νλ©΄ λ©λλ€.
@Slf4j
@RestController
public class SseController {
@GetMapping(value = "/sse", produces = MediaType.TEXT_EVENT_STREAM_VALUE)
public SseEmitter sse(HttpServletResponse response) {
response.setHeader("X-Accel-Buffering", "no");
return new SseEmitter();
}
}
κ°μ¬ν©λλ€.