Spring Web Reactive | 5. RSocket | 5.1. 개요

RSocket는 TCP, WebSocket, 그외에 다른 바이트 스트림 전송을 통해 다중화된 이중 통신 응용 프로그램 프로토콜이며, 다음의 상호 작용 모델 중 하나를 사용한다.

  • Request-Response - 하나의 메시지를 보내고 하나를 받는다.
  • Request-Stream - 하나의 메시지를 보내고 메시지 스트림을 수신한다.
  • Channel - 메시지 스트림을 양방향으로 전송한다.
  • Fire-and-Forget - 단방향 메시지를 보낸다.

최초 연결이 설정되면, 양쪽이 대칭이 되고, 각 측면이 상기 상호 작용 중 하나를 시작할 수 있기 때문에 ‘클라이언트’와 ‘서버’의 구별이 없어진다. 이 프로토콜에 참가 측을 “요청자"와 “응답자"라고 부르고, 위의 상호 작용을 “요청 스트림(request streams)” 또는 단순히 “요청(request)“이라고 부르는 이유이다.

RSocket 프로토콜의 주요 기능 및 장점은 다음과 같다.

  • 네트워크 경계를 넘어선 Reactive Streams 시멘틱스 - Request-StreamChannel와 같은 스트리밍 요청에 대한 네트워크 경계를 횡단하고 역 배압 신호는 요청자와 응답자 사이를 이동하고, 요청이 소스에서 응답자의 속도를 저하시키는 것을 허용하고, 네트워크 계층 혼잡 제어에 대한 의존도 및 네트워크 레벨 또는 모든 레벨에서 버퍼링의 필요성을 줄일 수 있다.

  • 요청 제한(Request throttling) - 이 기능은 LEASE 프레임을 따서 ‘Leasing’라는 이라고 한다. 이 프레임은 각 엔드에서 전송하여 특정 시간에 다른 엔드에서 허용하는 요청 수를 제한 할 수 있다. 리즈는 정기적으로 업데이트된다.

  • 세션 재개(Session resumption) - 이는 연결이 끊어져도 일부 상태를 유지할 수 있도록 설계되어 있다. 상태 관리는 응용 프로그램에 투명하며, 가능한 경우에 생산자를 중지하고, 필요한 상태의 양을 줄일 수 있도록 역 배압과 함께 잘 작동한다.

  • 큰 메시지 단편화(fragmentation) 및 재조립(re-assemply).

  • Keepalive (heartbeats).

RSocket는 여러 언어로 구현 되어 있다. Java 라이브러리프로젝트 ReactorReactor Netty 위에 구축되어 전송 용이다. 즉, 응용 프로그램 Reactive Streams 게시자의 신호는 RSocket을 통해 네트워크 전체에 투명하게 전달한다.

5.1.1. 프로토콜

RSocket의 장점 중 하나는 네트워크 상에서 잘 정의된 동작과 어떤 프로토콜 확장에 따른 읽기 쉬운 사양을 가지고 있다는 것이다. 언어의 구현체과 높은 수준의 프레임워크 API에 관계없이 사양을 읽는 것이 좋다. 이 섹션에서는 문맥을 확립하기 위한 간결한 개요를 제공한다.

연결

먼저 클라이언트는 TCP와 WebSocket과 같은 낮은 레벨의 스트리밍 전송을 통해 서버에 연결하여 SETUP 프레임을 서버로 전송하고 연결 매개 변수를 설정한다.

서버는 SETUP 프레임을 거부 할 수 있지만, 일반적으로 전송(클라이언트)과 수신(서버)하고 나서 SETUP 이 leasing 시멘틱스를 사용하여 요청의 수를 제한하지 않는 한 요청을 시작할 수 있다. 어느 쪽도 요청을 허용하기 위해 반대쪽에서 LEASE 프레임을 기다려야 한다.

요청하기(Making Requests)

연결이 되면 양쪽에서 프레임 REQUEST_RESPONSE, REQUEST_STREAM, REQUEST_CHANNEL 또는 REQUEST_FNF 중 하나를 통해 요청을 시작할 수 있다. 이러한 각 프레임은 요청자로부터 응답자에 하나의 메시지를 전하고 있다.

다음은 응답자는 응답 메시지와 같이 PAYLOAD 프레임을 반환한다. REQUEST_CHANNEL의 경우 요청자 더 많은 요청 메시지를 포함하는 PAYLOAD 프레임을 전송한다.

요청에 Request-StreamChannel 등의 메시지 스트림이 포함되는 경우, 응답자는 요청자의 요청 신호를 고려해야 한다. 요청 사항은 메시지의 숫자로 표현된다. 초기 수요는 REQUEST_STREAMREQUEST_CHANNEL 프레임으로 지정된다. 후속 요청은 REQUEST_N 프레임을 통해 통보된다.

양쪽 모두 METADATA_PUSH 프레임을 통해 각각의 요청이 아니라, 전체 연결에 대한 메타 데이터 통지도 보낼 수 있다.

메시지 포맷

RSocket 메시지는 데이터와 메타 데이터가 포함된다. 메타 데이터는 루트, 보안 토큰 등을 보낼 수 있다. 데이터와 메타 데이터는 다른 형식으로 할 수 있다. 각각의 MIME 타입은 SETUP 프레임에 선언된 특정 연결의 모든 요청에 적용된다.

모든 메시지에 메타 데이터를 포함 할 수 있지만 일반적으로 루트 등의 메타 데이터는 각 요청이므로 요청의 첫번째 메시지, 즉 프레임 REQUEST_RESPONSE, REQUEST_STREAM, REQUEST_CHANNEL 또는 REQUEST_FNF중 하나에만 포함된다.

프로토콜 확장 기능은 응용 프로그램에서 사용하는 일반적인 메타 데이터 형식을 정의한다.

5.1.2. Java 구현

RSocket의 Java 구현프로젝트 Reactor 위에 구축되어 있다. TCP 및 WebSocket 전송은 Reactor Netty을 기반으로 한다. Reactive Streams 라이브러리로 Reactor는 프로토콜을 구현하는 작업을 단순화한다. 응용 프로그램은 선언 연산자와 투명한 역압력 지원을 갖춘 Flux Mono를 사용하는 것이 자연스럽다.

RSocket Java API는 의도적으로 최소화하고 기본적이다. 프로토콜 기능에 초점을 맞추고 있으며, 응용 프로그램 프로그래밍 모델 (RPC codegen vs other 등)을 높은 레벨의 독립적인 관심사만 처리하면 된다.

주요 계약 io.rsocket.RSocket는 단일 메시지의 약속을 나타내는 Mono 메시지 스트림을 나타내는 Flux 및 바이트 버퍼로 데이터와 메타 데이터에 액세스하는 실제 메시지를 나타내는 io.rsocket.Payload를 사용하여 4개의 요청 대화 유형을 모델링한다. RSocket 계약은 대칭적으로 사용된다. 요청의 경우 응용 프로그램은 요청을 실행하는 RSocket가 주어진다. 응답을 위해 응용 프로그램 RSocket 을 구현하여 요청을 처리한다.

이는 철저한 도입을 의도한 것은 아니다. 대부분의 경우, Spring 애플리케이션은 API를 직접 사용할 필요는 없다. 다만 Spring에 의존하지 않는 RSocket을 확인하거나 실험하는 것이 중요할 수도 있다. RSocket Java 저장소에는 API와 프로토콜의 기능을 보여주는 수많은 샘플 응용 프로그램이 포함되어 있다.

5.1.3. Spring 지원

spring-messaging 모듈에는 다음의 것이 포함된다.

  • RSocketRequester  - 데이터 및 메타 데이터의 인코딩/디코딩을 사용하여 io.rsocket.RSocket를 통해 요청을 할 수 있는 능숙한 API이다.
  • 어노테이션이있는 응답자  -  @MessageMapping 응답의 어노테이션 처리기 메소드이다.

spring-web 모듈에는 Jackson CBOR/JSON 등 Encoder와 Decoder 구현 및 RSocket 응용 프로그램이 필요로 할 가능성이 높은 Protobuf가 포함되어 있다. 또한 효율적인 경로 매칭을 위해 플러그인 할 수 PathPatternParser도 포함되어 있다.

Spring Boot 2.2은 TCP 또는 WebSocket을 통한 RSocket 서버의 출시를 지원하고 있다. 여기에는 WebFlux 서버에서 WebSocket을 통해 RSocket을 게시하는 옵션도 포함되어 있다. RSocketRequester.BuilderRSocketStrategies 클라이언트 지원 및 자동 구성도 있다. 자세한 내용은 Spring Boot 참조 RSocket 섹션을 참조해라.

Spring Security 5.2은 RSocket 지원을 제공한다.

Spring Integration 5.2은 RSocket 클라이언트 및 서버와 상호 작용하는 인바운드 및 아웃 바운드 게이트웨이를 제공한다. 자세한 내용은 Spring Integration 참조 설명서를 참조해라.

Spring Cloud Gateway는 RSocket 연결을 지원한다.




최종 수정 : 2021-04-12