gRPC
gRPC 는 구글에서 개발된 오픈소스 RPC 프레임 워크 입니다.
인간이 읽을수 있는 형태로 되어있는 JSON과는 다르게 gRPC는 바이너리이며 더 컴팩트하고 전송속도가 빠른 장점이 있습니다
API Types
Unary
Single Request ↔︎ Single Response
![](https://blog.kakaocdn.net/dn/EUldB/btrxZFXm41V/VMLQf6o4hRZ7kQWZxvyto0/img.png)
Server Streaming
Single Request ↔︎ Multiple Responses
![](https://blog.kakaocdn.net/dn/BrsRt/btrx0FbJgF7/qpniHrQVFiQ7RpKMW5ABi0/img.png)
Client Streaming
Multiple Requests ↔︎ Single Response
![](https://blog.kakaocdn.net/dn/bJHCKO/btrxYcuT9Qq/e1kMZkKVd3lzj6dqtLo17k/img.png)
Bi-directional Streaming
Multiple Requests ↔︎ Multiple Responses
![](https://blog.kakaocdn.net/dn/bfO2Ie/btrxVdAQhIO/xkCW7YKgimmldDUlgjx6F1/img.png)
The .proto definition
메시지와 서비스들은 Protocol buffers, or protobuf의 정의를 포함하여 .proto 파일들에 명시되어 있습니다.
이런 정의된 파일은 sender와 receiver가 사용되는 코드로 사용되어지고 이러한 규약을 통해 이러한 메시지와 서비스들의 통신이 진행 됩니다.
Performance Testing
k6 설치하는 방법은 아래 링크 참조
Installation
Instructions to install k6 in Linux, Mac, Windows. Use the Docker container or the prebuilt binary.
k6.io
테스트를 위한 폴더를 생성 합니다.
$ mkdir grpc_test
$ cd grpc_test
hello.proto 라는 파일을 아래와 같이 definition 폴더 아래 만들어 줍니다.
// $ mkdir definitions
// $ cd definitions
// $ vi hello.proto
syntax = "proto2";
package hello;
service HelloService {
rpc SayHello(HelloRequest) returns (HelloResponse);
rpc LotsOfReplies(HelloRequest) returns (stream HelloResponse);
rpc LotsOfGreetings(stream HelloRequest) returns (HelloResponse);
rpc BidiHello(stream HelloRequest) returns (stream HelloResponse);
}
message HelloRequest {
optional string greeting = 1;
}
message HelloResponse {
required string reply = 1;
}
grpc_test.js 라고 테스트 스크립트를 grpc_test 폴더 내부에 만들어 줍니다.
// $ cd ../
// $ vi grpc_test.js
import grpc from 'k6/net/grpc';
import { check, sleep } from 'k6';
const client = new grpc.Client();
client.load(['definitions'], 'hello.proto');
export default () => {
client.connect('grpcbin.test.k6.io:9001', {
// plaintext: false
});
const data = { greeting: 'Bert' };
const response = client.invoke('hello.HelloService/SayHello', data);
check(response, {
'status is OK': (r) => r && r.status === grpc.StatusOK,
});
console.log(JSON.stringify(response.message));
client.close();
sleep(1);
};
테스트를 실행 해봅니다.
// $ k6 run grpc_test.js
/\ |‾‾| /‾‾/ /‾‾/
/\ / \ | |/ / / /
/ \/ \ | ( / ‾‾\
/ \ | |\ \ | (‾) |
/ __________ \ |__| \__\ \_____/ .io
execution: local
script: scripts/grpc-test.js
output: -
scenarios: (100.00%) 1 scenario, 1 max VUs, 10m30s max duration (incl. graceful stop):
* default: 1 iterations for each of 1 VUs (maxDuration: 10m0s, gracefulStop: 30s)
INFO[0000] {"reply":"hello Bert"} source=console
running (00m01.4s), 0/1 VUs, 1 complete and 0 interrupted iterations
default ✓ [======================================] 1 VUs 00m01.4s/10m0s 1/1 iters, 1 per VU
✓ status is OK
checks...............: 100.00% ✓ 1 ✗ 0
data_received........: 3.0 kB 2.1 kB/s
data_sent............: 731 B 522 B/s
grpc_req_duration....: avg=48.44ms min=48.44ms med=48.44ms max=48.44ms p(90)=48.44ms p(95)=48.44ms
iteration_duration...: avg=1.37s min=1.37s med=1.37s max=1.37s p(90)=1.37s p(95)=1.37s
iterations...........: 1 0.714536/s
vus..................: 1 min=1 max=1
vus_max..............: 1 min=1 max=1
테스트 진행 시 grpc client는 k6에서 제공되는 grpc test server (grpcbin.test.k6.io:9001) 에 접속하게 되고 test server에 정의되어있는 hello.proto에 따라 처리 됩니다.
'Programming > Loadtest' 카테고리의 다른 글
[k6][Loadtest] k6 grpc client load path (0) | 2022.03.30 |
---|
댓글