다른 서비스
NEW
기획
디자인
개발
프로덕트
아웃소싱
프리랜싱
비즈니스
최근 검색어
전체 삭제
최근 검색어가 없습니다.

프로덕트

넷플릭스의 플랫폼: 코스모스(Cosmos)에 대하여

다양한 기능들이 하나의 마이크로서비스[1]로 조화를 이루고 있는 시스템

 

본문은 위시켓과 번역가 전리오가 함께 만든 해외 콘텐츠 기반 번역문입니다. 넷플릭스의 시스템 및 엔지니어링 설계, 구축, 운영을 담당하는 넷플릭스 테크놀로지 블로그에서 발행한 글입니다. 작가는 넷플릭스 코스모스 팀의 프랭크 산 미구엘(Frank San Miguel)입니다. 본문은 세계 최대 온라인 스트리밍 서비스를 제공하는 넷플릭스의 코스모스(Cosmos) 플랫폼에 대한 이야기입니다. 과연, 코스모스는 넷플릭스에서 어떤 역할을 하고 있는지 함께 생각해볼 수 있겠습니다. (전문적인 용어가 많아, 주석도 많이 추가되었으니 참고해주세요!)

 

들어가며

넷플릭스의 코스모스(Cosmos)는 비동기적[2] 워크플로우(workflow)를 갖춘 마이크로서비스와 서버리스[3] 방식이 가진 최고의 장점들을 하나로 결합해 놓은 컴퓨팅 플랫폼입니다. 그중에서도 최고는 수행 시간이 짧게는 몇 분에서부터 길게는 몇 년에 이르기까지 걸리는 복잡한 계층 구조를 가진 워크플로우를 통해서 조화를 이루고 있는 리소스 집약적인 알고리즘이 포함된 다양한 애플리케이션이라고 할 수 있습니다. 코스모스는 동시에 수십만 개의 CPU를 사용할 정도로 대용량 처리가 필요한 서비스와 많은 사람들이 계산 결과를 기다리고 있기 때문에, 레이턴시(latency, 속도 지연) 측면에서 매우 민감한 워크로드(workload)[4]도 모두 지원합니다.

 

코스모스 서비스

 

이번 글에서는 저희가 코스모스를 구축한 이유와 그것의 작동 방식을 설명할 것이며, 그리고 저희가 그 과정에서 터득하게 된 내용들을 일부 공유하려고 합니다.

 

 

구축 배경

넷플릭스에서는 미디어 클라우드 엔지니어링 팀과 인코딩[5] 테크놀로지 팀이 모여서 저희의 파트너 및 제작사들이 보내오는 미디어 파일들을 처리해서 모든 기기에서 재생할 수 있게 만드는 시스템을 함께 운영하고 있습니다. 이런 시스템의 1세대 버전은 넷플릭스가 2007년에 처음으로 스트리밍 서비스를 개시하면서 가동되었습니다. 2세대 시스템에서는 규모가 확장되었지만, 운영하기는 너무나도 어려웠습니다. 리로디드(Reloaded)라고 불리는 3세대 시스템은 현재까지 약 7년 동안 가동되고 있으며, 상당히 안정적이면서도 확장성도 아주 뛰어난 것으로 입증되었습니다.

 

리로디드를 설계할 때 저희는 소규모의 개발자들이 모여서 한정된 컴퓨팅 클러스터를 운영하는 팀이었고, 저희가 담당하는 영역은 비디오/오디오를 처리하는 파이프라인(pipeline)[6]한 가지에만 집중되어 있었습니다. 시간이 지나면서 개발자들의 수가 세 배 이상이 되었고, 저희가 다루는 영역의 범위와 깊이도 더욱 확장하면서, 전체 조직의 규모는 열 배 이상으로 커지게 되었습니다. 당시의 획일적인 아키텍처(시스템 구성 체계)는 새로운 기능의 개발 속도를 심각하게 늦추고 있었습니다. 그러한 시스템 때문에 조직의 구성원들이 새로운 기능을 구현하고 배치하는데 필요한 각자의 전문성을 마음껏 발휘하지 못하고 있다는 것을 깨달았습니다. 어떤 새로운 기능이나 프로세스를 개발한다는 것은 어느새 모든 개발자들에게 상당한 부담이 되는 일이 되었습니다. 왜냐하면 인프라를 담당하는 코드와 애플리케이션 영역의 코드가 시스템 내에서 온통 뒤섞여 있었기 때문입니다. 소규모의 팀일 때만 하더라도 제대로 동작했던 중앙집중식 데이터 모델은 그야말로 골칫거리가 되었습니다.

 

그래서 저희는 워크플로우가 중심이며 미디어에 집중된 마이크로서비스를 위한 플랫폼인 코스모스(Cosmos)를 만들기로 결정했습니다. 1차적인 목표는 현재의 기능을 유지하는 동시에, 다음과 같은 특성을 제공하는 것이었습니다.

  • 관찰 가능성(Observability)[7] – 로그 기록, 데이터 추적, 모니터링, 알림, 오류 분류 등의 자체적인 기능을 제공한다.
  • 모듈화(Modularity) – 서비스를 체계적으로 구성하고, 컴파일(compile)[8]과 실행 기능을 모두 모듈화 해서 처리할 수 있게 하며, 독자성을 갖춘 프레임워크를 구축한다.
  • 생산성(Productivity) 도구– 전문적인 테스트 실행 도구, 코드 생성 프로그램, 명령 줄 인터페이스(CLI)[9]등 현장에서 활용할 수 있는 개발 도구를 제공한다.
  • 결과 산출(Delivery) – 다양한 파이프라인, 지속적인 통합 업무, 엔드 투 엔드(end to end, E2E)[10]테스트 등의 모든 프로세스를 완벽하게 관리하면서 지속적으로 결과물을 산출하는 시스템을 구축한다. 만약 풀 리퀘스트(pull request)[11]를 여기에 통합한다면, 수동적으로 개입하지 않고도 산출물을 만들어낼 수 있다.

 

이러한 기능을 구현하기 위해 작업하면서, 저희는 또한 확장성, 신뢰성, 보안 등을 비롯한 시스템적인 특성들에 대해서도 개선을 이루어냈습니다.

 

 

개요

코스모스 서비스가 정확히 마이크로서비스는 아니지만 그래도 비슷한 점들은 있습니다. 일반적인 마이크로서비스는 요청한 작업에 따라서 자동으로 규모를 조절하는 스테이트리스(stateless)[12] 방식의 비즈니스 로직을 가진 일종의 API(응용 프로그램 인터페이스)입니다. 이러한 API는 연결된 단말(peer)과 강력한 관계를 맺으며, 다른 시스템으로부터 애플리케이션 데이터를 분리하고 바이너리 종속성(binary dependency)[13]을 제거하게 됩니다. (종속성을 없애서 독립적인 모듈로 동작한다는 의미입니다.)

 

일반적인 마이크로서비스

 

코스모스는 마이크로서비스의 강력한 관계 및 데이터/종속성의 분리라는 이러한 특성을 유지하고 있지만, 컴퓨터를 집중적으로 활용하는 비동기 방식의 서버리스 함수(function)[14]들과 여러 단계의 워크플로우가 추가되어 있습니다. 아래의 그림은 코스모스 서비스에서 클라이언트(client, 단말)가 비디오 인코더 서비스 API 레이어(layer)에 요청을 보내는 모습을 대략적으로 보여주고 있습니다. 워크플로우의 여러 단계는 지정된 규칙들로 조직되어 있으며, 일련의 서버리스 함수들이 각자 맡고 있는 역할의 알고리즘을 작동시키고 있습니다. 각각의 함수들은 도커(Docker)[15]시스템의 이미지(image)[16]패키지로 변환되며, 이들 패키지는 (각자가 처리하고 있는) 미디어에 특화된 바이너리 종속성을 갖게 됩니다. 이들은 큐(queue)[17]의 크기에 맞춰서 스케일을 조정하며, 경우에 따라서는 수만 개의 서로 다른 컨테이너(container)[18]에서 실행될 수도 있습니다. 각각의 요청이 완료되기까지는 몇 시간이 걸릴 수도 있고 며칠이 소요될 수도 있습니다.

일반적인 코스모스 서비스

 

 

관련 항목의 분리

코스모스에는 크게 두 가지의 분리 원칙이 있습니다. 그중 하나는 API, 워크플로우, 서버리스 함수들 간에 로직을 구분한다는 것입니다. 다른 하나는 애플리케이션과 플랫폼 사이의 로직을 분리한다는 것입니다. 이 플랫폼의 API는 분산 컴퓨팅에 대한 세부적인 내용들을 드러나지 않게 해서, 애플리케이션 개발자들에게 미디어 작업에 필요한 추상화(abstraction)[19]된 기능을 제공합니다. 예를 들자면, 비디오 인코딩 서비스는 스케일과는 관계없는 API, 워크플로우, 함수와 같은 컴포넌트로 구성되어 있습니다. 따라서 비디오 인코딩 기능을 실행할 때는 스케일에 대한 지식이 필요하지 않습니다. 이처럼 스케일과 관계없는 특정한 영역의 컴포넌트들은 다음과 같은 세 가지의 하위 시스템 위에 구축되어 있습니다. 이곳에서는 스케일과 관련한 실질적인 일을 처리하고 있으며, 이러한 컴포넌트들이 만든 결과물을 배포하는 구체적인 작업을 수행하고 있습니다.

 

  • 옵티머스(Optimus) – 외부의 요청과 내부의 비즈니스 모델을 매핑(mapping) 시켜주는 API 레이어
  • 플라토(Plato) – 비즈니스 규칙 모델링을 위한 워크플로우 레이어
  • 스트레이텀(Stratum) – 스테이트리스 함수와 컴퓨팅 집약적인 함수들이 실행되는 서버리스 레이어

 

이러한 하위 시스템은 모두 타임스톤(Timestone)이라는 스케일이 크고 레이턴시가 적은 아이템을 우선해서 처리하는 큐잉 시스템(queuing system)[20]을 통해서 서로 커뮤니케이션을 하고 있습니다. 이들 하위 시스템들은 각각 다른 종류의 서비스를 맡아서 처리하고 있으며, 하나의 목적성을 위해 구축되어 관리되는 지속적 전달(continuous delivery)[21] 프로세스를 통해서 각자 독립적으로 배치될 수 있습니다. 코스모스 시스템에서는 이처럼 관련된 것들을 따로 분리함으로써, 여러 다양한 서비스를 좀 더 쉽게 작성하고, 테스트하고, 운영할 수 있습니다.

 

플랫폼과 애플리케이션의 분리

 

 

코스모스 서비스의 요청

코스모스 서비스에서 일어나는 요청을 추적한 그래프

 

위의 그림은 저희의 관찰 가능성(observability) 포털인 너바나(Nirvana)를 캡처한 이미지입니다. 여기에서는 코스모스에서 일반적인 서비스가 요청되는 방식을 보여주고 있는데(위의 사례는 비디오 인코더 서비스), 그 내용을 간단히 설명하자면 다음과 같습니다.

 

1. API를 통해서 인코딩 요청이 하나 들어오는데, 여기에는 비디오 소스와 인코딩 방법이 포함되어 있습니다.

2. 해당 비디오는 31개의 조각으로 분할되어서, 동시에 31개의 인코딩 함수가 실행됩니다.

3. (잘라진 조각들을 다시) 조립하는 함수가 한 번 호출됩니다.

4. 인덱싱(indexing)[22]함수가 한 번 호출됩니다.

5. 모든 워크플로우가 8분 만에 완료됩니다.

 

 

서비스의 계층화

코스모스는 기본적으로 여러 서비스들의 분리와 계층화를 지원합니다. 그 결과로 만들어진 모듈형 아키텍처 덕분에 우리 팀들은 각자의 전문적인 영역에만 집중할 수 있고 자신들의 API와 배포 주기를 관리할 수 있습니다.

 

예를 들어서, 위에서 언급한 비디오 서비스는 다양한 기기에서 재생될 수 있는 스트리밍 동영상을 만들어내는 과정에서 사용되는 수많은 서비스들 중의 하나에 불과합니다. 하나의 스트리밍 동영상을 만들기 위해서는 파일 검사, 오디오 인코딩, 자막이나 콘텐츠 설명 등의 텍스트, 이러한 모든 데이터를 하나의 패키지로 만드는 것 등을 포함해서 아주 다양한 고차원의 서비스들이 체계적으로 활용되어야 합니다. 이러한 서비스들 중에서 가장 거대하면서도 복잡한 것들 중 하나는 바로 타파스(Tapas)라는 것입니다. 타파스는 수많은 제작사들에서 만든 콘텐츠를 가져오고, 그것을 넷플릭스 서비스에서 재생될 수 있게 만드는 역할을 책임지고 있습니다. 또 하나의 고차원 서비스로는 세이건(Sagan)이라는 것이 있는데, 이것은 마케팅용 클립(짧은 동영상)이나 매일 편집하는 과정에서 사용하는 프록시(proxy)[23]파일을 만드는 등의 스튜디오 작업에서 사용됩니다.

코스모스 서비스의 계층화

 

어떤 프로덕션 스튜디오에서 새로운 타이틀이 도착하면 타파스의 워크플로우가 활성화됩니다. 그러면 타파스는 파일을 검사하고, (다양한 해상도, 화질, 비디오 코덱으로) 비디오를 인코딩하고, (다양한 음질과 코덱으로) 오디오를 인코딩하고, (다양한 언어로) 자막을 만들어 내고, (다양한 기기에 맞는 포맷의) 패키지로 묶어서 최종적인 결과물을 만들어 냅니다. 즉, 타파스에 들어온 단 하나의 요청이 수백 개의 코스모스 서비스에 대한 요청으로 이어지고, 수천 가지의 스트레이텀 함수를 호출하는 과정으로 이어지는 것입니다.

 

아래의 그림에서는 최상위 서비스에 대한 한 번의 요청이 어떻게 해서 하위의 서비스로 흘러내리듯 이어지며, 그렇게 해서 결국엔 수많은 다양한 작업들이 어떻게 일어나는지를 보여주고 있습니다. 아래의 사례에서는 해당하는 요청이 완료되기까지 24분이 소요되었으며, 그 과정에서 8가지의 코스모스 서비스와 9가지의 스트레이텀 함수들이 호출되는 것을 포함해서 수백 가지의 작업들이 수행되었습니다.

하나의 요청이 다양한 레이어를 통해서 처리되는 과정을 추적한 그래프

 

 

모든 것은 워크플로우들이 지배한다!

아니, 하나의 워크플로우가 지배한다고 해야 할까요? 플라토(Plato)는 서비스 개발자들이 각자 영역의 로직을 정의하고 스테이트리스 함수/서비스를 조직하기 위한 프레임워크를 제공함으로써, 코스모스 내에 있는 모든 것들을 서로 연결해주는 접착제라고 할 수 있습니다. 옵티머스(Optimus)라는 API 레이어에는 워크플로우를 실행시키고 그들의 상태를 검사할 수 있는 기능이 내장되어 있습니다. 스트레이텀(Stratum)이라는 서버리스 레이어는 강력한 유형의 RPC(원격 프로시저 호출)[24]클라이언트를 생성해서 서버리스 기능을 쉽게 호출할 수 있게 만들어줍니다.

 

플라토는 저희 시스템의 비동기적이면서도 컴퓨팅 집약적인 속성의 알고리즘을 처리하기에 아주 적합한 전방향 추론(forward chaining)[25] 방식의 규칙 엔진입니다. 넷플릭스의 컨덕터(Conductor)와 같은 절차적 워크플로우 엔진과 다르게, 플라토는 “항상 작동하고 있는” 워크플로우를 쉽게 생성할 수 있게 해 줍니다. 예를 들어서, 저희가 더욱 뛰어난 인코딩 알고리즘을 개발하면, 저희가 가진 규칙 기반의 워크플로우들은 저희 없이도 그 새로운 워크플로우를 실행하고 운영하면서 기존의 동영상들을 업데이트하는 작업을 자동으로 관리합니다. 그리고 어떤 워크플로우든 다른 워크플로우를 호출할 수 있기 때문에, 위에서 언급한 서비스의 계층화도 자연스럽게 이루어집니다.

 

플라토는 아파치 카라프(Apache Karaf)를 사용해서 만든 멀티테넌트(multi-tenant)[26]시스템으로, 워크플로우 운영에 대한 부담을 상당히 줄여주고 있습니다. 이 시스템을 사용하는 사람들은 각자의 코드 리포지터리(repository, 저장소)에서 자신의 규칙을 작성해서 테스트를 한 다음, 플라토의 서버에 컴파일된 코드를 업로드 함으로써 해당 워크플로우를 배치할 수 있습니다.

 

개발자들은 그 기반이 아파치의 그루비(Groovy)이며 하나의 영역에 특화된 언어인 에미랙스(Emirax)로 작성된 일련의 규칙을 통해서 자신의 워크플로우를 구체적으로 지정할 수 있습니다. 각각의 규칙에는 다음과 같은 네 가지의 섹션이 있습니다.

 

  • 매치(match): 해당하는 규칙을 호출되기 위해서 충족되어야 하는 조건들을 명시한다.
  • 액션(action): 해당하는 규칙이 호출되었을 때 실행되어야 하는 코드를 명시한다. 어떤 요청을 처리하기 위해서 스트레이텀의 함수들이 호출되는 것도 바로 이 부분입니다.
  • 리액션(reaction): 액션 코드가 성공적으로 완료되고 나면 실행되어야 하는 코드를 명시한다.
  • 에러(error): 어떤 오류가 발생했을 때 실행되어야 하는 코드를 명시한다.

 

이러한 각각의 섹션에서 우리는 일반적으로 처음에는 워크플로우의 상태 변화를 기록하고, 그다음에는 스트레이텀의 함수를 실행하거나 어떤 실행의 결과를 반환(return)하는 것과 같은 각 단계별로 그 워크플로우를 수행해 나가고 있습니다.

 

 

레이턴시에 민감한 애플리케이션

세이건(Sagan)과 같은 코스모스의 서비스는 사용자들을 직접 상대하는 곳이기 때문에 레이턴시에 대해서 매우 민감합니다. 예를 들어서, <종이의 집(Money Heist)>의 최신 에피소드를 클립 동영상으로 만들어서 소셜 미디어에 올려야 하는 담당자라면, 많은 시간을 기다리고 싶지 않을 것입니다. 스트레이텀에서의 레이턴시는 작업 수행 시간에 더해서 컴퓨팅 리소스를 확보하는데 걸리는 시간으로 계산이 됩니다. 작업 요청이 폭주할 때면(이런 경우는 상당히 많습니다), “리소스 확보에 걸리는 시간”과 관련된 컴포넌트들이 중요해집니다. 예를 들어서, 여러분이 마트에 가서 화장지를 하나 구입한다고 생각해 보시기 바랍니다. 보통 때라면 아무런 문제 없이 쇼핑 카트에 화장지를 담아서 계산대로 밀고 가면 됩니다. 그리고 이런 모든 과정은 30분도 걸리지 않습니다.

 

리소스(자원)의 희소성

 

그러던 어느 날 심각한 바이러스가 출현해서, 모든 사람들이 동시에 화장지를 최대한 많이 구입하기로 마음을 먹었다고 생각해 보십시오. 그 전에는 30분이면 끝날 수 있었던 것이, 이제는 화장지 하나를 구입하기 위해서 최대 2주가 걸릴 수도 있습니다. 공급량에 비해서 수요가 폭증했기 때문입니다. 코스모스의 애플리케이션들과 스트레이텀의 특정한 기능들도 비슷합니다. 수요에 대한 예측이 불가능하며, 언제든 폭증할 수도 있다는 문제점을 갖고 있는 것입니다. 스트레이텀은 다음과 같은 몇 가지의 방식으로 이러한 레이턴시의 문제를 관리하고 있습니다.

 

1. 리소스 풀(resource pool). 최종 사용자(end-user)들이 각자의 비즈니스 규모에 맞게 컴퓨팅 리소스의 양을 미리 지정하게 하는 것입니다. 그리고 이렇게 확보된 리소스 풀은 계층 구조를 가지며, 동일한 그룹의 사용자들은 각자의 리소스를 공유할 수 있습니다.

 

2. 워밍업 기능(warm capacity)[27]. 최종 사용자들이 컨테이너와 같은 컴퓨팅 리소스를 사전에 미리 스트레이텀에 요청해서 작업 개시의 레이턴시를 줄이는 것입니다.

 

3. 마이크로배치(micro-batch) – 아파치의 스파크(Spark)와 같은 플랫폼에서는 작업 개시의 레이턴시를 줄이기 위해서 마이크로배치 기법을 활용하는데, 스트레이텀에서도 마찬가지입니다. 쉽게 설명하자면, 수많은 함수를 호출함으로써 작업 개시에 드는 비용을 고르게 나눈다는 것입니다. 만약에 어떤 함수를 10000회 호출해야 한다면, 10000개의 컨테이너에서 한 번씩 실행하거나, 1000개의 컨테이너에서 10번씩 실행하는 것입니다.

 

4. 우선순위(priority) – 레이턴시를 줄이는 것과 그러한 부분에 지출되는 비용 사이의 균형을 고려해야 할 때면, 코스모스 서비스에서는 일반적으로 중간 정도의 지점을 선택하곤 합니다. 즉, 어느 정도의 수요 증가를 처리하기에는 충분한 리소스를 확보해 두고, 수요가 최악으로 폭증하더라도 언제나 최적의 레이턴시를 보장할 만큼 충분한 리소스를 할당하지는 않는 것입니다. 그래서 저희의 애플리케이션들은 각각의 작업에 우선순위를 부여함으로써, 리소스가 부족한 상황에서도 가장 중요한 작업들은 레이턴시가 없이 최대한 빠르게 처리될 수 있도록 만들고 있습니다. 코스모스 서비스의 운영자들은 최종 사용자들에게 각자의 우선순위를 설정할 수 있게 하거나, 또는 API 레이어나 워크플로우 안에서 직접 우선순위를 설정하기도 합니다.

 

 

처리량에 민감한 애플리케이션

타파스와 같은 서비스는 많은 양의 컴퓨팅 리소스를 소모하기 때문에, 처리량에 대해서 아주 민감합니다. (예를 들어서 CPU만 하더라도 하루에 수백만 시간 동안 가동됩니다.) 그리고 각각의 개별 작업이 처리되는 데 걸리는 시간보다는, 몇 시간이나 며칠 단위에 걸쳐서 많은 양의 작업이 완료되는 데 걸리는 시간에 대해서 훨씬 더 많은 신경을 쓰고 있습니다. 즉, 서비스 수준 목표(SLO)가 1초당 작업 처리량이 아니라, 매일의 업무 처리량과 작업 1개의 처리에 드는 비용이라는 관점에서 측정됩니다.

 

처리량에 민감한 워크로드에 있어서 가장 중요한 SLO는 스트레이텀의 서버리스 레이어가 보여주는 성능입니다. 넷플릭스의 타이터스(Titus) 컨테이너 플랫폼 위에 구축된 스트레이텀은 리소스 스케줄링을 유연하게 설정함으로써, 처리량에 민감한 워크로드가 컴퓨팅 리소스를 “기회주의적”으로 이용하게끔 허용하고 있습니다. 예를 들어서, 어떤 워크로드가 서버리스 함수를 지금 당장 호출할 필요가 없이 한 시간 정도까지는 기다릴 수 있다면, 해당하는 워크로드를 대기하게 함으로써 비용을 낮추는 것입니다.

 

 

스스로의 목을 조르는 무화과나무[28]

저희는 리로디드(Reloaded)처럼 거대하고 복잡한 기존의 시스템을 변화시킨다는 것은 그간의 수많은 실패 사례들이 나뒹굴고 있는 위험한 계곡을 뛰어넘어야 하는 거대한 도약이 될 거라는 사실을 알고 있었습니다. 하지만 우리가 그것을 뛰어넘어야 한다는 사실에는 의문의 여지가 없었습니다. 리스크를 줄이기 위해서, 저희는 스스로의 목을 조르는 무화과나무와 같은 방식을 적용하기로 했습니다. 즉, 새로운 시스템이 낡은 체제의 주위를 둘러싸고 자라면서, 결국엔 예전의 방식을 완전히 대체하도록 만들고자 했습니다.

 

 

계속되는 학습

저희는 2018년부터 코스모스를 만들기 시작했고, 2019년 초부터 실제 서비스에서 운영해 오고 있습니다. 코스모스에는 현재 약 40개의 서비스가 있으며, 앞으로도 계속 증가할 것으로 보입니다. 저희는 아직도 여행을 계속하고 있지만, 지금까지 배울 수 있었던 핵심적인 몇 가지의 교훈을 여러분과 공유하고자 합니다.

 

 

출처: unsplash

넷플릭스의 문화가 핵심적인 역할을 하다

넷플릭스의 엔지니어링 문화는 하향식의 통제가 아니라 개인의 판단을 존중하는 것으로 유명합니다. 소프트웨어 개발자들은 자유와 책임을 동시에 가지며, 스스로가 리스크를 감당하고 결정을 내립니다. 저희들 중에서 소프트웨어 설계자(Software Architect)라는 직함을 가진 구성원은 없습니다. 저희 모두가 그 일을 하고 있기 때문입니다. 코스모스는 이런 조건에서 생겨날 수 있었고, 현지에 최적화한다는 상당히 이질적인 시도에서부터 출발했습니다. 옵티머스(Optimus)와 플라토(Plato), 스트레이텀(Stratum)은 각각 개별적인 것으로 구상이 시작돼서, 결국엔 단일한 비전의 플랫폼으로 통합되었습니다. 그 팀의 애플리케이션 개발자들은 모두가 사용자 친화적인 API를 만들고 스스로의 생산성을 높이기 위해서 끊임없이 노력했습니다. 그러한 비전을 현실로 구현하기 위해서는 미디어 알고리즘 개발자들과 인프라 사이에 강력한 파트너십이 필요했습니다. 하향식의 명령 체계에서는 이런 결과가 불가능했을 것입니다.

 

 

마이크로서비스 + 워크플로우 + 서버리스

저희는 “서버리스 함수들을 조정하는 워크플로우를 실행시키는 마이크로서비스”라는 프로그래밍 모델이 강력한 패러다임이 될 것이라는 사실을 깨달았습니다. 저희의 경우에는 이런 모델이 대부분 훌륭하게 작동하지만, 일부 애플리케이션들은 너무도 심플해서 오히려 그렇게 복잡한 구조를 만들어봐야 그만한 효과를 기대할 수 없는 것들도 있습니다.

 

 

플랫폼 우선의 사고방식

거대한 분산 애플리케이션으로부터 “애플리케이션들이 더해진 플랫폼”으로 변화한다는 것은 거대한 패러다임의 전환이었습니다. 모든 구성원들이 사고방식을 바꿔야만 했습니다. 애플리케이션 개발자들은 일관성이나 안정성과 같은 혜택을 얻기 위해서 어느 정도의 유연성을 포기해야만 했습니다. 플랫폼 개발자들은 공감 능력을 더욱 키워서, 고객 서비스, 사용자의 생산성, 서비스 수준 등에 대한 우선순위를 높여야만 했습니다. 플랫폼 개발팀이 애플리케이션 개발자들의 요구사항을 제대로 집중해서 다루지 않는다는 불만이 나오기도 했습니다. 그리고 플랫폼 개발팀에서는 사용자들의 요구사항이 지나치게 많다고 하소연을 하기도 했습니다. 저희는 서로에게 솔직하게 마음을 터놓고 끈끈한 신뢰를 통해서 이러한 어려운 시기들을 극복할 수 있었습니다. 예를 들자면, 저희는 최근에 이러한 과정을 되돌아본 후에, 개발자의 경험, 안정성, 관찰 가능성, 보안 등과 같은 시스템적인 특성들을 더욱 강화하기도 했습니다.

 

 

플랫폼은 승리한다

저희는 개발자들이 비즈니스적인 문제에 대해서는 더욱 많은 시간을 투자하고 인프라를 다루는 시간은 줄이면서, 그들이 일을 더욱 신속하게 잘 수행하도록 만들겠다는 목표를 가지고 코스모스 프로젝트를 시작했습니다. 당시의 목표는 뭔가 불분명해 보였지만, 그래도 현재로서는 우리가 원했던 바를 조금씩 얻어내고 있음을 알 수 있습니다. 개발자들이 코스모스 시스템에서 가장 좋아하는 부분은 결과물 산출의 관리, 모듈화, 관찰 가능성, 개발자에 대한 지원 등입니다. 저희는 이런 특성들을 더욱 강화하려고 노력하는 동시에, 실제 현장에서의 개발, 회복탄력성 향상, 테스트 기능 강화와 같은 취약한 부분에 대해서도 계속해서 개선하기 위해서 작업을 하고 있습니다.

 

 

향후의 계획

2021년은 개발자들도 늘어나고 처리해야 하는 업무량이 많아진 것은 물론이고, 저희가 수행하는 업무의 대부분을 기존의 리로디드에서 코스모스로 이전하고 있기 때문에 코스모스로서는 중요한 한 해라고 할 수 있습니다. 저희는 이러한 프로그래밍 모델을 새로운 분야에서도 활용할 수 있게 하기 위해서 더욱 발전시킬 계획입니다. 저희의 목표는 코스모스를 더욱 사용하기 쉽고, 더욱 유연하고, 더욱 빠르고, 더욱 효율적으로 만드는 것입니다. 저희의 코스모스가 어떻게 움직이는지, 그리고 저희가 그것을 어떻게 활용하는지에 대해서 앞으로도 많은 관심을 기울여주시기 바랍니다.

 

[1] 시스템을 구성하고 있는 요소들 가운데 독자적으로 실행 가능한 독립적인 모듈

[2] 어떤 내용의 변경사항이 있을 경우 그것이 실시간으로 동기화(synchronise)되지 않고, 사용자의 요청에 의해 업데이트 되는 방식

[3] 사용자가 호스팅 서버를 직접 구축하는 대신에, 클라우드 컴퓨팅 제공업체가 서버의 기능을 제공하고 관리해주는 서비스 방식

[4] 주어진 시간 내에 시스템이 처리해야 하는 작업량

[5] 영상이나 이미지, 오디오 파일을 만들 때, 데이터의 물리적인 양을 줄이기 위해서 코드화(encode)해서 압축하는 것

[6] 여러 단계의 처리 프로세스가 마치 공장의 생산 라인처럼 늘어서서, 동시에 다수의 프로세스를 처리하는 방식

[7] 시스템의 성능 문제나 장애의 원인 등을 찾아내기 위해서 복잡하고 다양한 애플리케이션들을 통합적으로 모니터링할 수 있게 하는 것

[8] 프로그래밍 코드를 컴퓨터가 이해할 수 있게 변환하는 작업

[9] 시스템의 터미널 창에 어떤 명령을 텍스트로 직접 입력하는 인터페이스로, 대표적인 것이 윈도우의 '명령 프롬프트'이다.

[10] 시스템을 통해서 단말(terminal)들끼리 서로 연결되어 동작하는 기능에 집중하는 것으로, 이러한 관점에서는 중간의 과정에 대해서는 크게 신경 쓰지 않는다.

[11] 브랜치(branch) 버전을 개발의 중심이 되는 소스 코드와 비교해서 변경사항을 적용하는 것

[12] 컴퓨터나 프로그램이 이전의 상호작용 상태(state)를 기록하거나 저장하지 않는 것

[13] 어떤 애플리케이션이 바이너리(코드화 된 실행 파일)에 대한 종속성을 가지는 것

[14] 특정한 작업이나 기능을 수행하는 프로그램의 기본 단위

[15] 리눅스(Linux)의 애플리케이션들을 프로세스 격리 기술을 활용해서 컨테이너(container)로 실행하고 관리하기 위한 오픈소스 프로젝트

[16] 시스템이나 실행 프로그램 등이 고정된 이미지(image)처럼 하나의 파일로 저장된 형태

[17] 컴퓨터의 기본적인 자료 구조의 한 가지

[18] 모든 코드와 종속성을 하나의 패키지에 담아서 구동 환경에 관계 없이 빠르고 안정적으로 실행될 수 있게 하기 위한 소프트웨어의 표준 단위

[19] 시스템의 사양이나 실행 환경에 관계 없이 동일한 코드가 사용될 수 있게 하는 것

[20] 큐(queue) 방식으로 데이터를 처리하는 시스템

[21] 언제든지 빠르게 원하는 소프트웨어를 출시할 수 있게 하는 기법

[22] 데이터에 대한 검색과 접근을 빠르게 처리하기 위해서 색인(index)을 정리하는 작업

[23] 동영상을 편집하는 작업에서 사용하는 원본보다 작은 임시 파일

[24] 별도의 원격 제어를 위한 코딩 없이 다른 주소 공간에서 함수나 프로시저를 실행할 수 있게 하는 프로세스 간 통신 기술

[25] 주어진 사실과 규칙으로부터 어떤 사실을 증명하는 추론 방법의 한 가지

[26] 하나의 소프트웨어 인스턴스(instance, 실행되고 있는 객체)가 다수의 테넌트(tenant, 사용자)에게 서비스하는 것

[27] 이 용어는 맥락에 맞게 의역했습니다. – 역주, 편집 시에 삭제하시기 바랍니다.

[28] ‘목 조르는 무화과 나무(strangler fig)’라는 종은 커가면서 뿌리가 나무를 감싸서 결국은 스스로를 죽게 만든다고 합니다.

 

 

> 이 글은 'The Netflix Cosmos Platform'을 각색하여 작성되었습니다.

댓글 0

요즘IT의 번역글들

이 프로필을 만든 저만 해도 영어가 서툴러 영어로 된 기사는 읽는 게 더딥니다. 그래서 준비했습니다. 읽어볼만한 해외 소식들을 번역해 전합니다. We are the world.

북극성 지표(North Star Metric) 선택하기

비즈니스

피그마는 여러분을 나쁜 디자이너로 만들고 있습니다

디자인

인터랙션 디자인 vs 시각 디자인

디자인

좋은 디자인 포트폴리오를 만드는 팁

디자인

나에게 맞는 웹 기술 스택을 고르는 방법

개발

윈도우11은 실패작이다

프로덕트

“파이썬은 느리다”에 대한 반론

개발

파이썬 초보자가 저지르는 10가지 실수

개발

우리가 주목할 UI/UX 디자인 트렌드

디자인

2022년 프론트엔드 개발 동향

개발

코드 리뷰 문화

개발

데이터 분석가는 무슨 일을 할까요?

개발

최고의 오픈 소스 개발 도구 Top 8

개발

데이터 분석이란 무엇일까?

개발

Flutter로 UI를 구현하는 방법

개발

자바 언어의 장단점과 2022년 트렌드

개발

데브옵스(DevOps) vs 데브섹옵스(DevSecOps)

개발

엑셀을 사용한 아름다운 데이터 시각화

디자인

여러분을 더 나은 플러터 개발자로 만들어줄 7가지 프로젝트

개발

모든 디자이너가 숙지해야 할 피그마 팁과 노하우

디자인

디자인 원칙과 디자인 가치, 그리고 디자이너

디자인

디자인, 산출물 그 이상을 넘어

디자인

이 회사는 디자인에 투자하고 있는 회사일까요?

디자인

애자일은 정말 디자인을 배제하나요?

디자인

평판 관리가 프리랜서 경력에 미치는 영향

프리랜싱

리액트 네이티브 개발자들이 겪는 가장 빈번한 5가지 문제와 해결책

개발

“솔직히 우리가 하는 것은 스크럼이 아닙니다!”

기획

데이터 시각화가 인류를 위기에서 구한 세 가지 역사적 사건

디자인

NFT의 장밋빛 미래는 사실일까?

기획

피그마 토큰으로 디자인 시스템 만들기

디자인

디자이너+개발자 = 슈퍼팀 만들기

기획

1인 개발자로서 테크 스타트업을 운영하며

기획

웹 디자이너가 PX대신 REM을 사용해야 하는 이유

디자인

100개의 스타트업을 멘토링하며 깨달은 성공의 비밀

기획

중화권 앱 UI가 영미권 앱 UI와 다른 점 알아보기

프로덕트

내가 테크 리더로 일하면서 얻은 8가지 교훈

기획

모두가 즐길 수 있는 디자인 검토 회의 만들기

디자인

프로덕트 매니저에서 프로덕트 마스터로

기획

10배 이상 뛰어난 개발자가 되는 법

개발

제품 디자인 관점에서 바라보는 NFT 아바타 열풍

디자인

에어비앤비: 대규모 iOS 앱 개발 생산성을 위해 바꾼 것들

개발

스포티파이: 맞춤형 플레이리스트 개발 비하인드 스토리

개발

프리랜서가 일하게 될 15가지 유형의 프로젝트

프리랜싱

슬랙: 제품 원칙을 통해 다시 태어난 알림 기능

프로덕트

페이팔: 실시간 그래프 데이터베이스 분석을 통해 사기를 방지하는 방법

개발

트위터: 수십억 개의 이벤트를 실시간 처리하기

개발

슬랙: 4가지 애자일 가치와 방법

기획

스퀘어: 모바일 우선을 넘어 웹에서 누리는 모바일앱 경험

디자인

스포티파이: 카피를 언어로 만드는 UX 라이팅

기획

마이크로소프트: 디자인의 미래를 위한 4가지 원칙

디자인

메타: AR/VR 경험까지 고려한 디자인 청사진

프로덕트

슬랙: 훌륭한 마케팅 카피를 위한 5가지 원칙

기획

2022년 UX/UI 디자인 트렌드

디자인

구글: 가변 폰트의 놀라운 활용법

디자인

에어비앤비: 위기 상황에서의 디자인 원칙 5가지

디자인

어떻게 두 명의 인턴이 수백만 개의 코드들을 보호할 수 있었나

개발

Lattice로 마이크로 프론트엔드를 구축하는 법

개발

Cool Cats NFT를 구축하면서 배운 것

개발

웹 컴포넌트가 프론트엔드 프레임워크를 대신할까?

개발

당신이 NFT에 대해 알아야 할 모든 것

개발

우리에겐 이상하지만 개발자들에겐 일상인 일들

개발

Next.js 12에서 주목해야 할 5가지 변화

개발

스벨트 vs 리액트, 누가 더 뛰어날까?

개발

개발자를 위한 iOS 15의 새로운 기능

개발

내가 오픈소스를 싫어하는 이유

개발

프로덕트 매니지먼트 고객 여정 5단계

기획

클럽하우스의 인기는 모두 거품이었다?

프로덕트

데이터 기반 의사결정의 장점

기획

시각 디자인의 폐쇄성 법칙이란?

디자인

사용자 경험(UX) vs 서비스 디자인

기획

프로덕트 매니저는 하루 종일 무슨 일을 할까?

기획

제품 주도 성장은 어떻게 이루어지는가?

기획

UX를 망치지 않는 설득력 있는 배너 디자인

디자인

팝업(Pop-up)으로 불리는 것들에 대하여

디자인

드롭다운(Drop-down)으로 불리는 것들에 대하여

디자인

당신의 생각을 표현하는 새로운 이모지

디자인

가장 똑똑한 소프트웨어 엔지니어에게 배운 10가지 교훈

개발

성공적인 UX 프로젝트를 위한 가장 중요한 질문

디자인

2021년, UI 디자이너가 모바일 앱에서 흔히 저지르는 실수

디자인

IT 매니저가 되는 방법과 성공하기 위한 요소

기획

슬랙(Slack) 같은 앱을 만들려면 비용이 얼마나 들까?

개발

아웃소싱이 이토록 인기를 얻게 된 이유는?

아웃소싱

마케터가 UX 관련 역량을 키워야 하는 이유

기획

미니멀리즘 디자인의 핵심적인 요소들

디자인

새로운 소프트웨어 개발사가 필요하다는 7가지 신호

아웃소싱

2021년을 이끌어가는 프론트엔드 개발 트렌드 5가지

개발

PM을 성장시키는 학습 프레임워크

기획

UI 카피라이팅, 어떻게 써야 하나요?

기획

트렌드 예측: 경쟁에서 앞서는 방법

기획

제품 사고(product thinking)의 힘

기획

인하우스 vs 아웃소싱, 소프트웨어 개발 어떻게 하나요?

개발

그림을 못 그리는 사람도 쉽게 와이어프레임 그리는 방법

기획

스타트업 기업들에게 아웃소싱이 중요한 이유

아웃소싱

제품과 기능, 성공적으로 종료하는 방법 (下)

기획

제품과 기능, 성공적으로 종료하는 방법 (中)

기획

제품과 기능, 성공적으로 종료하는 방법 (上)

기획

UX 디자이너에게 반드시 필요한 12가지 스킬

디자인

패스워드 없는 세상이 오고 있다

개발

디자이너를 쉽게 잃는 방법 10가지

디자인

프론트엔드 코딩 작업에 영감을 줄 8가지 아이디어

개발

구글이 아웃소싱을 하는 이유: 아웃소싱 성공사례 5가지

아웃소싱

일 잘하는 PM이 되기 위한 로드맵 도구 5가지

기획

이제는 말할 수 있다! 아웃소싱에 대한 오해 11가지

아웃소싱

디자인 트렌드, 모던 미니멀 스타일의 UI 가이드

디자인

MVP 개발을 아웃소싱으로 해도 될까요?

개발

온보딩 효과를 높이는 '좋은' 귀차니즘 3가지

기획

게임처럼 즐겨라, 게임화 기법 TOP3

기획

시니어 소프트웨어 엔지니어는 어떻게 일할까?

개발

프로덕트 매니저가 글을 잘 써야 하는 이유

기획

2030년엔 사라질 수도 있는 프로그래밍 언어 5가지

개발

고객들이 언제나 옳은 것은 아니다

기획

유저 스토리는 무엇인가?

기획

고객 성공을 위한 14계명

기획

8px 그리드 시대가 끝나고, 4px 그리드의 시대가 열릴까?

디자인

모바일 앱은 더 이상 스타트업에게 좋은 아이디어가 아니다

기획

과연 구글의 UX 강좌는 도움이 될까요?

디자인

프로덕트 매니저 여러분, ‘소비자의 요구사항 수집’을 그만두십시오

기획

고객 여정과 경험 지도의 차이점

기획

내가 AI 업계를 떠난 이유 5가지

기획

모달윈도우(팝업)를 디자인할 때 생각할 9가지 원칙

디자인

대기업 vs 중소기업, B2B SaaS 스타트업을 위한 시장은?

기획

내가 개발 인터뷰에서 면접자에게 감동한 이유

개발

HTTP의 새로운 메서드, 서치(SEARCH)에 대하여

개발

세상의 모든 프로덕트 디자이너를 위한 5가지 심리학 원칙

디자인

2021년 테스트 자동화 트렌드 리포트 (下)

개발

2021년 테스트 자동화 트렌드 리포트 (上)

개발

아마존과 스포티파이는 어떻게 사용자를 유지하고 측정할까?

기획

UX 디자이너라면 필수적으로 알아야 할 5가지 법칙

디자인

앵귤러 vs 리액트, 2021년의 승자는?

개발

2021년, SaaS 스타트업 시작을 위한 놀라운 아이디어 10가지

기획

디지털 제품 관리에서 B2B와 B2C 사이의 차이점은?

기획

빠르게 실행할 수 있는 ‘제품 요구사항 문서(PRD)’ 만들기

기획

더 나은 제품을 위한 프로덕트 메트릭스 가이드

기획

노 코드(No Code) 트렌드로 프로그래머들은 일자리를 빼앗길까?

개발

비즈니스와 애자일 조직은 어떻게 친해질 수 있을까요?

기획

효과적인 제품 전략 세우기: 다수의 전략적 트랙(MuST) 활용

기획

1년 만에 이메일 마케팅 효과를 극대화했던 방법

기획

솔루션 아키텍트를 위한 팁: 아키텍처 다이어그램의 5가지 유형

개발

새로운 맥 OS ‘빅서’에 대한 UX 디자이너의 생각

디자인

디자인 트렌드, 뉴모피즘의 정석

디자인

스스로 학습하는 UI/UX 디자이너가 되기 위한 2021년 로드맵, 3편

디자인

스스로 학습하는 UI/UX 디자이너가 되기 위한 2021년 로드맵, 2편

디자인

2021년 모바일 UX 트렌드 10가지

디자인

스스로 학습하는 UI/UX 디자이너가 되기 위한 2021년 로드맵, 1편

디자인

앱 설정 기능의 UX를 개선하는 효과적인 방법

디자인

다크모드 UI 디자인의 원칙

디자인

온라인 고객 경험을 개선하기 위한 5가지 방법

기획

신생 스타트업에서 일하는 프로덕트 매니저를 위한 현실적인 조언

기획

웹 개발자와 소프트웨어 개발자의 차이는 무엇인가요?

개발

랜딩 페이지 디자인을 개선하는 13가지 꿀팁

디자인

오프라인 비즈니스가 온라인에서 존재감을 가져야 하는 이유 5가지

기획

상향식 가격 책정 및 패키징 정책: 사용자 여정을 가이드로 활용하기

기획

B2B 제품의 UX, 그것은 숨겨진 영역인가요?

기획

상단 내비게이션 vs 사이드 내비게이션, 어느 것이 더 나을까?

디자인

자동완성 검색 기능 UX 설계를 위한 8가지 팁

디자인

프로덕트 매니저는 전문적인 IT 기술을 갖춰야 하나요?

기획

실리콘밸리 51개 기업들이 말하는 프로덕트 매니저의 역할 9가지

기획

아웃소싱에 대한 모든 것

아웃소싱

앱 디자인 가이드, 사람들이 즐겁게 사용할 수 있는 앱을 만드는 법

디자인

처음부터 완제품이 아니라 ‘MVP’를 만들어야 한다

기획

플러터 vs 리액트 네이티브 vs 네이티브, 성능이 더 우수한 것은?

개발

스타트업 프로덕트 매니저로 성장하는 법, 30-60-90일 플랜

기획

당신의 두뇌는 진보하고 있다: 성취감을 위한 3가지 전략

기획

디자이너들을 편하게 해주는 HTML/CSS 마법 10가지

디자인

코딩의 미래는 ‘노 코드(No Code)’이다

개발

내가 엔지니어링 매니저로 일하면서 저지른 실수들

개발

내가 롬 리서치(Roam Research)를 좋아하는 이유와 실제 사용법 (下)

기획

내가 롬 리서치(Roam Research)를 좋아하는 이유와 실제 사용법 (上)

기획

프로그레시브 웹 앱(PWA)이란 무엇이며, 왜 필요한가?

개발

PWA vs 네이티브 앱, 어떤 것을 선택해야 할까?

개발

UI 디자인에 여백을 활용하는 8가지 팁

디자인

마이크로소프트와 링크드인의 새로운 시도, 프리랜서 마켓에 도전장을 던지다

기획

토마스넷은 왜 가입자 수를 폭발적으로 늘려준 테스트 결과를 거부했을까?

기획

잘 팔리는 기업용 소프트웨어 디자인하기

디자인

파이어베이스(Firebase)란 무엇인가? 파이어베이스 심층 탐구 : 하편

개발

파이어베이스(Firebase)란 무엇인가? 파이어베이스 심층 탐구 : 중편

개발

파이어베이스(Firebase)란 무엇인가? 파이어베이스 심층 탐구 : 상편

개발

업워크(Upwork)가 조사한 요즘 가장 인기 좋은 개발 기술 15가지

개발

일자리 산업이 휴먼 클라우드(human cloud)에 적응하는 방법

기획

팬데믹 이후 세계에서의 디지털 가속화는 어떤 모습일까?

기획

같은 분야를 다룬 글들을 권해드려요.

요즘 인기있는 이야기들을 권해드려요.

일주일에 한 번!
전문가들의 IT 이야기를 전달해드려요.

[구독하기] 버튼을 누르면 개인정보 처리방침에 동의됩니다.

일주일에 한 번! 전문가들의 요즘IT 이야기를 전달해드려요.

[구독하기] 버튼을 누르면 개인정보 처리방침에 동의됩니다.