GitHUB은 API 요청에 대해 요청 제한, 속도 제한 등 API를 요청하는 제한을 두고 있다.
개발자를 위한 API에서도 속도 제한이 있는 이유는 API를 제공하는 서버에서 API 요청에 대한 응답을 구성하는데 비용이 존재하기 때문이다. API를 제공하는 모든 애플리케이션 또는 서비스는 각 사용자가 시간 또는 일당 API 호출을 수행 할 수있는 횟수에 제한을 둔다.
속도 제한 분류
속도 제한 확인 endpoint 제공
{
"resources": {
"core": {
"limit": 5000, //시간당 요청 수
"remaining": 4999, //남은 요청 수
"reset": 1372700873 //limit가 초기화되는 시간
},
"search": {
"limit": 30,
"remaining": 18,
"reset": 1372697452
},
"graphql": {
"limit": 5000,
"remaining": 4993,
"reset": 1372700389
},
...
},
"rate": {
"limit": 5000,
"remaining": 4999,
"reset": 1372700873
}
}
REST API 속도 제한
인증된 사용자란?
요청 제한 해결은 어떻게??
$ curl -I http(s)://[hostname]/api/v3/user
> HTTP/2 200
> Cache-Control: private, max-age=60
> ETag: "644b5b0155e6404a9cc4bd9d8b1ae730"
> Last-Modified: Thu, 05 Jul 2012 15:31:30 GMT
> Vary: Accept, Authorization, Cookie
> X-RateLimit-Limit: 5000
> X-RateLimit-Remaining: 4996
> X-RateLimit-Reset: 1372700873
$ curl -I http(s)://[hostname]/api/v3/user -H 'If-None-Match: "644b5b0155e6404a9cc4bd9d8b1ae730"'
> HTTP/2 304
> Cache-Control: private, max-age=60
> ETag: "644b5b0155e6404a9cc4bd9d8b1ae730"
> Last-Modified: Thu, 05 Jul 2012 15:31:30 GMT
> Vary: Accept, Authorization, Cookie
> X-RateLimit-Limit: 5000
> X-RateLimit-Remaining: 4996
> X-RateLimit-Reset: 1372700873
$ curl -I http(s)://[hostname]/api/v3/user -H "If-Modified-Since: Thu, 05 Jul 2012 15:31:30 GMT"
> HTTP/2 304
> Cache-Control: private, max-age=60
> Last-Modified: Thu, 05 Jul 2012 15:31:30 GMT
> Vary: Accept, Authorization, Cookie
> X-RateLimit-Limit: 5000
> X-RateLimit-Remaining: 4996
> X-RateLimit-Reset: 1372700873
GraphQL API 속도 제한
REST API의 한계?
GraphQL을 이용한다면??
노드 제한
query {
viewer {
repositories(first: 50) { //50개의 Repository
edges {
repository:node {
name
issues(first: 10) { // 500개의 Issue
totalCount
edges {
node {
title
bodyHTML
}
}
}
}
}
}
}
}
// 총 550개 노드 요청
속도 제한
query {
viewer {
login
repositories(first: 100) { //100개의 Repo이지만 viewer에 1번만 접근 = 1
edges {
node {
id
issues(first: 50) { //50개 issue, Repo 100번 접근 = 100
edges {
node {
id
labels(first: 60) { //60개 label, Repo(100) * issue(50) 접근 = 5000
edges {
node {
id
name
}
}
}
}
}
}
}
}
}
}
}
// 총 5101번 접근 = round(5101 / 100) = 51점
참고 : 속도 제한 방식은 개발자가 GraphQL API를 사용하는 방식을 관찰하면서 바뀔 수 있다고 한다.
속도 제한 확인
query {
viewer {
login
}
rateLimit {
limit //시간당 최대 점수
cost // 현재 사용한 점수
remaining //남아있는 점수
resetAt //속도 제한 reset되는 시간.
}
}
참고 : REST와는 달리 속도 제한을 확인하는데 속도 제한 점수가 깎인다...
GitHUB docs - Rate limiting
GitHUB docs - Rate limit
GitHUB docs - GraphQL API Resource limitations
Everything You Need To Know About API Rate Limiting