kscn 1.8 로 서비스 체인을 구성하였고,
노드로 RPC 요청을 보내는 API Server (nodejs, express) 를 caver-js 를 이용하여
아래와 같이 구현하였습니다.
const Caver = require("caver-js");
const rpcNode = new Caver("http://x.x.x.x:8551")
....
async function apiBalance(req, res) {
return rpcNode.rpc.klay.getBalance(addr).then( resp => {
res.json({"balance": resp});
});
}
잘 작동하지만,
해당 요청에 대한 수신이 끝난 후에도 API Server 와 RPC 노드 사이의 TCP connection 이 한동안 유지됩니다.
$ lsof -i -nP | grep 8551
node 203131 ubuntu 19u IPv4 86217493 0t0 TCP 192.168.0.153:38068->52.221.31.114:8551 (ESTABLISHED)
API Server 는 이미 응답을 받아 이를 클라이언트로 전송 하였는데도 말이죠…
문제는
- API Server 에 대한 요청이 많아 질 경우, API Server 와 RPC Node 사이의 TCP connection 수도 엄청 많이 쌓입니다.
- 요청-응답이 완료 되었음에도 남아 있는 이 TCP connection 으로 API Server 앱과는 상관 없는 요청이 이루어지는 것으로 보여집니다. 혹시 caver-js sdk 내부적으로 keep alive 를위한 ping/pong 이 이루어지나요?
AWS 이 모니터링 툴로 보면 RPC node 가 분당 10,000 이상의 요청을 수신하는 것으로 나타납니다.
(이는 절대 API Server App. 의 요청이 아닙니다.)
API Server 에 의한 작업이 완료되었음에도 남아있는 문제의 TCP connection 이 많아지게 되면
정체를 알 수 없는 이 요청 개수도 기하급수적으로 많아져 분당 1,000,000 에 이르는 경우까지 발생합니다.
당연히 RPC node 의 응답속도는 현저히 떨어지게 되면서 전체적으로 서비스가 불능상태에 빠지게 되는 현상까지 발생하게 됩니다.
문의 1. API Server(caver-js sdk) 와 RPC node 사이에 TCP connection 이 왜 바로 종료되지 않고 남아 있는 걸까요? 재사용을 위해 connection 을 계속 유지하는 것인가요?
문의 2. 재사용을 위해 connection 을 계속 유지 하는 것이라면, 유지 시간은 어떻게 되나요?
문의 3. TCP connection 이 유지 되는 동안 발생하는 내부 요청은 얼마나 자주 발생하는 지요?
이 문제와 관련하여 Klaytn Docs 의 어떤 부분을 참고해야 하는지요?