분류 전체보기

Programming/Go

Go/Golang HTTP 성능 튜닝

Go는 아주 쉽고 빠르게 HTTP 기능들을 구현할 수 있지만 성능 요구사항이 높아지다 보면 TIME_WAIT 등 자주 접하는 문제들이 있으며 자연스럽게 Go HTTP 튜닝 방법을 찾게 됩니다. 이번 포스팅에선 일반적인 Go HTTP 옵션들을 정리해봤습니다. 1. HTTP 통신을 위한 프로세스당 FD 개수 한도 설정 일반적으로 다음과 같이 리눅스가 설치되고 시스템 자원의 한도 값 중 프로세스당 FD의 개수에 대한 한도 값을 보면 다음과 같이 1024로 설정되어 있습니다. $> ulimit -n 1024 HTTP는 프로토콜의 특성상 TCP의 연결이 자주, 많이 발생하므로 1024는 부족해서, 조금만 트래픽 부하를 주어도 'Too many open files'와 같은 오류를 발생시킬 수 있습니다. 따라서 이 ..

Programming/Go

Go/Golang Dependency Injection

요즘 새로 투입될 업무 때문에 규격 분석만 하고 코딩할 틈이 없어 토이 프로젝트를 시작했습니다 프로젝트에서 golang은 DI(Dependency Injection)를 어떻게 쓰는 게 좋은 방법일지 고민해보았습니다 사내에선 golang에서 Google Guice같이 DI를 사용할 수 있는 아래의 소스를 이용하고 있었습니다 GitHub - alecthomas/inject: Guice-ish dependency injection for Go. Guice-ish dependency injection for Go. Contribute to alecthomas/inject development by creating an account on GitHub. github.com 사내 공통모듈에서 해당 소스를 impor..

Programming/Go

Go/Golang Scheduling

Go Memory에 이어 이번엔 Go Scheduler입니다 Go는 일반적인 프로그래밍 언어들과는 달리 goroutine이라는 형태를 사용합니다 우리는 goroutine으로 기존의 thread 방식보다 편리하게 concurrency를 구현합니다 뿐만 아니라 goroutine은 thread보다 가벼운 구조체이며 높은 성능을 자랑합니다 thread랑 goroutine은 뭐가 다른 걸까요? 단순히 goroutine만 아는 것보단 Go의 Scheduling을 이해해야 합니다 Memory 포스팅에서 잠깐 언급했듯이 Go는 Java의 JVM, .NET Framework의 CLR처럼 호스트 머신에 설치된 런타임을 이용하는 것이 아니라 생성되는 바이너리 파일에 작은 런타임을 포함합니다 해당 런타임이 바로 Go의 GC와..

Cooperation

[Git] squash commits already pushed - 여러 커밋 하나로 만들기

squash [skwɑːʃ;skwɔːʃ] 동사1. 짓누르다, 으깨다, 찌부러뜨리다 git에 commit들을 하나의 commit으로 묶을 수 있습니다 squash라고 하는데 뜻그대로 해당 commit들을 강제로 짜부시킨 느낌입니다 우선 squash라고하는 명령어는 없습니다 -i, --interactive let the user edit the list of commits to rebase rebase의 interactive 옵션을 이용해 squash를 수행할 수 있습니다 종종 PR을 하다보면 commit을 합쳐달라는 요청을 받는데 이미 push해버린 상태에서 3개의 commit을 squash 하는 예로 보겠습니다 (중요한 repository라면 사전에 백업을 먼저 수행하고 진행하세요) 3개의 commit을..

Cooperation

[Git] rebase is cleaner (merge vs rebase)

Git base로 개발을 수행하다 보면 commit -> pull -> merge -> push만 반복적으로 수행되는 경우가 많습니다 참여하는 개발자들이 많아질수록 merge가 자주 발생하게 되고 Git HIstory가 지저분해집니다(Non-linear history) Non-linear history가 있으면 안되는가? git든 현실이든 history는 다시 보기 위해 만들어두는 기록입니다 수많은 merge로인해 불필요하고 헷깔리는 commit들이 발생합니다 이러한 지저분한 기록보다는 다듬어두고 정리해두는게 훨씬 더 유용한 History를 유지할 수 있습니다 Linear History를 유지하기 위해 추천하는 방법은 rebase를 적극적으로 활용하는 것입니다 remote의 코드를 local로 pull할..

Programming/Go

Go/Golang Test

보통 TDD(Test Driven Developmen) 까진 안 해도 기본적인 틀을 갖추면 테스트를 병행해서 진행하는 편입니다 토이 프로젝트 기본적인 형태가 갖춰져서 우리의 소중한 동반자 [테스트]를 작성하면서 진행하려고 합니다 테스트는 안정성이 중요한 상용 프로젝트에서 가장 중요한 부분이라고 볼 수 있습니다 안정적이지 않은 App과 장애 발생은 서비스 가용성을 보장하지 못하게 되고 이는 단순한 비용 손해뿐만 아니라 가장 중요한 고객의 신뢰 손실까지 이어집니다 기업 입장에서 고객 신뢰성 상실은 가장 큰 손해로 이어지기 때문에 개발자들은 수많은 테스트들과 이중화 구성 등 만발의 준비를 합니다 높은 안정성 보장을 위해 테스트 케이스를 먼저 작성하는 TDD 방식의 개발도 채택되고 있습니다 위에서 말했듯 테스트..

Tech/Trend

Apple M1 Mac Pro 사용 후기

Apple M1 Mac Pro 사용한 지 4달 정도 지난 시점에서 물어보시는 분들이 많아 간단하게 후기 남기려고 합니다 회사 업무용으로 지원받아 Mac Pro를 구매하게 되었는데 어차피 집에도 Mac Pro 2019년형이 있기 때문에 M1칩으로 선택해봤습니다 M1? M1칩은 Apple이 Mac용으로 설계한 ARM 기반의 칩입니다 보통 Apple M1 혹은 Sillicon M1이라고 부릅니다 기존 Mac은 Intel칩을 사용했으나 이번 2020년 Mac은 Intel칩과 M1칩을 사용하는 버전이 따로 출시되었습니다 MacOS + M1(ARM) 아무래도 다들 이 새로 나온 혼종에 대해 기대 반 걱정 반으로 고민을 많이 합니다 1세대는 거르는게 답이다 VS 성능 가장 큰 문제점이라면 기존 App들과의 호환성이겠..

Programming/Go

Go/Golang Memory Management

이번엔 Go의 메모리 관리에 대해 정리해보려 합니다 Go가 1.17이 Release되는 현재 시점에서 해당 내용에 관해 국내에서 정리된 문서가 없는 것 같습니다 (몇가지 번역 문서는 존재하는것 같습니다) 이제 Go도 연식이 꽤 생긴 언어이고 관련 문서는 굉장히 많습니다만 버전마다 상세한 내용들이 추가되고, 바뀌고 있습니다 (문서는 대부분 잘 정리되어 있습니다. 양이 무지막지할 뿐) LINE 블로그의 굉장히 유명한 Go GC 관련 문서가 있습니다 깔끔하게 GC에 대해 정리해준 문서인데 Go 1.10 버전으로 다루고 있으며 현재는 이와는 GC가 꽤 달라졌습니다 Go 언어의 GC에 대해 - LINE ENGINEERING 안녕하세요, LINE Ads Platform 개발을 담당하고 있는 Okada(@ocadar..

Programming/Go

Go/Golang Protobuf Compile Guide

지난 포스팅에서 gRPC에 대해서 설명했으며 이번에는 go를 이용해 사용하는 방법을 정리합니다 gRPC 이번 포스팅은 gRPC입니다. 요즘 업무에 자주 쓰고 있어서 가볍게 정리해두려 합니다. [핵심 용어] 더보기 /* - RPC - IDL(Interface Definition Language) - gRPC - protobuf(프로토버프/프로토콜버퍼) - micros.. syntaxsugar.tistory.com gRPC를 사용하기 위해서는 protobuf로 IDL을 정의하고 gRPC 방식으로 컴파일해야 합니다 단순한 protobuf는 go에서 사용하는 방법이 굉장히 단순합니다 하지만 Tree 구조를 가진 protobuf를 go에서 컴파일하는 데는 현재까지 버그가 있습니다 이번 포스팅에서는 - 하나의 pr..

Programming/Go

Go/Golang Configuration

Configuration도 굉장히 중요한 영역 중에 하나죠 굉장히 다양한 방법과 의견이 나뉘는 분야입니다 JSON, YAML, 환경변수 등 종류도 다양하고 Cloud, Container, Command Line 등 환경도 다양합니다 그래서 golang에서 config를 어떻게 다루는게 좋을지 정리해보려 합니다 우선 12 factors에서 Configuration에 대해 언급하는 부분이 있습니다 2021.08.12 - [Cloud/Cloud Native] - The Twelve Factors The Twelve Factors Cloud-Native App은 Cloud 환경에 App을 배포하여 서비스하는 SaaS(Software As A Service) 방식입니다 그리고 Cloud-Native와 SaaS에서..

Syntax Sugar
'분류 전체보기' 카테고리의 글 목록 (3 Page)