express + type-graphql로 GraphQL API를 구현하는 중에 문뜩 처리 성능이 어떤지 궁금해서 찾아보게 되었다.
성능 측정 출처 : https://github.com/benawad/node-graphql-benchmarks
요약
- graphql-jit을 활용해라
- 모니터링을 위한 tracing은 꺼라
- apollo-server, type-graphql 사용은 지양해라
측정 방법
5개의 클라이언트가 동일한 쿼리문으로 5초간 반복 요청하여 성능을 측정함
query { authors { id name md5 books { id name } } }
성능 결과를 보면 GraphQL의 초당 처리량은 좋아봐야 REST의 70% 밖에 안되며 응답 지연 시간은 대략 5배 이상 더 걸리는 것으로 보인다.
결과로는 무작정 GraphQL이 REST보다 나쁜 것으로 보이는데 이 테스트는 Overfetching, Underfetching을 고려하지 않은 테스트이고 실제 서비스에 GraphQL을 적용하니 전반적으로 빨라졌다 라는 글이 있는걸 보면 REST vs GraphQL보다 Node.js에서 GraphQL 요청 처리가 왜 느려지나?, 어떤 Graphql 구현체, 라이브러리를 써야 하나? 의 관점으로 테스트 결과를 봐야 할 것 같다.
성능, 개발/학습 비용을 보고 어느 선에서 타협할지를 선택해야 하는데 mercurius가 준수한 성능에 graphql-jit 캐싱 기능 등 지원해주는게 많아서 적절해 보이긴 한데 그냥 Golang으로 짜기로 했다.