기준 테스트: 아폴로 연맹 게이트웨이 v1 v2 vs WunderGraph vs mercurius js

Apollo는 방금 그들의 최신 버전인 Apollo Federation Gateway(v2)를 발표했기 때문에 v1과 Wunder Graph에 대한 성능이 궁금하다.
Apollo 게이트웨이 v1과 v2는 모두 NodeJS를 사용하여 이루어졌고 WunderGraph 게이트웨이는 Go로 작성되었다.지금까지 Wunder Graph는 아폴로를 제외한 유일한 연방 실현이었다.

TLDR


아폴로 게이트웨이 v1(v2)과 비교하면 WunderGraph는 초당 271배(132배)의 요청을 할 수 있고, 99번째 백분위 지연은 292배(54배) 낮아졌다.Apollo Gateway v2의 rps는 v1의 2배, 99백분위 지연은 v1보다 5.6배 느리다.Apollo Gateway v1에 시간 초과 오류가 있지만 v2가 해결했습니다.

아폴로 연맹


Apollo Gateway와 달리 WunderGraph는 구독을 지원합니다.Go는 녹색 라인(goroutines)이 있기 때문에 서비스가 컴퓨터의 모든 핵심을 쉽게 확장할 수 있기 때문이다.모든 구독은 자신의 goroutine에서 실행될 수 있으며, goroutine는 창고 크기의 수천 바이트 메모리만 차지하기 때문에 이 해결 방안을 확장하는 것은 매우 효과적이다.
연방 구독에 정확한 체계 구조를 제공하는 것은 복잡한 문제라는 것이다.대부분의 GraphQL 서버는 실행할 때 GraphQL 동작을 설명합니다.이것은 그들이 실행할 때 조작을 AST로 해석하고 이AST를 통해 조작을 해석한다는 것을 의미한다.
WunderGraph는 다른 방법을 채택했다.GraphQL 작업을 여러 단계로 나누는 쿼리 컴파일러를 구축했습니다.높은 차원에서 우리는 계획 단계와 집행 단계를 구분했다.기획 과정에서 우리는AST를 평가하고 최적화된 실행 계획, 즉'조회 컴파일러'를 구축했다.이 실행 계획은 캐시할 수 있기 때문에 이런 방법은 매우 효과적이다.하지만 효율이 전부는 아니다.더 중요한 것은 이런 방법은 다단계 컴파일러와 최적화된 실행 엔진을 사용하여 연방GraphQL 조작을 해결하는 복잡한 문제를 해결할 수 있게 한다.
참고로, 이 검색 컴파일러와 실행 엔진은 MIT가 허가한 소스입니다.점점 더 많은 회사들이 생산 중에 그것을 사용한다.Khan Academy 개발자가 최근 관리자 대열에 합류한 것을 자랑스럽게 생각합니다.
개원에 관한 마지막 말,graphql go tools는 우리가 Wunder Graph를 구축하는 라이브러리로 놀라운 공헌자가 있다.우크라이나에서 온Vasyl Domanchuk도 데이터 캐리어의 실현에 기여했고 엔진을 이렇게 신속하게 하는 과정에서 중요한 역할을 발휘했다.이렇게 하면 네스트된 연방 GraphQL 작업을 해결할 때 N+1 문제가 해결됩니다.
Vasyl 고마워요, 일 고마워요!

기준 테스트 방법


나는 문장 끝에 더 많은 정보를 제공할 수 있는 기본적인 연방 시범을 설정했다.기준 테스트에 대해 나는 cli'헤이'를 사용하여 10초 안에 50번 병발했다.

결과-아폴로 리그 게이트웨이 vs Wunder Graph


초당 요청 수 (작은 조회)




초당 요청 수 (큰 조회)



지연(작은 질의)




지연(쿼리)




관찰하다.


Apollo Gateway v1은 높은 로드에서 항상 시간 초과 오류가 발생합니다.이 문제는 새 버전 (v2) 에서 해결되었습니다.그러나 v2는 아직 성숙하지 않은 것 같다. 왜냐하면 일부 테스트 실행 중 초당 요청 수가 10에서 400 사이이기 때문이다.
Apollo가 기본적으로 Apollo Studio를 사용하도록 게이트웨이를 설정한 것도 발견했습니다.대체 방안으로,curl을 사용하는 코드를 제공합니다.또한 로컬 시스템에서 놀이터를 다시 활성화할 수 있는 문서에 대한 링크도 있습니다.
import { ApolloServer } from "apollo-server";
import {
  ApolloServerPluginLandingPageGraphQLPlayground
} from "apollo-server-core";

const server = new ApolloServer({
  typeDefs,
  resolvers,
  plugins: [
    ApolloServerPluginLandingPageGraphQLPlayground(),
  ],
});
mercurius js는 Apollos gateway와 유사한 NodeJS로 작성되었습니다.서버의 경우 Fastify 프레임워크를 사용하여 결과를 확인할 수 있습니다.소형 유효 하중에서, 그것의rps는 거의 아폴로의 5배이다.그것은 단지 이 큰 문제를 처리하고 있는 것 같다.일반적인 상황에서 더 많은 데이터를 처리해야 하기 때문일 수도 있고, 게이트웨이가 더 많은 네트워크 요청을 해야 하기 때문일 수도 있다.이곳에 틀림없이 무슨 일이 일어났을 것이다. 이로 인해 머큐리에스는 큰 문제에서 아폴로에게 뒤떨어졌다.

결론


NodeJS는 Golang과 비교할 수 없는 성능입니다.새 버전의 Apollo 게이트웨이는 시간 초과 오류를 더 이상 던지지 않지만, GraphQL 작업이 깊이 파고들 때 신축성이 좋지 않다는 것을 알 수 있다.
아폴로 2호의 작은 유효 하중과 큰 유효 하중의 지연을 비교하면 조작이 더욱 끼워 넣을 때 수량이 급격히 증가하는 것을 관찰할 수 있다.
한편, WunderGraph는 아직 워크로드를 완전히 채우지 못했습니다.우리는 둥지를 더 늘려서 포기할 수밖에 없을 것이다.
빠른 연방 호환 게이트웨이 솔루션을 원한다면, WunderGraph는 대량의 위탁 관리 자금을 절약하고 API의 안전성을 높일 수 있습니다.

뭐가 달라요?


주로 두 가지 일이다.우선 WunderGraph는 Go로 작성된 것으로 HTTP 서버 등 동시 작업 부하를 실현할 때 Go 언어의 성능이 훨씬 높다.두 번째는 WunderGraph의 구조다.WunderGraph는 '해석' 동작을 사용하지 않고 검색 컴파일러를 사용하여 배치할 때 작업의 실행을 준비하여 실행할 때 GraphQL AST를 사용하는 모든 복잡성을 제거합니다.
이 주제에 대한 더 많은 정보를 알고 싶으면, 조회 컴파일러의 개술을 보십시오.

데모 설정


WunderGraph:click here!
아폴로: click here!
이 두 가지 상황에서 나는 모두 gqlgen이 실현한 상류를 이용하여 상류의 성능 문제를 제거한다.
결과를 복제하려면 환매 프로토콜을 복제하고 HEY나 유사한 도구를 사용해서 기준 테스트를 하면 됩니다.

테스트 쿼리 크기


query {
    topProducts {
        upc
        name
        price
        reviews {
            id
            body
            author {
                id
                name
                username
            }
        }
    }
}

테스트 쿼리 크기


query {
    topProducts {
        upc
        name
        price
        reviews {
            id
            body
            author {
                id
                name
                username
                reviews {
                    id
                    body
                    author {
                        id
                        name
                        username
                        reviews {
                            id
                            body
                            product {
                                inStock
                                name
                                price
                                shippingEstimate
                                upc
                                weight
                                reviews {
                                    body
                                    id
                                    author {
                                        id
                                        name
                                        reviews {
                                            body
                                            author {
                                                id
                                                name
                                                username
                                            }
                                        }
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}

Wundergraph 커뮤니티에 가입하세요!


저희 블로그 좋아하세요?가입community!

좋은 웹페이지 즐겨찾기