파일 업데이트 시스템 만들기

개요

개발중인 프로젝트에서 클라이언트 업데이트 시스템이 필요해졌다.
업데이트 되는 파일만 새롭게 받게 한다면 편할 테지만 큰 파일의 용량은 600MB가 넘었고, 서버에 차지하는 용량과 트래픽도 부담이 되었다.

그리하여 이전 버전과 새로운 버전의 Binary data 차이점(Patch file)만을 추출 하여 이를 서버에 업로드 하고, 유저는 해당 Patch file 만을 받아 이전 버전의 파일 + 받은 Patch file 을 이용하여 새로운 버전의 파일을 생성 해내는 방식으로 업데이트 시스템을 만들기로 하였다.

처음부터 Binary를 비교하여 Chunk를 만들려고 했으나 자료 조사 중 RTPatch, bsdiff, MSDelta 를 찾아내었는데, 그중 bsdiff 를 사용하기로 했다.

http://www.daemonology.net/bsdiff/

( MSDelta는 Microsoft에서 제공하는 API 인데, Vista 부터 사용이 가능하다고 하여 패스)

과정

패치 파일을 생성하는 순서는 다음과 같다.

이전 버전의 클라이언트 폴더 이름 : A
새로운 버전의 클라이언트 폴더 이름 : B

  1. A 폴더 내부에 있는 파일과 B 폴더 내부에 있는 파일이 동일한 파일인지 확인.
  2. 동일하지 않다면, bsdiff를 이용하여 패치 파일 생성.
  3. 생성된 패치 파일을 bzip을 이용하여 최대 레벨로 압축.
  4. 압축된 패치 파일을 MD5 값과 함께 서버의 업로드.

A 폴더와 B 폴더의 모든 파일을 위 과정을 거쳐서 패치 파일들을 생성 한후 MD5 값과 함께 서버의 업로드를 하면 된다.

패치 파일을 적용하는 순서는 다음과 같다.

  1. 업데이트 프로그램에서 현재 파일들의 버전을 확인 후 알맞는 패치 파일을 서버로 요청하여 내려 받는다.
  2. 내려받은 패치 파일이 유효한지 MD5 값을 비교 한다.
  3. bzip을 이용하여 압축을 해제 한다.
  4. 이전 버전의 파일과 패치 파일을 bsdiff를 이용하여 합친다.
  5. 새롭게 생성된 파일의 MD5값을 서버로 부터 요청 받아 패치가 제대로 이루어 졌는지 확인 한다.

퍼포먼스

위 과정대로 코딩 후, 테스트(cpu I7-2700K)를 해보았다.

가장 용량이 큰 600MB 파일의 경우 diff 하는데 5분 ~ 10분 정도의 시간이 걸린다.
병렬 처리가 아니기 때문에 좀 걸린다.

하지만 patch를 할때는 5초 내외의 시간이 걸리므로, 유저 입장에서는 충분히 사용할만 하다고 생각 된다.

단점

단점으로는 diff를 할 때, 메모리를 좀 많이 사용한다. 때문에 32bit에서는 diff를 할 수가 없다(메모리 할당 초과 – 2GB 이상 할당이 어렵다)

마무리

한번 패치 파일을 생성하는데 총 15분 정도의 시간이 소요 되고 메모리를 많이 사용하지만 개발 환경의 램은 빵빵 하며, 자주 패치 파일을 생성하는 것이 아니기 때문에 넘어갈만 하다.
또한, 클라이언트에서 패치를 할 때는 전혀 문제가 없고, 서버의 용량이나 트래픽을 고려하는 것이 초기 목표이므로…

잘 사용하기로 했다.

Advertisements

답글 남기기

아래 항목을 채우거나 오른쪽 아이콘 중 하나를 클릭하여 로그 인 하세요:

WordPress.com 로고

WordPress.com의 계정을 사용하여 댓글을 남깁니다. 로그아웃 / 변경 )

Twitter 사진

Twitter의 계정을 사용하여 댓글을 남깁니다. 로그아웃 / 변경 )

Facebook 사진

Facebook의 계정을 사용하여 댓글을 남깁니다. 로그아웃 / 변경 )

Google+ photo

Google+의 계정을 사용하여 댓글을 남깁니다. 로그아웃 / 변경 )

%s에 연결하는 중