Go 1.15의 새로운 기능들과 개선사항들에 대해 소개합니다.
리눅스에 대한 뉴스를 소개하는 사이트로 알려진 LWN.net에서 Go 1.15에 대한 내용을 소개합니다. 코로나19로 인해 큰 변화는 없지만 새로운 링커, 바이너리 파일 크기 축소 및 몇 가지 성능 개선사항이 있습니다.
Go 1.14의 추가된 새로운 비동기 선점(asynchronous preemption)을 소개합니다. 이전 Go 스케줄러는 함수 호출이 없는 타이트한 반복문(tight loops)에서 GC나 context switching이 일어나지 않았습니다. 추가된 비동기 선점은 시간 조건에 따라 트리거되며 Goroutine이 10ms이상 실행되면 선점을 시도합니다.
새로운 ORM 툴인 SQLBoiler입니다. SQLBoiler 데이터베이스의 스키마를 통해 모델에 대한 소스코드를 생성합니다. 생성된 코드는 타입 세이프하며 다른 ORM 툴에 비해 고성능입니다.
페이스북에서 Go로 만든 NTP(Network Time Protocol) 라이브러리 입니다. CLI로 NTP관련 작업을 실행할 수 있고(ntpcheck) 자체 NTP 서버에 대한 통계 및 리포팅을 제공합니다.(ntp/responder/stats)
Go기반의 HTTP2를 지원하는 지원하는 웹서버인 Caddy가 버전 2를 릴리스 했습니다. 단일 바이너리 형태로 실행 가능하며, 기본으로 HTTPS를 지원하며(TLS 자동화), 설정 파일을 JSON 포맷으로 손쉽게 설정 가능합니다.
애플과 구글이 손을 잡고 코로나19 확진자 경로 추적 및 접촉 여부를 알려주는 API를 개발해 발표를 하였는데요. 구글이 Go로 작성된 노출 알림 서버를 오픈소스로 공개 하였습니다.
github에서 만든 go-fault패키지는 서버에 여러가지 결함을 주입(Injection) 할 수 있습니다. go-fault패키지는 표준 http 패키지에 미들웨어 형태로 주입하여
- 요청을 거부하거나 (RejectInjector)
- 오류로 응답하거나 (ErrorInjector)
- 요청에 대기 시간을 주입하거나 (SlowInjector)
- 인젝터 인터페이스에 맞춰 커스텀 결함을 주입 할 수 있습니다. (custom faults)
Hoanh An이라는 분이 Go를 공부하면서 작성한 가이드 문서입니다. Go의 전반적인 문법이나 특징을 설명하는걸 넘어 Go 언어의 철학과 Escape Analysis, CPU Cache, 고루틴 스케줄러 등과 같은 각 기능의 메커니즘까지 아울러 설명하고 있는 것이 특징입니다. 또한 Go를 좀 더 잘 활용할 수 있도록 하는 다양한 디자인 패턴과 함께 테스팅에 대한 팁까지 제공하고 있습니다.
프로메테우스는 2012년 SoundCloud에서 만든 시스템 모니터링 및 경고 솔루션입니다. 2016년 Kubernetes에 이어 CNCF에 두번째로 합류 되었습니다. 해당 readme는 프로메테우스에대한 설명 및 간단한 사용법을 소개합니다.
캐나다 퀘백주의 어느 한 회사가 팬데믹으로 인한 재택 근무를 시작하면서 기존의 아날로그 방식의 업무 프로세스를 재택 친화적인 프로세스로 개선하는 경험담입니다. 기존의 온프레미스 팩스 머신을 벤치마킹한 뒤 Twilio와 Google Cloud 기반으로 온라인 팩스 머신을 개발하여 QR 코드 기반의 문서를 주고 받을 수 있도록 하였습니다.
Goland를 사용하여 Go로 마이크로서비스를 개발하는 내용입니다. 개발뿐만 아니라 마이크로서비스를 개발하는데 자주 사용하는 도커와 쿠버네티스 플러그인등을 함께 사용하면서 좀 더 생산적으로 Go 개발을 할 수 있도록 여러가지 팁을 제공해주고 있습니다.
go-ldap 라이브러리를 사용하여 Active Directory와 통신하는 ldap 프로그램을 구현하고 있습니다. 유저 및 그룹을 조작하거나 쿼리하는 기본적인 LDAP CRUD 오퍼레이션들을 구현하는 내용입니다.
Go의 가장 유명한 디버거 툴인 Delve의 설치 및 간단한 사용법을 소개합니다.
assert, mock, suite으로 구성된 라이브러리 testify와 BDD 테스팅 프레임워크인 ginkgo로 unit test를 손쉽게 작성하는 방법을 소개합니다.
루비에서 유명한 백그라운드 처리 시스템인 sidekiq의 저자 Mike Perham의 4단계의 접근 방식으로 Go 프로그램을 데몬화 합니다.
gRPC를 기반으로 터미널 기반의 멀티플레이어 게임을 구현합니다. 단순한 gRPC 튜토리얼을 넘어 실제로 조작 가능한 콘솔 게임을 구현하고 있으며 unary 요청뿐만 아니라 gRPC의 streaming을 사용하여 플레이어간 브로드캐스팅 및 실시간 동기화를 구현하고 있습니다.
Go와 gRPC를 사용하여 아주 간단한 채팅 서비스를 만들면서 gRPC를 학습하는 튜토리얼 영상입니다.
Golang의 창시자 중 한명인 롭파이크의 인터뷰입니다. 내년에 제네릭이 출시 될 예정이며, Go가 클라우드 인프라쪽에서 두각을 나타내고 있다는 점, 프로그래밍 언어와 개발방식에 대한 견해, 과거 10년동안의 Go언어에 대한 회상 및 향후 10년동안의 Go언어와 관련된 이야기 등이 포함되어 있습니다.
inline, mid-stack inline의 장점과 단점을 소개합니다. 함수를 인라인하면 호출의 오버 헤드가 줄고 컴파일러가 추가 최적화를 적용 할 수있는 기회가 증가하지만 프로그램 크기가 증가되며, 컴파일러 시간이 늘어납니다.
컴파일 타임때 결정되는 상수 키에 매핑되는 값을 반환하는 함수를 map과 switch로 작성했을 때 map lookup이 switch보다 훨씬 오래 걸리는 이유와 해결 방법을 설명하는 글입니다. map의 경우 상수 키임에도 런타임때 map에 지정된 키-값 쌍을 모두 할당한 뒤 lookup을 진행하여 컴파일 타임때 이미 결정되는 switch보다 느리다는 결론과 함께 해당 케이스에 대한 AST 최적화 패치 코드를 제안하고 있습니다.
JSON 프로세싱 타임을 11배 빠르게 개선하면서 사용했던 트릭을 소개하고 있습니다. 기본적인 아이디어는 메모리를 매번 새로 할당하지 않고 이미 할당된 메모리를 재사용하는 것과 JSON 파싱시 리플렉션을 사용하지 않는 방식을 채택하여 성능을 끌어올렸습니다.
AVX512의 SIMD로 MD5 해싱 작업을 병렬화하여 전체 해싱 작업 속도를 800% 향상시킨 내용입니다. MD5 해싱 속도 자체를 개선한 것은 아니며 SIMD 아키텍처를 활용하여 여러 개의 해싱 작업을 병렬로 동시에 처리하여 전체 속도를 끌어올렸습니다.
소스코드 라인을 하나로 만들어 바이너리 파일 크기를 줄이는 내용입니다. 컴파일 된 소스코드는 x.go:1:1에 모두 존재하며 약 6%정도 크기가 줄어듭니다 다만 이렇게 함으로써 panic시 얻을 수 있는 소스코드 라인 정보가 모두 x.go:1:1이라는 문제가 있습니다.
CockroachDB가 버전업이 되면서 늘어난 실행 파일의 크기가 늘어난 소스 코드보다 더 크게 늘어난 이유를 분석하는 내용입니다. 스택 트레이스 정보를 위해 프로그램 카운터와 라인 번호를 매핑한 LineTable을 저장하는 runtime.pclntab 라는 데이터 구조의 크기가 늘어난게 원인이었는데, Go 1.2 이전에는 이 데이터를 압축해서 저장했으나, 이후로는 초기 로딩 속도 향상을 위해 압축되지 않은 상태로 저장하여 실행 파일의 크기가 늘어났다는 결론입니다.
구조체는 비교시 패딩으로 인해서 컴파일러가 항등함수를 만드는데 비교를 금지하여(ex [0]func()) 바이너리 크기를 줄이는 이야기를 소개합니다.
Uber는 대부분의 백엔드 서비스 및 라이브러리를 Go로 작성하는데요. 프로젝트 관리를 monorepo로(많은 프로젝트의 코드가 동일한 저장소에 저장되는 소프트웨어 개발 전략) 구성하기로 결정한 뒤 Bazel을 채택하여 사용하면서 Bazel 생태계에 개선하고 기여하는 이야기입니다.
godoc과 GitHub README의 내용과 포맷을 통일하기 위해 goreadme라는 툴을 사용하여 godoc의 내용으로 GitHub README를 생성하는 내용입니다.
최신 버전의 Go를 쓰는게 좋다는 글입니다. 이유로는 표준 라이브러리의 성능 개선과 보안 및 버그 픽스가 있습니다. 또한 서드파티 라이브러리가 Go 최신 버전의 기능을 사용할 경우 대응하기 위한 부수적인 이유도 있습니다.
shebang 라인을 작성할 수 없는 Go 코드를 스크립트처럼 사용하기 위해 Linux 커널이 shebang 라인 없이 Go 코드를 executable로 바로 실행할 수 있도록 하는 트릭을 소개합니다.
Azure가 타 메이저 클라우드 서비스 대비 Go에 대한 지원이 미비하다는 내용입니다.
Immediate mode GUIs에 대한 설명과 Gio 프로젝트에 대한 설명을 팟캐스트 형식으로 진행합니다.
스리랑카에도 코로나19가 퍼졌고 보건 당국의 요청으로 격리병동에 있는 원격으로 환자를 실시간 모니터링 하는 시스템을 Go와 VueJS로 만든 이야기 입니다.
GitHub.com은 루비온레일즈 기반이지만 몇년 전부터 Go로 일부코드를 작성하고 있습니다. 첫번째로 authzd이라는 인증 서비스를 Go로 제작하였는데 MySQL 드라이버에서 세가지 버그를 맞닥뜨리게 됐습니다. 커넥션 문제, 타임아웃이 무시되는 문제, QueryContext로 여러 행을 읽는 도중 중단 됐을때의 보안문제등을 다룹니다.
os/signal 패키지에 신호가 수신될 때 취소되는 NotifyContext 함수를 추가하는 제안
func NotifyContext(parent context.Context, signals ...os.Signal) (ctx context.Context, stop context.CancelFunc)
ReverseProxy
구조체에서 X-Forwarded-For 헤더를 비활성화 하는 옵션을 추가하는 제안
go list하면 출력되는 packages.Package에 모듈 정보도 추가하는 제안
모듈에서 경로를 가져올 때 도트(.)를 포함하는 경로는 외부에서 인식되는데 사용자 코드인 test 및 example은 혼란을 야기할 수 있으므로 도트를 제거하자는 제안 (ex : module m.test-> module test or module example.com-> module example)
현재 어셈블리 정책이 Go의 보안팀이 보유한 리소스로 검토 및 관리가 힘들기 때문에 어셈블리 정책을 좀더 엄격하게하자는 제안
빈 인터페이스에 대한 타입 어설션(assertion)이 제대로 탐지 되지 않는 부분 개선