대규모 서비스를 지탱하는 기술 과제 첫번째 파트 구현하기

Ryan Kim
5 min readApr 19, 2022

--

정수형 압축 프로그래밍으로 데이터 크기를 줄이고 I/O 고속화하기

국내에서는 개발자 바이블로 많이 알려져 있는 대규모 서비스를 지탱하는 기술이라는 책을 읽고 있다.

몇 년 전까지만 해도 절판되서, 중고로 책 사려면 원가보다 몇 배는 더 주고 구매해야하는 귀한 책이었는데, 책이 재출간되면서 바로 구매하게 되었다.

개인적으로 최근 구매한 CS(Computer Science) 관련 서적 중에는 만족도가 매우 높은 책이고, 최근 현업 개발을 하면서 공감되는 부분들을 많이 느끼며 읽는 책이다.

알라딘으로 몇 개월 전에 E-Book으로도 나왔던데 그 때 살껄 그랬다

이 책에는 총 3개의 실전 과제가 있고, Perl이라는 프로그래밍 언어로 과제를 풀게 제공하고 있다.

문제는 내가 이 언어를 모르고, 국내에서도 다른 프로그래밍 언어로 이 과제를 수행한 사람이 없다는거다.

(한 번 쯤 있을만한데, 다들 책만 읽고 과제를 자신의 프로그래밍 언어로 풀어볼 생각을 안한 것 같다)

그래서 해당 과제를 내가 잘 알고 있는 언어로 풀어보고 싶었고, 파이썬으로 해당 과제를 직접 해보게 되었다.

1. 과제설명

이 책의 앞부분 (대략 150쪽 전까지)에서 대규모 데이터의 다운로드 및 처리를 할 때 다음과 같은 전략을 추구하는 것을 권장한다.

  • 국소성을 고려하여 캐시 전략을 수립한다 (쉽게 말해, 여러 대의 서버로 나눠 서비스를 운영할 때, 사람들이 자주 찾거나 사용하는 데이터를 중점적으로 관리하는 서버를 별도로 두고 해당 요청에 대해서는 모두 이 서버에서 캐싱된 자료를 응답으로 보내게 한다.)
  • 위 전략으로 부족할 경우, 탑재된 메모리 크기를 늘린다. (옛날엔 사설 서버라 어렵겠지만, 클라우드 서비스에서는 서버 당 메모리 늘리는 것은 쉽다)
  • 위 2가지 전략을 모두 취했음에도 더 필요하면 분산 처리 시스템을 적용한 서버를 구성한다.

그러나 이것들은 일단 기본적으로 서버에서 사용하고 있는 데이터들이 충분히 최적화 시킨 이후에 적용해야하는 사항들이고, 기본적으로 데이터 자체를 압축해 보관함으로써 디스크 I/O 등을 줄이는 전략을 취할 수 있는데, 이게 첫번째 과제의 취지다.

사용해야하는 알고리즘으로는 VB(Variable Byte) Code를 소개하고 있고, 우리가 현대 컴퓨터에서 일상적으로 사용하고 있는 32비트 숫자 표현 방법을 다른 규칙에 따라 부호화하는 것을 의미한다.

예를 들어, 숫자 5를 현대 컴퓨터와 VB Code에서 표현한다면

(현대 컴퓨터) 5 → 00000000 00000000 00000000 00000101

(VB Code) 5 → 10000101

VB 코드를 사용하면 위의 예시처럼 작은 숫자들의 경우 1바이트만 사용해도 되며, 숫자가 커질수록 해당 숫자에 맞는 적절한 바이트를 사용해 표기하는 것이 가능해진다.

즉, 고정적으로 32비트를 매번 할당할 필요는 없으며, 이후에 복호화(decode)를 통해 원래 값을 돌려주면 되는 것이 과제의 취지다.

이 방법을 따르면 대략 180MB 정도의 파일이 37MB 까지 줄어들며, 한정된 하드웨어 자원을 효율적으로 사용할 수 있다.

2. 과제 구현

구현할 과제의 의사 코드는 다음과 같다.

생각보다 표현하는 의사 코드는 쉽다.

구현할 코드는 생각보다 쉬운데, 구글링하면 자료가 없다.

정확하지 않지만, 파이썬을 포함한 현대의 프로그래밍 언어에는 거의 기본적으로 encoding, decoding에 대한 메소드가 존재한다. (문자, 숫자 모두)

게다가 VB Code에 대해 검색하면 VS Code나 Visual Basic 등 IDE가 검색될 정도로 검색 빈도도 거의 없다시피한데, 아마 프로그래밍 언어에 내장된 기능이 워낙 많아 요즘은 잘 안쓰지 않나 싶다.

그럼에도 불구하고, 기능을 이해하고 쓰는 것과 모르고 쓰는 것은 많이 차이가 있으므로 구현을 해보게 되었고, 코드는 아래와 같이 구성된다.

코드에 대해 풀어서 설명하자면, 파이썬에서 문자열, 숫자 등을 이진수로 표현할 수 있어야하는데, 이를 표현하기 위해 from struct import pack, unpack 라는 모듈을 사용해서 바이너리 객체로 변경했다.

사용 방법은 공식문서에 있어서 참고하면 되겠지만, 기본적으로 C/C++에서 바이너리를 다루는 방법에 대해 이해가 필요하다 (파이썬은 C로 짜여져 있다. 이 기회에 C를 알아가는 것도 방법이다.

입력한 코드가 맞는지 체크하기 위해 테스트 코드도 작성했다 (해당 테스트 코드도 책에서는 perl로 구성되어 있지만, 파이썬으로 내가 재구성했다)

다행히도 테스트는 잘 통과했고, 큰 수와 작은수 모두에서 잘 동작하는 것을 볼 수 있었다.

3. 더 해볼 사항

위의 코드를 이용해서 파일 압축과 복호화 과정을 구현하고 있다.

책에는 perl로 구현되어 있지만, 파이썬으로 구현을 시도하니, 압축과정에서 용량이 무한대로 늘어나는 문제가 발생하고 있다.

아직 원인을 못 찾고 있는데, 빠른 시일 내에 해결해야겠다.

코드 구현하면서 느꼈는데, 애플리케이션 코드 짤 때와 느낌이 많이 틀리고, 컴퓨터 구조를 이해 못하면 근본적으로 빅 데이터에 대해 다루는 것에 많은 어려움이 있을 것이라는 생각이 든다.

결국 공부할 수록 컴퓨터에 대해 더 잘 알고 있는 사람들이 빨리 배우지 않을까 싶다.

--

--

Ryan Kim
Ryan Kim

No responses yet