gRPC 구현 – Client Streaming RPC #2

개요

이번 글에서는 gRPC 의 Client Streaming RPC 예제를 구현 해보도록 한다. Client Streaming RPC 는 다량의 데이터를 스트리밍 방식으로 전송한다는 점에서 지난 글에서 다뤘던 Unary RPC 와 다르다. (아래 그림에서 왼쪽 아래)

https://medium.com/@yangli907/grpc-learning-part-1-cdcf59e52707

Client Streaming RPC의 구현

시작하기

Client Streaming RPC는 큰 데이터를 서버로 전송하고 단항으로 응답을 받는 서비스에 적합한 모델이다. 예를 들어 큰 이미지들을 전송해야 한다던지, 다량의 데이터를 서버로 전송해야 하는 상황에 적합하다. 다음은 이번 예제의 디렉토리 구조이다.

core/stream-client/stream-client.proto

어떤 예제를 작성할까 고민하다가 지난 글(gRPC 구현 – Unary RPC #1)에 구현했던 protobuf 명세를 수정해서 사용하기로 했다.
이전 명세와 가장 크게 다른 부분은 rpc 선언부에 인자값으로 Guest 메시지를 stream 을 받겠다고 명시한 부분과 Guest 메시지에 bytes 데이터 포멧으로 이미지를 받도록 명시한 부분이다.

make go code

cmd/stream-client/server/main.go

이전에 작성해봤던 서버코드와 크게 다르지 않다. protoc에서 생성된 인터페이스를 찾아서 ~바인딩할 구조체~ (room) 를 구현하면 된다.
서버코드에서 눈여겨 봐야할 부분은 stream 을 수신 받는 부분과 종료하는 부분이며 주석처리한 부분을 살펴보자.

protoc 에서 작성한 stream-client.pb.go 에서 살펴봐야 하는 부분

room 구조체를 작성할때 stream-client.pb.go 의 RoomServer 인터페이스를 따라 작성하면 된다.

cmd/stream-client/client/main.go

클라이언트에서는 아바타 이미지를 가지고 있는 가상의 사용자를 여럿 만들어서 0.5초 간격으로 서버로 전송시키는 코드를 작성했다. 눈여겨 봐야 할 부분은 스트림 데이터를 반복 전송하고 종료 후 메시지를 받아오는 부분이다.

구현 결과

실행 결과는 구현한 바 그대로 가상의 사용자 이름으로 이미지 파일이 생성 되었고, 서버 단에서도 이를 올바르게 처리 했다.

Proudly powered by WordPress | Theme: Baskerville 2 by Anders Noren.

Up ↑