본문 바로가기

Developer

(7)
Golang 고루틴(goroutine) 라이프사이클 관리 - channel 개요 (Overview) Golang 고루틴(goroutine) 라이프사이클 관리 - context.Context 개요 (Overview) Golang에서는 고루틴이라는 비동기 작업을 생성할 수 있고 쓰레드와 비교해 가볍기 때문에 동시에 수백 개를 만들어도 메모리를 많이 사용하지 않는다. 다만 특성상 비동기로 실행 torrang.tistory.com Golang에서 실행 중인 고루틴의 흐름을 제어할 수 있는 방법은 컨텍스트(Context) 외에도 채널(Channel)을 사용하여 흐름 제어를 할 수 있다. 채널은 다른 언어에서 일반적으로 큐(Queue)와 동일한 역할을 하고 있지만 Golang에서의 채널은 큐 외에도 흐름 제어의 역할도 가능하다. 채널은 기본적으로 별도의 동기 작업 없이도 안전하기 때문에 ..
Valkey - Redis를 대체하는 인메모리 데이터 저장소 개요 ValkeyWelcome! For the inaugural blog post on valkey.io, I’d like to recap the story so far, what to look forward...valkey.io 3월 28일 리눅스 재단에서 Valkey를 공개했다.Valkey는 인메모리(in-memory) 데이터저장소로 NoSQL 데이터베이스, 캐시, 메세지 큐 등 기존에 Redis가 하던 역할을 대체하는 오픈소스 프로젝트이다. 이전에도 비슷한 사례가 있긴한데 Redis는 또 왜 그런가 찾아봤는데... 🤔  Linux Foundation Launches Open Source Valkey CommunityCommunity maintainers, contributors, and users..
Golang 고루틴(goroutine) 라이프사이클 관리 - context.Context 개요 (Overview) Golang에서는 고루틴이라는 비동기 작업을 생성할 수 있고 쓰레드와 비교해 가볍기 때문에 동시에 수백 개를 만들어도 메모리를 많이 사용하지 않는다. 다만 고루틴은 비동기로 실행되고 쓰레드와 다르게 종료할 수 있는 함수를 제공하지 않는다. 즉 고루틴을 생성한 함수가 종료되더라도 생성된 고루틴은 남아서 계속 실행된다. 따라서 별도의 시그널을 통해서 종료해줘야 한다. 잠깐 실행되는 애플리케이션이면 큰 문제가 없지만 서버 애플리케이션과 같이 한번 실행하면 짧게는 며칠 길게는 몇 달을 넘게 계속 돌린다. 이때 생성한 고루틴을 제때 정리해주지 않으면 실행하는 고루틴이 계속 쌓여서 Memory Leak이 발생하게 되고 아무리 가벼운 고루틴이더라도 계속 쌓이면 결국 OOM(Out of Mem..
컨테이너 환경에서 GOMAXPROCS 이슈 GopherCon Korea 2023 발표 중 당근에서 컨테이너 환경에서 발생했던 이슈에 대한 내용이 흥미로워 확인을 해봤다. 회사에서도 Go 프로그램이 컨테이너 환경에서 실행되고 있어 공부해 둘 필요가 있을 것 같다. GopherCon Korea 2023 - 당근 발표 Issue runtime: make `GOMAXPROCS` cfs-aware on `GOOS=linux` · Issue #33803 · golang/go Problem The default setting of runtime.GOMAXPROCS() (to be the number of os-apparent processors) can be greatly misaligned with container cpu quota (e.g. as imp..
Golang defer 실행 순서 Go를 사용 중 문득 든 궁금증이 defer 함수를 여러 개 사용한다면 실행 순서가 어떻게 되는지 궁금했다. 기본적으로는 호출한 순서대로 실행될 것 같았고 고루틴의 경우는 예외적으로 랜덤하게 실행될 것으로 생각되어 실험을 해보았다. 테스트 기본 사용 시 package main import ( "log" "time" ) // 3초 후 숫자 프린트 // 결과: 3, 2, 1 func printNo() { defer log.Println("printNo=1") defer log.Println("printNo=2") defer log.Println("printNo=3") log.Println("run defer functions after 3 seconds") time.Sleep(time.Duration(3) ..
운영 중인 웹사이트 MongoDB 검색 성능 개선기 - 2 운영 중인 웹사이트 MongoDB 검색 성능 개선기 - 1 :: 더 나은 개발을 설계하는 사람 (tistory.com) 운영 중인 웹사이트 MongoDB 검색 성능 개선기 - 1 한동안 구축했던 오픈고시 사이트를 보기만 하고 관리하지 못하다가 검색 결과 조회가 너무 오래 걸리는 현상을 계속 보게 되어 개선을 하게 되었다. 사이트에서는 여러 시청과 정부 사이트가 torrang.tistory.com 이전에 진행했던 성능 개선을 통해 다음과 같이 최소 5배 이상의 성능 향상을 얻었다. 기존 검색에서 제외할 소식을 관리하는 테이블을 생성 관리자 페이지에서 제외할 소식을 추가 또는 제거 검색할 때마다 제외할 소식들의 id를 가져와서 쿼리에 포함 변경 검색에서 제외할 소식을 관리하는 테이블을 생성 관리자 페이지에서..