Webhook과 API Polling의 차이

1 분 소요

기존 프로젝트에 대해

봇의 실행 결과

SABot / Github 레포지토리 바로가기

나는 파이썬의 discord.py 라이브러리를 이용하여 리그 오브 레전드 게임의 실시간 매치 정보를 자동으로 클라이언트에게 제공하는 디스코드 봇을 만들었다. 하지만 최적화 문제로 인해서 배포까지는 진행하지 못했다. 이유는 다음과 같다.

Polling Madness에 대한 문제점

Stop Polling and Consider Using REST Hooks, Kristopher Sandoval

Polling Madness was a concept championed by API provider Zapier in 2013. Essentially, it simply states that the pattern of having a client routinely call an endpoint for new data, called “polling”, is wasteful.

=> Polling Madness란 간단히 말해서 클라이언트가 새로운 데이터를 얻기 위해 API 엔드포인트를 지속적으로 호출하는 방식이며 이는 매우 낭비가 심하다.

내가 만든 디스코드 봇은 당연히 데이터를 제공하는 Riot API에 의존하게 되는데, 봇에 등록된 사용자가 현재 게임을 하고있는지에 대한 정보를 항상 API 서버에 요청해서 얻어와야 했다. Polling Madness 문제에 직면할 수 밖에 없었던 것이다.

등록된 사용자가 적다면 크게 문제가 되진 않겠지만..(사실 퍼포먼스 문제가 된다.) 매 루틴마다 API 서버에 요청을 보내는 만큼 사용자가 증가할 수록 API 서버에도 부담이 되고 HTTP 요청을 보내는 봇또한 요청량이 사용자수와 비례하여 증가한다.

해결 방법?

Polling Madness 문제에 대한 근본적인 원인은 데이터의 변경 여부에 있다고 생각한다. 클라이언트는 서버 내에 데이터가 변경되어도 서버에 직접 요청을 보내기 전까지는 데이터의 변경 여부를 알 수 없다는 것이다.

그렇다면 반대로 서버에서 데이터가 변경되었다는 정보를 제공할 수 있으면 되지않을까?

Webhook

Webhook 이란, 서버에서 데이터 변경과 같은 작업이 수행 될 때 해당 정보를 HTTP POST 방식으로 알리는 개념이다. 웹 어플리케이션을 사용하는 클라이언트가 직접 URL을 지정하게 되면 역방향 API처럼 서버에서 해당 URL에 대해 POST 방식으로 콜백을 하게된다.

  • Polling과 Webhook의 차이점

webhook vs polling timeline

이처럼 클라이언트의 입장에서는 자신이 원하는 데이터를 얻기 위해 반복적으로 불필요한 HTTP 요청을 생성할 필요가 없고 서버 입장에서는 불필요한 HTTP 요청이 감소하기 때문에 서버에 부담을 줄여주는 장점이 있다.

결과

프로젝트에 적용 가능 여부

결론부터 말하자면 해당 프로젝트에 Webhook은 적용이 불가능했다.

이유는 Riot API 서버에서 Webhook에 대한 지원을 하고 있지 않기 때문이었다. 클라이언트의 입장에서는 서버가 Webhook에 대한 정보를 POST 하지 않으므로 서버 데이터의 변경 여부에 대해 Push 받을 순 없다.

Webhook 응용 해보기

Riot API에서는 사용할 수 없어서 정말 아쉬웠지만.. 웹 어플리케이션을 개발할 때 직접 Webhook 을 적용해봐야겠다고 생각했다.

현재 Github에서는 레포지토리에 대한 Webhook 기능을 제공하고 있다. 따라서 디스코드 봇을 통해 간단하게 Github 레포지토리의 변경점들을 Push 받을 수 있었다.

References

댓글남기기