5.1. ๊ฐ์(Overview)
RSocket์ TCP, ์น์์ผ ๊ทธ๋ฆฌ๊ณ ๊ธฐํ ๋ค๋ฅธ ๋ฐ์ดํธ ์คํธ๋ฆผ ์ ์ก์ ํตํ ๋ค์คํ๋ ์๋ฐฉํฅ ํต์ ์ ์ํ ์ ํ๋ฆฌ์ผ์ด์ ํ๋กํ ์ฝ์ด๋ค. ์๋ ์ค ํ๋๋ฅผ ์ํธ์์ฉ ๋ชจ๋ธ๋ก ์ฌ์ฉํ๋ค.
Request-Response- ๋ฉ์์ง ํ๋๋ฅผ ์ ์กํ๊ณ ํ๋์ ์๋ต์ ๋ฐ๋๋ค.Request-Stream- ๋ฉ์์ง ํ๋๋ฅผ ์ ์กํ๊ณ ํ๋์ ์๋ต์ ์คํธ๋ฆผ์ผ๋ก ๋ฐ๋๋ค.Channel- ์๋ฐฉํฅ์ผ๋ก ๋ฉ์์ง ์คํธ๋ฆผ์ ์ ์กํ๋ค.Fire-and-Forget- ๋จ๋ฐฉํฅ ๋ฉ์์ง๋ฅผ ์ ์กํ๋ค.
์ปค๋ฅ์ ์ด ๋งบ์ด์ง๋ฉด, โํด๋ผ์ด์ธํธโ์ โ์๋ฒโ ๋ผ๋ ๊ตฌ๋ถ์ ์ฌ๋ผ์ง๊ณ , ์์ชฝ์ด ๋์นญ์ด ๋์ด ๊ฐ๊ฐ์ด ์์ ์ํธ์์ฉ ๋ชจ๋ธ ์ค ํ๋๋ฅผ ์์ํ ์ ์๋ค. ๋ฐ๋ผ์ ํ๋กํ ์ฝ์์ ์ฐธ์ฌํ๋ ์์ชฝ์ โ์์ฒญ์(requester)โ์ โ์๋ต์(responder)โ ๋ผ๊ณ ๋ถ๋ฅด๋ฉฐ, ์ํธ ์์ฉ ๋ชจ๋ธ์ โ์์ฒญ ์คํธ๋ฆผ(request streams)โ ๋๋ ๊ฐ๋จํ โ์์ฒญ(requests)โ ์ด๋ผ๊ณ ๋ถ๋ฅธ๋ค.
๋ค์์ RSocket ํ๋กํ ์ฝ์ ์ฃผ์ ๊ธฐ๋ฅ๊ณผ ์ด์ ์ด๋ค:
- ๋คํธ์ํฌ ๊ฒฝ๊ณ๋ฅผ ๊ฐ๋ก์ง๋ฅด๋ ๋ฆฌ์กํฐ๋ธ ์คํธ๋ฆผ ์๋งจํฑ์ค -
Request-Stream๊ณผChannel๊ฐ์ ์คํธ๋ฆฌ๋ฐ ์์ฒญ์ ์ํด์, ๋ฐฑํ๋ ์ ์ ํธ๋ ์์ฒญ์์ ์๋ต์ ์ฌ์ด๋ฅผ ์ค๊ฐ๊ธฐ ๋๋ฌธ์ ์์ฒญ์๊ฐ ์๋ต์์ ์๋๋ฅผ ์ ์ดํ ์ ์๋ค. ๋ฐ๋ผ์ ๋คํธ์ํฌ ๊ณ์ธต์ ํผ์ก ์ ์ด์ ๋ํ ์์กด์ ์ค์ด๊ณ ๋คํธ์ํฌ ๋ ๋ฒจ ๋๋ ์ด๋ค ๋ ๋ฒจ์์๋ ์ง ๋ฒํผ๋ง์ ํ์์ฑ์ ์ค์ธ๋ค. - ์์ฒญ ์กฐ์ (Request throttling) - ํ ์ชฝ์์
LEASEํ๋ ์์ ์ก์ ํ๋ฉด ์ง์ ๋ ์๊ฐ๋์ ๋ค๋ฅธ ์ชฝ์ ๋ณด๋ผ ์ ์๋ ์์ฒญ์ด ์ ํ๋๋ค. ์ด ๊ธฐ๋ฅ์ โLeasingโ ์ด๋ผ๊ณ ๋ถ๋ฅธ๋ค. ์ด๋ ์ฃผ๊ธฐ์ ์ผ๋ก ๊ฐฑ์ ๋๋ค. - ์ธ์ ์ฌ๊ฐ(Session resumption) - ์ปค๋ฅ์ ์ด ๋์ด์ง๋๋ผ๋ ์ผ๋ถ ์ํ๋ฅผ ์ ์งํด์ค๋ค. ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ช ํํ๊ฒ ์ํ๋ฅผ ๊ด๋ฆฌํ ์ ์์ผ๋ฉฐ, ๋ฐฑํ๋ ์ ์ ํจ๊ป ์ฌ์ฉํ๋ ๊ฒฝ์ฐ ์์ฐ์(producer)๋ฅผ ์ค๋จํ๊ณ , ํ์ํ ์ํ์ ์์ ์ค์ผ ์ ์๋ค.
- ํฐ ๋ฉ์์ง์ ๋จํธํ(fragmentation)์ ์ฌ์กฐ๋ฆฝ(re-assembly).
- Keepalive (heartbeats).
RSocket์ ์ฌ๋ฌ ์ธ์ด๋ก ๊ตฌํ๋์ด ์๋ค. ์๋ฐ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ ์ ์ก์ ์ํ Project Reactor์ Reactor Netty๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ํ๋ค. ์ฆ, ์ ํ๋ฆฌ์ผ์ด์ ์์ ๋ฆฌ์กํฐ๋ธ ์คํธ๋ฆผ Publisher์ ์ ํธ๊ฐ Roskcet์ ํตํด ๋คํธ์ํฌ๋ฅผ ๊ฐ๋ก์ง๋ฌ ํฌ๋ช ํ๊ฒ ์ ํ๋๋ค๋ ๋ป์ด๋ค.
5.1.1. ํ๋กํ ์ฝ(The Protocol)
RSocket์ ์ฅ์ ์ค ํ๋๋ ๋คํธ์ํฌ๋ง์์์ ๋์์ด ์ ์ ์๋์ด ์๊ณ ์ผ๋ถ ํ๋กํ ์ฝ ํ์ฅ(extensions)๊ณผ ํจ๊ป ์ฝ๊ธฐ ์ฌ์ด ์คํ(specification)์ด๋ผ๋ ๊ฒ์ด๋ค. ๋ฐ๋ผ์ ์ธ์ด ๊ตฌํ ๋ฐ ์์ ๋ ๋ฒจ ํ๋ ์์ํฌ API์ ์๊ด์์ด ์คํ์ฌํญ์ ์ฝ์ด๋ณด๋ ๊ฒ์ด ์ข๋ค. ์ด ์น์ ์์๋ ๋งฅ๋ฝ์ ์ ๋ฆฝํ๊ธฐ ์ํ ๊ฐ๊ฒฐํ ๊ฐ์๋ฅผ ์ ๊ณตํ๋ค.
Connecting
์ด๊ธฐ์ ํด๋ผ์ด์ธํธ๋ TCP ๋๋ ์น์์ผ๊ณผ ๊ฐ์ ์ ์์ค ์คํธ๋ฆฌ๋ฐ ์ ์ก์ ํตํด ์๋ฒ์ ์ฐ๊ฒฐํ๊ณ , ์ปค๋ฅ์
ํ๋ผ๋ฏธํฐ ์ค์ ์ ์ํด SETUP ํ๋ ์์
์๋ฒ๋ก ์ ์กํ๋ค.
์๋ฒ๋ SETUP ํ๋ ์์ ๊ฑฐ๋ถํ ์ ์์ง๋ง, ์ผ๋ฐ์ ์ผ๋ก ์ด ํ๋ ์์ ์ ์ก(ํด๋ผ์ด์ธํธ๊ฐ)ํ๊ณ ์์ (์๋ฒ๊ฐ)ํ๋ค๋ฉด, ์์ชฝ์์ ์์ฒญ์ ์์ํ ์ ์๋ค.
ํ์ง๋ง SETUP ํ๋ ์์ด ์์ฒญ ์๋ฅผ ์ ํํ๊ธฐ ์ํด leasing ์๋งจํฑ์ค๋ฅผ ์ฌ์ฉํ๋ค๋ฉด, ์์ฒญ์ ํ๊ธฐ ์ํด ์์ชฝ ๋ชจ๋์์๋ ๋ค๋ฅธ ์ชฝ์ด LEASE
ํ๋ ์์ ๋ณด๋ด ์์ฒญ์ ์๋ฝํ ๋๊น์ง ๊ธฐ๋ค๋ ค์ผ ํ๋ค.
Making Requests
ํ ๋ฒ ์ปค๋ฅ์
์ด ๋งบ์ด์ง๋ฉด, ์์ชฝ์ REQUEST_RESPONSE, REQUEST_STREAM, REQUEST_CHANNEL, REQUEST_FNF ํ๋ ์ ์ค ํ๋๋ฅผ
ํตํด ์์ฒญ์ ์์ํ ์ ์๋ค. ๊ฐ ํ๋ ์์ ์์ฒญ์๋ก๋ถํฐ ์๋ต์์๊ฒ ๋ฉ์์ง ํ๋๋ฅผ ์ ์กํ๋ค.
์๋ต์๋ PAYLOAD ํ๋ ์์ ์๋ต ๋ฉ์์ง์ ํจ๊ป ๋ณด๋ด๊ณ , REQUEST_CHANNEL ์์ฒญ์ธ ๊ฒฝ์ฐ, ์์ฒญ์๋ PAYLOAD ํ๋ ์๊ณผ ํจ๊ป ์์ฒญ ๋ฉ์์ง๋ฅผ
๋ ๋ณด๋ผ ์ ์๋ค.
์์ฒญ์ Request-Stream๊ณผ Channel๊ณผ ๊ฐ์ ๋ฉ์์ง ์คํธ๋ฆผ์ ํฌํจ๋ ๊ฒฝ์ฐ, ์๋ต์๋ ์์ฒญ์๊ฐ ๋ณด๋ธ ์๊ตฌ ์ ํธ(Demand signals)๋ฅผ
์ค์ํด์ผ ํ๋ค. ์๊ตฌ์ฌํญ์ ๋ฉ์์ง ์๋ก ํํ๋๋ค. ์ด๊ธฐ ์๊ตฌ์ฌํญ์ REQUEST_STREAM, REQUEST_CHANNEL ํ๋ ์์ ์ง์ ํ๋ค.
ํ์ ์๊ตฌ์ฌํญ์ REQUEST_N ํ๋ ์์ ํตํ๋ค.
๊ฐ ์ธก์ METADATA_PUSH ํ๋ ์์ ๊ฐ๋ณ ์์ฒญ์ด ์๋ ์ ์ฒด ์ฐ๊ฒฐ๊ณผ ๊ด๋ จ๋ ๋ฉํ ๋ฐ์ดํฐ ์๋ฆผ์ ์ ์กํ ์๋ ์๋ค.
Message Format
RSocket ๋ฉ์์ง์๋ ๋ฐ์ดํฐ์ ๋ฉํ ๋ฐ์ดํฐ๊ฐ ํฌํจ๋๋ค. ๋ฉํ ๋ฐ์ดํฐ๋ ๋ผ์ฐํ
, ๋ณด์ ํ ํฐ ๋ฑ์ ์ ์กํ๋๋ฐ ์ฌ์ฉ๋ ์ ์๋ค. ๋ฐ์ดํฐ์ ๋ฉํ ๋ฐ์ดํฐ๋
๋ค๋ฅธ ํฌ๋งท์ ์ฌ์ฉํ๋ค. ๊ฐ๊ฐ์ ๋ํ MIME ์ ํ์ SETUP ํ๋ ์์ ์ ์ธ๋์ด ์ง์ ๋ ์ปค๋ฅ์
์ ๋ชจ๋ ์์ฒญ์ ์ ์ฉ๋๋ค.
๋ชจ๋ ๋ฉ์์ง๋ ๋ฉํ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ง ์ ์์ง๋ง ์ผ๋ฐ์ ์ผ๋ก ๋ผ์ฐํ
๊ณผ ๊ฐ์ ๋ฉํ ๋ฐ์ดํฐ๋ ๋ณดํต ์์ฒญ ๋น ํ๋๋ง ํ์ํ๋ฏ๋ก, ์์ฒญ์ ์ฒซ ๋ฒ์งธ ๋ฉ์์ง์๋ง
ํฌํจ์ํจ๋ค. ์๋ฅผ ๋ค์ด, REQUEST_RESPONSE, REQUEST_STREAM, REQUEST_CHANNEL, REQUEST_FNF.
ํ๋กํ ์ฝ ํ์ฅ์ ์ ํ๋ฆฌ์ผ์ด์ ์์ ์ฌ์ฉํ๊ธฐ ์ํ ์ผ๋ฐ์ ์ธ ๊ณตํต ๋ฉํ ๋ฐ์ดํฐ ํฌ๋งท์ ์ ์ํ๋ค:
- Composite Metadata - ๋ค์์ ๋ ๋ฆฝ์ ์ผ๋ก ํฌ๋งทํ ๋ ๋ฉํ๋ฐ์ดํฐ ์ํธ๋ฆฌ
- Routing - ์์ฒญ์ ๋ํ ๋ผ์ฐํ
5.1.2. ์๋ฐ ๊ตฌํ(Java Implementation)
RSocket ์๋ฐ ๊ตฌํ์ฒด
๋Project Reactor๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ํ๋ค.
TCP์ ์น์์ผ ์ ์ก์ Reactor
Netty๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ํ๋ค. ๋ฆฌ์กํฐ๋ธ ์คํธ๋ฆผ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ก์, ๋ฆฌ์กํฐ๋ ํ๋กํ ์ฝ ๊ตฌํ ๊ตฌํ์ ๋จ์ํ๊ฒ ํ๋ค.
์ ํ๋ฆฌ์ผ์ด์
์์๋ ์ ์ธ์ ์ธ(declarative) ์ฐ์ฐ์์ ํฌ๋ช
ํ ๋ฐฑํ๋ ์
์ง์ ๊ธฐ๋ฅ์ ๊ฐ์ถ Flux์ Mono๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ด ์์ฐ์ค๋ฝ๋ค.
RSocket ์๋ฐ API๋ ์๋์ ์ผ๋ก ์ต์์ ์ด๊ณ ๊ธฐ๋ณธ์ ์ด๋ค. API๋ ํ๋กํ ์ฝ ๊ธฐ๋ฅ์๋ง ์ค์ ์ ๋๊ณ ์ ํ๋ฆฌ์ผ์ด์ ํ๋ก๊ทธ๋๋ฐ ๋ชจ๋ธ(์๋ฅผ ๋ค์ด, RPC codegen, ๋ค๋ฅธ ์ฝ๋ ๋ฑ)์ ๋ ๋์ ์์ค์ ๋ ๋ฆฝ๋ ๊ด์ฌ์ฌ๋ง ๋ณด๋ฉด ๋๋ค.
๊ตฌํ์ฒด์ธ
io.rsocket.RSocket์ ์ฃผ์ ์ญํ ์ ๋ค ๊ฐ์ง ์ํธ๋์ ํ์
์ ๋ง๋๋ ๊ฒ์ด๋ค. ๋จ์ผ ๋ฉ์์ง๋ Mono, ๋ฉ์์ง ์คํธ๋ฆผ์ Flux,
๋ฐ์ดํธ ๋ฒํผ๋ก ๋ฐ์ดํฐ์ ๋ฉํ ๋ฐ์ดํฐ์ ์ ๊ทผํ๋ ์ค์ ๋ฉ์์ง๋ io.rsocket.Payload๊ฐ ์๋ค. RSocket์ ์ญํ ์ ๋์นญ์ ์ผ๋ก ์ฌ์ฉ๋๋ค.
์์ฒญ์ ๋ํด์๋ ์ ํ๋ฆฌ์ผ์ด์
์ ์์ฒญ์ ์ํ RSocket์ด ์ฃผ์ด์ง๊ณ , ์๋ต์ ๋ํด์๋ RSocket์ ๊ตฌํํ์ฌ ์์ฒญ์ ํธ๋ค๋งํ๋ค.
์ด๊ฒ๋ค์ ์์ ํ ์๊ฐ๊ฐ ์๋๋ค. ๋๋ถ๋ถ ์คํ๋ง ์ ํ๋ฆฌ์ผ์ด์ ์ด API๋ฅผ ์ง์ ์ฌ์ฉํ ํ์๊ฐ ์๋ค. ๊ทธ๋ฌ๋ ์คํ๋ง๊ณผ ๋ ๋ฆฝ์ ์ผ๋ก RSocket์ ๋ณด๊ฑฐ๋ ํ ์คํธํ๋ ๊ฒ์ด ์ค์ํ ์ ์๋ค. RSocket ์๋ฐ ์ ์ฅ์์๋ API์ ํ๋กํ ์ฝ ๊ธฐ๋ฅ์ ๋ณด์ฌ์ฃผ๋ ๋ง์ ์ํ ์ฑ์ด ํฌํจ๋์ด ์๋ค.
5.1.3. ์คํ๋ง ์ง์(Spring Support)
spring-messaging ๋ชจ๋์ ๋ค์์ ํฌํจํ๋ค:
- RSocketRequester -
io.rsocket.RSocket๊ณผ ๋ฐ์ดํฐ, ๋ฉํ ๋ฐ์ดํฐ์ ์ธ์ฝ๋ฉ/๋์ฝ๋ฉ์ ํตํด ์์ฒญ์ ์์ฑํ๋ ์ ์ฐํ API - Annotated Responders - ์๋ต์ ์ํ
@RequestMapping์ด๋ ธํ ์ด์ ์ด ์ ์ฉ๋ ํธ๋ค๋ฌ ๋ฉ์๋
spring-web ๋ชจ๋์๋ RSocket ์ ํ๋ฆฌ์ผ์ด์
์ด ํ์ํ ์๋ ์๋ Jackson, CBOR/JSON, Protobuf์ ๊ฐ์ Encoder์ Decoder
๊ตฌํ์ฒด๊ฐ ํฌํจ๋์ด ์๋ค. ๋ํ ํจ๊ณผ์ ์ผ๋ก ๋ผ์ฐํ
๋งค์นญ์ ํ๊ธฐ ์ํ PathPatternParser๋ ํฌํจ๋์ด ์๋ค.
์คํ๋ง๋ถํธ 2.2๋ TCP๋ ์น์์ผ์ ์ฌ์ฉํ์ฌ RSocket ์๋ฒ๋ฅผ ์ง์ํ๊ณ , ์นํ๋ญ์ค ์๋ฒ์์ ์น์์ผ์ ํตํ RSocket์ ๋
ธ์ถํ๋ ์ต์
์ ํฌํจํ๋ค.
๋ํ RSocketRequester.Builder์ RSocketStrategies์ ๋ํ ํด๋ผ์ด์ธํธ ์ง์ ๋ฐ ์๋ ์ค์ ๋ ์๋ค. ์์ธํ ๋ด์ฉ์
์คํ๋ง ๋ถํธ ๋ ํผ๋ฐ์ค์ RSocket ์น์
์ ์ฐธ์กฐํ๋ผ.
์คํ๋ง ์ํ๋ฆฌํฐ(Spring Security) 5.2๋ RSocket์ ์ง์ํ๋ค.
์คํ๋ง Integration 5.2๋ ์ธ๋ฐ์ด๋์ ์์๋ฐ์ด๋ ๊ฒ์ดํธ ์จ์ด๋ฅผ ์ ๊ณตํ์ฌ RSocket ํด๋ผ์ด์ธํธ์ ์๋ฒ์ ์ํธ์์ฉํ๋ค. ์์ธํ ๋ด์ฉ์ Spring Integration Reference Manual์ ์ฐธ์กฐํ๋ผ.
์คํ๋ง ํด๋ผ์ฐ๋ ๊ฒ์ดํธ์จ์ด๋(Spring Cloud Gateway)๋ RSocket ์ปค๋ฅ์ ์ ์ง์ํ๋ค.
๋ชฉ์ฐจ ๊ฐ์ด๋