jsDelivr – 향상된 오픈 소스 공공 CDN

이 포스트는 게스트 Dmitriy Akulov와 그의 프로젝트 jsDelivr에 관한 글입니다. – 에디터.

여러분이 개발자라면 아마 Google Hosted Libraries를 알고 계실 것입니다. Google은 여러분의 웹사이트에 가장 유명한 12가지 라이브러리들을 쉽고 빠르게 첨부할 수 있는 방법을 제공하고 있죠.

하지만 여러분이 웹마스터이고 덜 유명한 다른 프로젝트들을 사용하기 위해 CDN을 이용하고 싶다면 어떨까요? 혹은 여러분이 개발자이고 다른 사람들이 여러분의 프로젝트에 더욱 쉽게 접근할 수 있게 만들고 싶을 땐 어떨까요?

바로 그런 이유들로 jsDelivr가 나왔습니다. jsDelivr는 웹마스터와 개발자들을 위해 만들어진 자유로운 오픈소스 CDN입니다. 아무런 인지도 제한도 없고 자바스크립트 라이브러리, jQuery 플러그인, CSS 프레임워크, 폰트 등 모든 종류의 파일들을 배포할 수 있습니다.

라이브러리 추가하기

새로운 라이브러리를 추가하거나 기존에 있는 라이브러리를 업데이트하기 위해 개발자는 Github 저장소를 복사한 뒤 그것들에 맞는 수정 사항을 적용해야 합니다. 관리자가 Pull 요청을 검토한 뒤 그것을 기존 버전과 Merge하면 해당 수정 내용들은 곧바로 공식 웹사이트를 통해 이용가능합니다.

관리자가 현재 접속 상태일 경우에는 승인까지 20분이 걸리지 않으며, 접속 상태가 아닌 경우 누군가 접속할 때까지 10시간까지도 걸릴 수 있습니다. 하지만 자동-업데이트 기능이 가동중이라면 검토 시간은 확 줄어들 것입니다.

신뢰성

하지만 jsDelivr가 정말로 뛰어난 점은 뭘까요? jsDelivr는 단순히 또다른 퍼블릭 CDN이 되는 것이 목적이 아니라 개발자들과 웹사이트 관리자들이 믿고 쓸 수 있는 매우 빠르고 안정적인 기반을 제공하고자 만들어졌습니다. 크든 작든 어떤 웹사이트도 이런 걱정없이 사용할 수 있습니다. 대역폭에 제한도 없으며 매우 안전한 서비스를 제공합니다.

느린 응답 속도와 타임아웃, 서비스 중단은 더 이상 용납될 수 없습니다. 따라서 저희는 이러한 문제들을 극복하기 위해 매우 특별한 시스템을 고안해내어 기업용 CDN조차도 부러워할 만한 제품을 제공하고 있습니다. 가동 시간(Uptime)과 성능은 최고 수준이며 저희는 항상 모든 부분을 모니터링하면서 CDN을 더욱 개선시킬 수 있는 새로운 기술들과 프로바이더들을 주의깊게 지켜보고 있습니다.

기반 시설

network-map

경쟁 제품들과는 달리 jsDelivr는 가능한 최고의 가동 시간과 성능을 제공할 수 있도록 특별한 다중-CDN 기반 시설을 사용합니다. jsDelivr의 주요 백본은 MaxCDNCloudFlare가 제공하는 CDN 망의 가장 상위에 위치합니다.

그리고 저희는 CDN이 부족하거나 존재하지 않는 지역에도 자체 제작한 서버를 사용하고 있습니다. 현재 총 42개의 국제 POP 지역이 존재합니다. 향후 주요하지 않는 국가에도 최고의 성능을 제공할 수 있도록 훨씬 더 많은 POP 지역을 추가할 계획입니다.

물론 그 지역들을에 전체적으로 잘 분산되어 균형있게 부하가 나뉘지 않는다면 많은 지역이 무의미할 것입니다. 부하 균형 시스템을 위해 저희는 Cedexis가 제공하는 서비스를 사용하고 있습니다. 주요 기능중에 하나는 모든 주요한 CDN 프로바이더를 대상으로 수집하는 실시간 성능 데이터입니다. 매일 13억 RUM(실시간 사용자 메트릭스, Real User Metrics) 성능 테스트가 수행되며 모든 Cedexis 사용자들에게 적용됩니다.

성능 측정하기

이같은 RUM 테스트를 수집하기 위해 Cedexis는 수천개의 웹사이트들에 특별한 자바스크립트 코드를 적용하고 있습니다. 이들 웹사이트마다의 모든 방문자들은 이 특정 코드를 실행하며 방문자가  웹사이트를 돌아다니는 동안 내부에서 각각 다른 CDN 프로바이더를 대상으로 테스트를 시작합니다. 이 테스트는 전혀 브라우저 성능에 영향을 미치지 않으며 사용자에게도 물론 느껴지지 않습니다. 저희 웹사이트에 들어와 “Network” 탭을 열어 어떤식으로 테스트가 수행되는지 확인할 수 있습니다.

성능 테스트가 멋진 점은 인위적이지 않다는 것입니다. 테스트는 실제 사용자들이 특정 CDN을 통해 파일을 다운받을 때 겪는 성능을 반영합니다.

그리고 다음과 같은 정보들이 저장됩니다:

  • 프로바이더 각각에 대한 성능 표.
  • 프로바이더 각각에 대한 유효성 표.
  • 웹브라우저의 User-Agent
  • 사용자 IP 주소의 처음 24비트(3 Octets)

이제 이 모든 정보를 가져와서 훌륭한 부하 균형 알고리즘에 적용할 수 있습니다.

모든 사용자는 그들의 지역과 ISP 프로바이더를 기준으로 각각 다른 응답을 받습니다. 사용자가 jsDelivr를 통해 파일을 다운로드 요청하는 매 시간마다 이 알고리즘은 지난 몇 분동안의 성능과 유효성 데이터를 측정하여 특정 사용자와 특정 시간에 가장 최적화된 프로바이더를 선택합니다. 이 모든 과정이 단지 몇 밀리초(ms)밖에 걸리지 않습니다.

우선 모든 유효한 프로바이더들은 항상 접속 가능한 상태에 있음을 확인해야 합니다. 이를 위해 가동 시간의 매 분 동안 각 프로바이더를 탐색하는 종합적인 테스트와 RUM 유효성 데이터를 사용합니다. 그리고 나서 사용자와 사용자의 ISP 위치에 맞는 성능을 프로바이더를 나열하는 과정을 거치게 됩니다.

가장 최적의 프로바이더를 선택하고 나면 사용자에게 호스트 이름을 전달하게 됩니다. 예를 들어 설명하자면, 런던에 있으면서 각각 다른 ISP를 갖는 두명의 사용자는 2개의 다른 응답을 받게 됩니다. 왜냐하면 각 사용자의 ISP가 다른 라우팅과 함께 CDN 프로바이더들에 대해 다른 성능을 갖기 때문입니다. 이런 스마트 시스템은 모든 사용자들에 대해 최고 가동 시간 빠른 로딩 시간을 보장합니다. 만약 한 프로바이더가 접속이 끊기더라도 jsDelivr는 전혀 어떠한 문제도 갖지 않으며 즉시 다른 프로바이더를 통해 서비스를 제공합니다.

이 알고리즘은 또한 성능 저하에 즉각적으로 반응합니다. 예를 들어, 한 CDN 프로바이더가 유럽에서 DDoS 공격을 받는다면 그 응답 속도는 증가할 것이고 jsDelivr는 그 변화를 감지하여 간단하게 유럽에서 해당 프로바이더를 통하는 연결을 중지합니다. 하지만 여전히 공격을 받지 않은 미국과 그 외 지역에 있는 사용자들은 이용 가능합니다.

가동 시간과 속도를 하나의 CDN에 의지하지 마십시오. 어떤 것도 언제든지 갑자기 멈출 수 있지만 같은 경우에 2개의 CDN이나 다중 서버가 멈출 가능성은 훨씬 더 낮습니다. 그래서 jsDelivr가 모든 웹사이트에 가장 최고의 선택일 수 있는 이유입니다. 웹사이트 규모에 상관없이 말입니다.

저는 또한 무료로 jsDelivr를 지원하는 MaxCDN, CloudFlare, Cedexis와 다른 나머지 회사들에 주목하고 싶습니다. 오픈 소스 프로젝트를 지원하고 더 빠르고 자유로운 인터넷 환경을 만드려고 노력하는 많은 회사들에게 정말 감사합니다.

향상된 기능

jsDelivr는 또한 다음과 같은 재밌고 매우 유용한 기능을 제공합니다:

버전 앨리어싱(Version Aliasing)

프로젝트를 불러올 때 각 버전별로 별개의 URL을 쓰는 대신에 앨리어싱을 사용할 수 있습니다. Abaaso 프로젝트를 예로 들어 설명해 보겠습니다. 현재 가장 최신 버전은 3.10.50이고 여러분은 언제든지 URL에 특정 버전을 지정하여 불러올 수 있습니다. 하지만 이 프로젝트는 업데이트 횟수가 매우 잦기 때문에 여러분이 사용하는 프로젝트가 금방 구버전이 될 가능성이 높습니다. 이 문제를 해결하기 위해 다음의 간단한 URL을 사용할 수 있습니다:

//cdn.jsdelivr.net/abaaso/3.10/abaaso.min.js

3.10이라고 명시하여 3.10 브랜치에서의 최신 버전, 위 경우 3.10.50,을 불러오도록 하는 것입니다. 이 방법은 메이저 업데이트로 인해 발생하는 에러에 걱정없이 가장 최신의 마이너 버전을 불러올 수 있기 때문에 대다수가 선호하는 옵션입니다.

이 옵션은 다음과 같은 URL을 사용하여 v3 브랜치에서의 최신 버전을 불러오는 것도 물론 가능합니다:

//cdn.jsdelivr.net/abaaso/3/abaaso.min.js

그리고 혹시 어떤 이유에서든 무조건 가장 최신 버전을 불러올 경우라면 다음과 같이 사용하실 수 있습니다:

//cdn.jsdelivr.net/abaaso/latest/abaaso.min.js

'latest'를 사용함으로써 서버측에 무조건 가장 최신의 버전을 불러오도록 명령을 내리는 것입니다. 이것은 당연히 위험할 수 있으며 여러분의 웹사이트에 에러를 불러올 수 있으니 이 기능을 사용할 때에는 주의가 필요합니다.

단일 HTTP 요청을 통해 여러 파일 불러오기

jsDelivr는 이런 류의 기능을 제공하는 첫번째 CDN입니다. 여러분은 한번의 HTTP 요청만으로 여러 파일을 불러올 수 있습니다. 여러분이 가진 서버에 js 파일들을 합치고 축약하는 방식과 비슷하지만 jsDelivr의 거대한 스마트 네트워크에 의해 캐시로 저장됩니다.

여러분이 할 일은 여러분이 합치고자 하는 프로젝트와 파일과 필요하다면 버전까지 그들의 URL을 만드는 것입니다. 예를 들어, abaaso, ace, alloyui 프로젝트의 최신 버전을 불러오기 위해서는 다음 문장처럼 사용하면 됩니다.:

//cdn.jsdelivr.net/g/abaaso,ace,alloyui

가장 최신 버전을 불러오는 것은 그다지 추천할만한 하지는 않으며 여러분의 웹사이트를 죽일 수도 있음을 알아두세요. 이것이 바로 정확한 버전을 특정하는 게 좋은 이유입니다.

//cdn.jsdelivr.net/g/jquery@2.1,angularjs@1.2

그래서 jquery@2.1 은 2.1.0을 불러오고 angularjs@1.2 는 1.2.14를 불러올 것입니다. 하지만 위의 URL은 각 프로젝트들의 주요 파일들만 불러오며 다른 것들은 불러오지 않습니다.

혹시 하나의 프로젝트에서 여러 파일들을 불러오고 싶다면 다음과 같이 하세요:

//cdn.jsdelivr.net/g/jquery@2.1,angularjs@1.2.14(angular.min.js+angular-resource.min.js+angular-animate.min.js+angular-cookies.min.js+angular-route.min.js+angular-sanitize.min.js)

CSS를 불러오고 싶다면 다음과 같은 형식으로 css 파일을 선택하세요. 만약 URL 그룹에 있는 모든 파일들의 확장자가 .css라면 서버는 자동으로 Content-Type: text/css HTTP 헤더와 함께 응답을 보냅니다. 그 외의 다른 모든 경우에는(/g/ URL의 경우) Content-Type: application/javascript HTTP 헤더가 사용됩니다.

다음으로 간단히 여러분의 웹사이트에 url을 첨부하기만 하면 됩니다. DNS 확인(DNS resolving)을 줄이고 TCP 연결을 줄이고 HTTP 요청을 줄이면 = 더 빠른 웹사이트입니다.

여러분은 심지어 여러분의 사용자들이 필요한 모듈을 포함한 URL을 만들어 빠른 CDN을 통해 불러올 수 있게  이 기능을 제공할 수도 있습니다.

실시간 API

jsDelivr는 자체 모듈이나 https://github.com/jsdelivr/api 를 생각하는 어떤 것이든 만들 수 있도록 개발자 분들이 사용할 수 있는 완전한 API를 제공합니다.

여러분은 거대한 package.json 파일을 다운받는 것을 제외하고는 정확히 필요한 것이 무엇인지 요청할 수 있습니다. 그리고 그것은 물론 cdnjs와 구글을 지원하기 때문에 이러한 방법을 통해 개발자들은 어플리케이션에 적용하고싶은 무엇이든지 가질 수 있습니다.

자동-업데이트

jsDelivr libgrabber 는 저희 서버에서 동작하고 있는 도구이며 설정만 되어있으면 모든 프로젝트들에 대해 자동 업데이트를 도와줍니다. 가장 훌륭한 부분은 관리자가 그들의 각 저장소에 어떤 작업도 할 필요가 없다는 점입니다. 모든 변경 사항들은 jsDelivr 측에서 적용됩니다.

단지 여러분이 신경써야할 부분은 여러분이 jsDelivr 저장소에 자동 업데이트를 유지하길 원하는 프로젝트의 기본 정보들을 담은 update.json 파일을 만드는 것 뿐입니다. 새로운 버전에 대해 npm, bower 혹은 Github 저장소처럼 여러 소스들까지 지원합니다. 이 도구는 아직 개발중에 있지만 곧 출시될 예정입니다.

써보세요, 도움을 주세요!

jsDelivr는 제가 즐겁게 개발하고 더 좋아지도록 만들고 있는 매우 재밌는 프로젝트입니다. 물론 커뮤니티의 도움에도 매우 의지하고 있습니다. 여러분의 웹사이트에 적용하는 것을 고려해보시고 여러분의 프로젝트를 그곳에 올려보세요.

그리고 도움을 주시고 싶다면 저희는 언제나 그러한 도움을 필요로 하고 있습니다. Github에 언제든지 참여하세요.

자유롭게 댓글을 남겨주시고 어떤 질문이든 남겨주세요.

감사합니다.

본 글은 jsDelivr – The advanced open source public CDN의 한국어 번역입니다.

작성자: Hoony Chang

Web Programmer

Hoony Chang가 작성한 문서들…


댓글이 없습니다.

댓글 쓰기