Golang 기초 (1) : 소개 & 대표 플랫폼

vamos_eon·2021년 11월 14일
2

Golang 기초 

목록 보기
1/14
post-thumbnail

안녕하세요, 주니어 개발자 Eon입니다.

이번에 포스팅할 시리즈는 Golang입니다.
제가 많이 사용하는 언어이고 아직 많이 부족하지만 뛰어난 퍼포먼스와 쉬운 사용으로 인해 굉장히 마음에 드는 언어입니다.
아직 열심히 공부 중이며, 이미 알고 있는 내용들을 정리해보려 합니다.
나아가, Go에 대한 다른 여러 기능들을 포스팅할 수 있게 되었으면 좋겠습니다.


The summary of Go.

Google이 만든 언어이고 만들어진 계기는 'C++의 복잡성이 싫어서'라고 합니다.
웃긴 것은 C언어를 만든 켄 톰슨이 Go를 탄생시킨 3인(켄 톰슨, 로버트 그리즈머, 롭 파이크)의 대표자 중 한 명이라는 것입니다.
추가로, Golang의 패키지에 포함할 내용을 정하는 것은 아직까지 3인 만장일치제를 따른다고 합니다.

Golang 코드 실행은 아래의 사이트에서 쉽게 해보실 수 있습니다.
https://play.golang.org/
https://replit.com/languages/go


The performance of Go.

Golang은 컴파일 언어이지만 그 속도가 매우 빨라, 빌드하는 시간이 짧은 쾌적한 언어이다.
goroutine이라는 비동기 방식은 멀티 스레드 방식이며, 따로 관리할 필요 없이 그저 실행할 코드 앞에 'go'를 붙여주면 사용할 수 있다.
goroutine은 Golang 자체의 스케줄러에 의해 관리되는 경량 스레드인 관계로, 수천 개의 goroutine을 실행시켜도 성능에 지장이 없다.
Go를 빌드할 때에는 배포 환경에 따라 환경변수 지정을 해주면 문제가 없다.


Some famous platforms that are using Go.

Go의 뛰어난 퍼포먼스는 몇몇 커다란 플랫폼의 개발진을 매료시키기에 충분했습니다.
우리가 사용하는, 알고 있는 생각보다 많은 플랫폼들은 Go로 만들어졌거나 중요한 파트에 Go가 쓰였습니다.



Twitch

라이브 스트리밍 플랫폼인 twitch는 퍼포먼스가 중요한 시스템에 Go를 사용했습니다.
바로, 스트리머가 스트리밍함으로 들어오는 RTMP 스트림을 다수의 HLS 스트림으로 변환하는 시스템입니다.
twitch는 HLS를 사용함으로써 시청자가 화질을 조절할 수가 있습니다.
HLS는 HTTP Live Streaming으로, 스트리밍을 위한 통신 프로토콜입니다.
네트워크 상태에 따라 화질을 조절할 수 있는 Adaptive HTTP Streaming을 사용할 수 있습니다.
HLS는 아래와 같이 동작합니다.

  1. 퍼블리셔가 스트림 데이터를 생성하고, 서버에 전송합니다.
  2. 서버의 미디어 인코더가 스트림 데이터를 인코딩합니다.
  3. 스트림 세그멘터가 인코딩된 미디어를 ts포맷으로 변환 및 분할합니다.
  4. 이때, ts파일은 하나의 스트림 파일을 1080p, 720p, 480p, 360p 처럼 설정한 해상도마다 중복 존재합니다.
    이 ts파일은 클라이언트의 요청이나 네트워크 상태에 따라 ts index 정보가 담긴 m3u8이라는 플레이리스트와 함께 제공됩니다.
    m3u8에 담긴 정보로 인해 클라이언트는 스트림 화질이 변경되더라도 바로 이어서 시청할 수 있게 됩니다.

Twitch Engineering: An Introduction and Overview 발췌
바로 위의 2, 3의 과정이 Go가 사용된 파트입니다.
순수 Go만 사용된 것은 아니고 C/C++과 조합해서 사용했다고 합니다.
C/C++ 은 백엔드에서 High-performance를 위해 여전히 많이 사용되고 있는 언어입니다.
그러한 특징이 있는 언어들과 함께 쓰였다는 것은 Go도 상당한 퍼포먼스를 지녔다는 걸 간접적으로 증명합니다. (물론 C/C++에 비해 성능이 떨어지는 것은 사실입니다.)


Twitch는 사용자에게 최고의 스트리밍 환경을 제공하기 위해 지리적으로 다른 POP에 HLS를 배포합니다.
이 부분 역시 대부분 Go로 만들어졌습니다.
GLB 세팅도 마찬가지입니다.

  • POP : Point of presence -> 네트워크 접속 지점으로, ISP를 의미한다고 보시면 되겠습니다.
  • GLB / GSLB : Global (Server) Load Balancer : 글로벌 로드 밸런싱이며, 네트워크 상태를 판단하여 가장 적합한 서버에 우선순위를 높여 배포하도록 할 수 있습니다.

Twitch의 채팅 기능 역시 Go로 만들어졌습니다.
twitch는 Go를 채택한 이유에서 확장성이 뛰어나고 실시간 분산 시스템을 구축하기에 적합했다고 설명하고 있습니다.

추가로, Twitch는 Web API, 라우팅, 캐싱, 데이터 스토리지에 Go를 사용했다고 설명합니다.


PayPal

해외 유명 결제 시스템인 PayPal은 Go를 기반 언어로 채택했습니다.
PayPal에는 Golang 개발자가 100명이 넘어갑니다.

Go의 라이브러리, 도구, 동시성, 단순성, 확장성, 가비지 콜렉팅 등을 활용하고, 플랫폼 규모에 맞는 애플리케이션 생성 및 실행의 복잡성을 단순화할 수 있었다.
라고 설명합니다.

PayPal의 지불 처리 플랫폼의 핵심은 PayPal이 C++로 개발한 독점 NoSQL 데이터베이스입니다.
PayPal은 Golang으로 NoSQL 데이터베이스를 성공적으로 이식하면서 Go의 사용 범위를 확대했습니다.
또한 PayPal은 Go로 만들어진 인프라를 구축해, 서비스 빌드 및 테스트까지 가능한 테스트 팜을 보유하고 있습니다.

PayPal Taps Go to Modernize and Scale 발췌


Uber

한국에 최근에 들어온 우버에 Go가 사용됩니다.

Uber는 지리 데이터를 기반으로 한 운송 서비스 플랫폼입니다.
우버에 있는 지오펜스 조회 서비스가 Go로 대체되었습니다.

지오펜스(geofence)는 geo + fence로, 지리적 경계를 의미합니다.
사람이 정의한 지리적 경계로, 아래의 이미지와 같은 형태를 띱니다.

이 기술은 우버의 핵심 기술이자 우버가 제공하는 모든 서비스 중에 가장 QPS(초당 쿼리 수)가 높은 서비스입니다.
많은 양의 쿼리의 처리를 이전까지는 Node.js로 수행했습니다.
하지만 Node.js의 싱글 스레드 방식은 이 많은 양의 쿼리를 감당하기엔 부담이 되었고, 백그라운드 리프레싱은 CPU 사용을 장시간 멈추어, 쿼리 응답 시간을 늦추게 되는 결과를 초래했습니다.

Go의 goroutine은 멀티 CPU core에서 따로 동작하며 이러한 쿼리 응답 시간 급증에 대한 문제를 해결합니다.

무중단 백그라운드 로딩으로, geological 데이터를 바로 가져올 수 있습니다.
How We Built Uber Engineering’s Highest Query per Second Service Using Go 발췌


ETC

Golang solutions
Microsoft, Google, Facebook, NETFLIX, RIOT Games, Twitter, trivago 등이 Go를 사용합니다.
자세하게 더 알고 싶으신 분은 위의 링크로 이동하시면 잘 설명된 자료들이 있습니다.


이번 시리즈를 시작하면서, 첫 포스트로 Go에 대해 알아보는 글을 작성했습니다.
다음 포스트부터는 Golang 기초를 포스팅하도록 하겠습니다.
감사합니다.👍

profile
주니어 개발자

0개의 댓글