https://www.cloudflare.com/website-optimization/railgun/

 

이게 클플의 레일건 공식 페이지인데 설명이 굉장히 부실합니다.

그냥 압축해서 전송해서 200% 빨라지니 어쩌니 하는 정도의

설명만 하고 있어서 전혀 납득이 안가죠.

이게 과연 얼마만큼 수고할만한 가치가 있는 기능일까.. 생각했던 적이 있는데

좀더 찾아보니 이게 생각보다 좋은 기능이란걸 깨달았습니다.

 

사실 이게 기본적으로 거의 바니쉬에 가까운 기능이더군요.

클플은 static 파일만 캐쉬하고 HTML 페이지들은 캐쉬를 하지 않습니다.

왜냐하면 동적 페이지를 캐쉬하기 시작하면 캐쉬 주기가 매우 짧아져야

하고 그외에도 신경써야 할게 많아지기 때문에 시스템 자원을

훨씬 대량으로 써야 하기 때문이죠.

그래서 클플에선 캐쉬안하는 그 동적 페이지들을 사용자 서버 자체에서라도

캐쉬하기 위해 레일건을 쓰는 것입니다.

클플-서버간 트래픽을 줄이는데는 좀 효용이 적겠지만

일단 바니쉬처럼 서버 로드는 확실히 줄일 수 있을겁니다.

거기에 자체적인 특수한 프로토콜로 압축도 하고 있다고 하니 트래픽도

조금은 줄어들지도 모르죠.

 

거기에 또 하나의 큰 장점이 있는데 [자체적인 특수한 프로토콜]이라는

점입니다. HTTP를 안쓴다는거죠. 제가 레일건 안을 들여다본건 아니지만

분명히 TCP커넥션을 계속 유지하고 있을겁니다. HTTP/2처럼요.

그래서 통신이 필요할때 TCP커넥션에 필요한 시간을 절약해주는거지요.

이게 제가 알기로는 클플하고 내 서버하고 사이에는 HTTP/2가 사용되지 않습니다.

내가 서버에서 HTTP/2를 준비해놔도 클플에서 안쓰기 때문에 전혀 효과가 없죠.

그러므로 매 리퀘마다 커넥션이 맺어져야 하고 이건 상당한 부담이 될겁니다.

그런 의미에서 레일건을 쓰면 아마 상당히 빨라질것이라고 예상할 수 있습니다.

 

마지막으로 제가 레일건 개발자라면.. 이라고 생각해본건데

구지 사이트 사용자가 리퀘하고 나서 그때서야 캐쉬 뒤져서 없으면 받아오고

새로 캐쉬하고 그러면 사실 한박자 늦게 되지요. 적어도 갱신된 컨텐츠를 요청하는

첫번째 사용자는 항상 상당히 느리게 됩니다.

아마 이건 추측입니다만 레일건 서비스는 실시간으로 서버를 서치하면서

능동적으로 컨텐츠가 업데이트된 경우 그 내용을 클플쪽으로 미리 보내두는

기능같은게 있지 않을까 싶습니다.

그럴 경우 사용자가 리퀘를 하는 시점에서는 구지 본서버하고 통신을 할 필요가

없어지니 체감적으로 빨라진다고 느낄 수 있지요.

 

이정도 기능들이 구현되어 있다면 분명히 체감할만한 성능 향상을 기대할 수

있을 것 같습니다.

  • profile
    호스팅사에서 레일건을 지원해서 써본적이 있습니다.
    레일건으로 속도가 증가하긴 합니다만 클플 엣지서버 자체가 ICN으로 잡히질 않아서 레일건으로 빨라져 봤자 무용지물입니다.(결국 해외서버에 접속해야 하는 셈이므로...)

    엔터프라이즈 플랜을 사용한다면 서울서버 연결이 보장되므로 레일건의 효과를 볼수 있을지 모르겠네요.
  • profile

    클플 엣지서버와 고객 서버 사이의 회선이 느릴 때 레일건을 사용하면 꽤 효과가 있습니다. 예를 들어 고객 서버는 한국에 있는데 클플 엣지서버는 미국으로 연결된다거나, 고객 서버는 네덜란드에 있는데 클플 엣지서버는 일본으로 잡힌다거나...
     

    웹페이지 전체를 캐싱하여 여러 사용자에게 동일하게 보여주지는 않습니다. 조회수나 회원정보 등 사용자마다 다르게 보여야 하는 부분은 모두 정확하게 처리됩니다. 클플은 고객이 기존에 구축해 놓은 서버 구조나 어플리케이션을 웬만하면 건드리지 않고 자기네 서비스를 덧붙이기만 하면 성능이 개선되도록 하는 것이 셀링포인트입니다. 방문자에게 보여지는 내용은 레일건을 쓰든 안 쓰든 100% 동일합니다.

     

    레일건은 바니시와 마찬가지로 웹서버와 클플 엣지서버 사이에 앉아서, 다음과 같은 원리로 작동합니다. 아까 생성한 페이지에는 <div class="nick_name">단비아빠</div>라는 내용이 있고 이번에 생성한 페이지에는 <div class="nick_name">기진곰</div>이라는 내용이 있다면, 이번에 생성한 페이지를 통째로 전송하지 않고 레일건에서 먼저 두 페이지를 비교해 봅니다. 그리고는 "아까랑 같은 내용이지만 단비아빠만 기진곰으로 바꿔"라고 엣지서버에 간단히 알려줍니다. 물론 이 내용도 압축하여 전송하지요. 그러면 엣지서버에서 아까 캐싱해둔 페이지 + 레일건에서 알려준 변경내역을 조합하여 실제 페이지 내용을 복원한 후 사용자에게 전송해 줍니다.


    대부분의 웹페이지는 조회수나 회원정보 등 일부분만 달라지고 나머지는 모두 같은 내용이니, 이렇게만 해도 클플 엣지서버와 고객 서버 사이에 전송해야 하는 데이터가 획기적으로 줄어듭니다. 두 서버 사이의 거리가 멀면 이게 꽤 큰 차이를 낳습니다. 게다가 말씀하신 것처럼 TCP 커넥션을 따로 열어 놓고 쓰니 반응속도가 향상될 수밖에요. 단, 국제회선 용량 부족으로 문제를 겪으려면 사용자가 꽤 많아야 하니 소규모 사이트라면 별 차이가 없을 수도 있습니다.

     

    하지만 트래픽만 줄어들고 서버 부하는 오히려 늘어납니다. 이번에 생성한 페이지를 아까 캐싱해둔 페이지와 비교해서 차이점을 찾아내는 과정이 추가되니까요. 동접자가 1만 명 이상 되는 사이트라면 레일건이 추가로 잡아먹는 CPU가 웬만한 서버 한 대 분량이 될 수도 있습니다. 더 큰 사이트라면 아예 레일건을 다른 서버로 빼야 하고, 실제로 제 고객 중 그렇게 운영했던 사례가 있습니다. 서버 부하를 희생해서 트래픽을 줄이고, 그것을 통해 전체적인 반응 속도를 향상시키는 기술입니다. 물론 서버 증설은 고객 책임입니다.

     

    실시간으로 서버를 뒤져보거나 하는 기능은 없습니다. 위에서 말씀드린 것처럼 클플은 고객의 기존 시스템을 건드리지 않는다는 주의이기 때문에, 서버에서 전송해 주는 내용만 열심히 분석하고 최적화합니다.

  • profile ?

    자세한 설명 감사드립니다.

    제가 생각한 것과 반대군요 트래픽은 줄이고 서버로드는 늘어난다니... 음 tcp커넥션 유지효과만 보고 페이지 비교하는건 옵션으로 꺼버릴수있으면 좋울텐데요. 확실히 req마다 델타를 찾아야 하면.. CPU로드가 상당하겠군요.. 음.. diff하고 gzip하고 어느쪽이 더 느린지 한번 비교해봐야겠네요.

  • ? profile
    서버 부하를 줄이려면 고객 서버에서 아예 페이지를 생성하지 않아도 되도록 해야 하는데, 그러려면 고객의 어플리케이션을 대폭 수정해야 하겠지요. 특정 회원에게만 보여야 하는 내용은 모두 ajax로 불러오도록 한다거나, 세션 처리 방식을 바꾼다거나... 클플에서는 그런 거 취급 안 합니다.
  • profile ?

    지금 옵션을 뒤져봤는데
    stream.size = 1
    compress.data = 1
    하면 비슷하게 되지 않을까요?
    1바이트 이상의 HTML은 델타 검색을 안하고
    그대신 LZ4 압축을 사용한다고 하면...
    그럼 그냥 gzip 전송하는 것과 비슷한 서버로드에
    TCP 커넥션 유지로 인한 반응속도 향상만 누리지 않을까
    기대되는데요....

    근데 설마 이렇게 하면 커넥션 수가 모잘라서 병목 생기는건..??

    나중에 언젠가 비즈니스 플랜 쓸 일이 생기면 한번

    테스트해봐야겠군요. 후후...