This page contains information related to upcoming products, features, and functionality. It is important to note that the information presented is for informational purposes only. Please do not rely on this information for purchasing or planning purposes. As with all projects, the items mentioned on this page are subject to change or delay. The development, release, and timing of any products, features, or functionality remain at the sole discretion of GitLab Inc.
Status Authors Coach DRIs Owning Stage Created
accepted @grzesiek @ayufan @grzesiek @dsatcher @deuley devops manage 2021-01-07

GraphQL API

GraphQL은 API에 대한 데이터 조회 및 조작 언어로, 기존 데이터를 사용하여 쿼리를 수행하는 런타임입니다.

GitLab에서는 GraphQL을 채택하여 넓은 커뮤니티가 신뢰할 수 있는 방식으로 GitLab과 상호 작용할 수 있도록 하고, 또한 GraphQL을 사용하여 백엔드와 프론트엔드 구성 요소 간의 통신을 모델링하여 자사 제품을 발전시키고자 합니다.

최근 GraphQL 마이그레이션과 관련된 분기별 OKR을 정의함으로써 채택 속도를 높였습니다. 이로 인해 GraphQL 개발에 더 많은 시간을 할애하고, 새 API를 확장하는 데 필요한 툴 개선 필요성을 드러내었습니다.

본 문서에서는 개발 노력을 지원하고 GraphQL API의 대규모 사용을 지원할 안정적인 기반을 구축해야 하는 작업에 대해 설명합니다.

Summary

GitLab의 GraphQL 이니셔티브는 약 3년 전에 시작되었습니다. GraphQL 에코시스템과 관련된 대부분의 작업은 GraphQL 전문가로 이루어진 자원 봉사자들에 의해 이루어졌습니다.

진행에 대한 회고는 GraphQL 개발 작업을 최적화하고 성능 하락 및 잠재적인 장애와 관련된 중요 메커니즘의 미비점을 해소하기 위한 기회를 드러내었습니다.

GraphQL 엔진 자체의 작은 개선 사항 이외에도 팀원들이 내부 GraphQL API에서 무엇이 발생하는지 이해할 수 있는 포괄적인 모니터링 대시보드를 구축하고자 합니다. 우리는 SLO를 정의하고 위반이 확인된 SLI를 신속히 대처하고, Grafana 및 Elastic을 사용하여 관련 세부 정보를 자세히 살펴볼 수 있도록 하려고 합니다. 또한, 과거 데이터를 확인하고 향후 사용량을 예측하고자 합니다.

REST API의 진화를 통한 경험을 통해 규모 및 지식을 활용하여 GraphQL 개발 작업에 적용할 수 있는 기회입니다. 이를 통해 쿼리-기능 상관관계 메커니즘을 구축하고, 확장 가능한 상태 동기화 지원을 추가하고, 직접 업로드 지원과 같은 동시에 실행되는 다른 아키텍처 이니셔티브에 GraphQL을 일치시킬 수 있습니다.

GraphQL는 기본적으로 안전해야 합니다. 보안 문제를 방지하기 위해 우리에게 관련된 OWASP GraphQL 권장 사항을 강제할 수 있는 메커니즘을 구축함으로써 흔히 발생하는 보안 실수를 피할 수 있습니다.

넓은 커뮤니티의 Bed모으갑을 이해하는 것은 정책을 더 나은 방향으로 계획하고, GraphQL과 REST API 간에 그들의 요구를 충족하는 파리티를 설계하는 데 도움이 될 것입니다.

Challenges

GraphQL에서 발생하는 사항을 이해하기

프로덕션 환경에서 GraphQL의 성능을 확인할 수 있는 것은 해당 서비스의 성능 및 신뢰성을 개선하기 위한 전제조건입니다.

우리는 아직 GraphQL 엔드포인트의 성능을 어떻게 하는지, 최적화해야 하는 병목 현상이 무엇인지에 대한 질문에 대답할 수 있는 도구를 갖고 있지 않습니다. 이것은 GraphQL의 채택 속도와 운영이 예상되는 규모와 결합될 때, 해결이 어려운 생산적 사건의 증가율에 위험을 가져올 수 있습니다.

우리는 GraphQL 엔드포인트의 성능에 대한 통찰력에 중점을 두는 포괄적인 Grafana 대시보드를 구축하고, 여전히 팀원들이 세부 정보에 대해 자세히 살펴볼 수 있도록 할 것입니다. 우리는 Elasticsearch를 사용하여 GraphQL 쿼리를 기능과 더 잘 연관시킬 수 있도록 개선해 경고를 즉시 표시할 수 있도록 로깅을 개선하고자 합니다.

  • GraphQL에 대한 포괄적인 Grafana 대시보드 구축
  • GraphQL 쿼리-기능 상관관계 메커니즘 구축
  • Elastic에 GraphQL 쿼리 로깅 개선
  • 경고를 표시하기 위해 프론트엔드에서 오류 처리 재설계

변동성 있는 GraphQL 데이터 구조 관리

우리의 GraphQL API는 시간이 지남에 따라 진화할 것입니다. GraphQL은 이러한 진화를 쉽게 만들기 위해 설계되었습니다. GraphQL API는 구성 요소가 매우 결합되어 있기 때문에 GraphQL API의 버전 관리가 필요하지 않다는 이유입니다. API 버전 관리 대신에 일부 필드를 폐기 표시할 의도이지만, 폐기된 필드 및 유형의 사용을 이해하고 이를 이해하기 쉽도록 시각화할 방법이 필요합니다. 폐기된 필드의 사용을 감지하고, 사용자에게 해당 필드를 제거할 계획이 있음을 알릴 방법이 필요할 수도 있습니다.

  • 사용자에게 더 나은 서비스를 제공할 데이터 기반의 폐기 정책 정의
  • 폐기된 GraphQL 필드의 사용 빈도를 보여주는 대시보드 구축
  • 서비스 핑에서 폐기된 필드의 사용 보내는 데 필요한 메커니즘 구축

코드베이스의 나머지 부분과 일관성 유지

GraphQL은 우리가 작업하는 유일한 것은 아니지만, 우리가 거의 모든 제품 부분에서 수집하고 처리한 데이터를 노출하는 데 사용될 것입니다. 이는 거의 우리의 단일 코드베이스와 결부됩니다.

우리는 GraphQL을 사용하는 방식이 GitLab의 성능과 신뢰성을 개선하기 위해 고안된 다른 메커니즘과 일관성이 있는지 확인해야 합니다.

우리는 REST API를 발전시키는 데에 다양한 경험이 있습니다. 이러한 지식을 GraphQL에 적용하여 기본적으로 안전하고 성능적으로 우수하게 만들고 싶습니다.

  • GraphQL에 대한 직접 업로드 디자인
  • GraphQL 쿼리 깊이 및 복잡성 히스토그램 구축
  • 제한에 도달한 GraphQL 쿼리 양 시각화
  • 기존 기능에 대한 GraphQL ETag 지원 추가

REST API와의 GraphQL 상호 운용성 설계

우리는 REST API를 폐기할 계획은 없습니다. 이것은 GitLab과 상호 작용하는 간단한 방법이며, GraphQL이 전통적인 REST API를 완전히 대체하는 것은 아마도 결코 일어나지 않을 것입니다. 두 API는 함께 공존해야 합니다. 그들의 코드베이스를 유지보수 가능하게 만들기 위해 중복을 제거해야 합니다. 그러나 이 공존은 백엔드에서 해결해야 하는 기술적인 도전뿐만이 아닙니다. 사용자들은 두 API를 서로 교차적으로 사용하거나 동시에 사용할 수도 있습니다. 상호 운용성을 위해 리소스 식별자에 대한 공통 체계를 노출함으로써 상호 운용성을 달성하는 것이 선행 조건입니다.

  • GraphQL과 REST API의 상호 운용성 확보
  • 두 API에 대한 공통 리소스 식별자 설계

확장 가능한 상태 동기화 메커니즘 설계

GitLab에서의 GraphQL 도입과 관련된 가장 중요한 목표 중 하나는 GitLab 백엔드와 프런트엔드 구성 요소 간의 상호 작용을 모델링하기 위해 그것을 사용하는 것입니다. 이미 진행 중인 이 프로세스에서는 더 나은 상태 동기화 메커니즘을 구축하고 기존 메커니즘에 연결해야 할 필요가 드러났습니다.

  • 확장 가능한 상태 동기화 메커니즘 설계
  • Publish/Subscribe(Pub/Sub) 및 웹소켓을 통한 상태 동기화 평가
  • GraphQL 기능 상호 관련 및 기능 ETag에 대한 일반적인 지원 구축
  • 공유 글로벌 상태를 관리하는 프런트엔드 코드 재설계

반복 작업

청사진 범위 내에서

  1. GraphQL API 아키텍처
    1. GraphQL에 대한 포괄적인 Grafana 대시보드 구축
    2. Elastic에서의 GraphQL 요청 로깅 개선
    3. GraphQL 쿼리 상호 관련 메커니즘 구축
    4. 데이터 기반의 폐기 정책 개선 설계

향후 반복 작업

  1. GraphQL을 위한 확장 가능한 상태 동기화 메커니즘 구축
  2. GraphQL을 위한 직접 업로드 지원 추가
  3. 보안과 관련된 GraphQL 디자인 선택 사항 검토