본문 바로가기

Go46

Sharding - 개요 개발자가 샤딩이라는 용어를 접할 수 있는 가장 일반적인 분야는 DB인것 같다. DB 장비(instance) 1대가 감당할 수 있는 수준을 넘어서는 규모의 데이터를 처리해본적이 있다면 샤딩이라는 단어를 들어봤을것이다. 샤딩을 적용하면 전체 데이터가 여러 대의 장비로 분산되며, 이에 따라 자연스럽게 1대의 DB 서버가 받는 부하도 분산된다. 그런데 샤딩이 꼭 DB에만 샤딩이 적용되는것은 아니다. 공유 데이터에 대한 쓰기나 읽기 락 경합을 완화하기 위해 사용되기도 한다. Golang 에서 Map 을 사용한다고 가정해보자. 어떤 데이터를 DB로 부터 조회한 후, Map에 취합한다. 그런데 데이터가 커짐에 따라 속도가 생각만큼 나오질 않아 goroutine을 생성하고 취합을 빠르게 하려고 한다. CPU를.. 2024. 1. 13.
Fan-out, Fan-in - 출처: https://go.dev/blog/pipelines Go Concurrency Patterns: Pipelines and cancellation - The Go Programming Language Go Concurrency Patterns: Pipelines and cancellation Sameer Ajmani 13 March 2014 Introduction Go’s concurrency primitives make it easy to construct streaming data pipelines that make efficient use of I/O and multiple CPUs. This article presents examples o go.dev - 개요 Fan-out은 하나의 .. 2023. 11. 12.
Debounce - 출처: 클라우드 네이티브 패턴 - 개요 Debounce는 함수 호출 빈도를 제한하여 여러 번 호출 발생시 처음이나 마지막 호출만 동작하도록 하는 패턴이다. - Context and Problem 시스템의 작업중에서는 속도가 느리고 비용이 많이 드는 작업이 존재한다. 이런 유사한 작업이 연속적으로 여러 번 발생할때마다 서버가 요청을 처리하면 무거운 작업을 계속 수행해야 한다. - Solution Front-end 개발을 해본적이 있다면 Debounce나 Throttle이라는 용어가 익숙할것이다. 가장 대표적인 예제가 자동완성검색이다. 이를 구현할 때 검색창에 입력 이벤트가 발생할때마다 요청을 서버로 보내면, 서버의 부하가 많이 걸릴 수 있다. 그래서 Debounce 패턴을 이용하여 일정 기간내의 마지막.. 2023. 10. 30.
Circuit Breaker 출처: https://learn.microsoft.com/en-us/azure/architecture/patterns/circuit-breaker Circuit Breaker pattern - Azure Architecture Center Handle faults that might take a variable amount of time to fix when connecting to a remote service or resource. learn.microsoft.com - 개요 Circuit Breaker는 원격 서비스나 자원에 접근할 때 오류가 발생하는 경우 복구에 어느 정도 시간이 걸리는지 알 수 없는데, 이런 경우를 다루는데 유용한 패턴이다. Application의 안정성과 탄력성을 향상 시킨다... 2023. 10. 27.
Go - context (blog) - 출처: https://go.dev./blog/context - 소개 Go 서버에서 들어오는 요청은 goroutine 으로 다루어지며, 요청 핸들러는 DB나 RPC 서비스 접근을 위해 추가적인 goroutine을 생성하기도 한다. 때로는 이런 goroutine 들이 공유해야 하는 값들(ex - end user 식별값, authorization token, 요청 deadline 등)이 있을 수 있다. 만약 요청이 취소되거나 timeout이 발생하면 사용중이던 자원을 회수해야 한다. go 에서는 이런 상황들을 해결할 수 있도록 Context를 제공한다. - Context context package의 핵심인 Context 형을 살펴보자. // A Context carries a deadline, cance.. 2022. 11. 13.
Go - pipelines and cancellation - 출처: https://go.dev/blog/pipelines - 개요 Go 언어는 동시성을 잘 지원하는 언어라서 I/O나 CPU를 효율적으로 사용하는 스트리밍 데이터 파이프라인 구축이 수월하다. 하지만 파이프라인을 구축하다보면 인지하거나 처리하기 어려운 오류 혹은 미묘한 부분이 발생할 수 있는데 이를 자세히 알아보고 어떻게 깔끔하게 처리 하는지 알아본다. - 파이프라인이란? 공식적인 정의는 없지만 비공식적으로는 채널에 의해 연결되는 단계(Stage) 들이 연속적으로 연결된것이라고 할 수 있다. 각 단계에서 고루틴은 아래와 같은 동작을 취한다. inbound 채널을 통해 upstream 으로 부터 값들을 수신한다. 해당 데이터에 대해 일부기능을 수행하는데 일반적으로는 데이터를 생성하는 행위이다. out.. 2022. 10. 21.
package name base, util, or common - 출처: https://dave.cheney.net/2019/01/08/avoid-package-names-like-base-util-or-common - package name 좋은 Go package를 작성하려면 이름을 잘 지어야 한다. 하나의 단어로 해당 package가 무엇을 하는지 간략하게 나타낼 수 있어야 한다. package name을 보다보면 utility 라는 이름을 종종 볼 수 있다. 이런 package명은 관계없는 기능들이 많이 포함되어있어서 package 명을 보고 무엇을 제공하는지 알기가 힘들다. utils나 helpers 같은 package 이름은 계층 구조가 깊은package를 개발하고 순환참조 없이 helper 기능들을 공유하기를 원할 때 사용하곤 한다. utility 기.. 2022. 6. 26.
Empty struct - 출처: https://dave.cheney.net/2014/03/25/the-empty-struct - Introduction empty struct란 말 그대로 field가 하나도 없는 struct type 이다. type Q struct{} var q struct{} 근데 여기서 한 가지 의문점이 생긴다. field도 없고 데이터도 포함되어있지 않은 struct를 왜 사용하는것인가? - Width empty struct를 알아보기 전에 width에 대해서 알아보자. width 라는 용어는 gc 컴파일러에서 유래했는데, type의 instance를 저장할 때 필요한 byte 수라고 할 수 있다. 이 블로그의 원문을 쓴 필자는 프로세스의 주소 공간은 1차원이기 때문에 width가 size보다 더 적절.. 2022. 6. 21.
Zero value - 출처: https://dave.cheney.net/2013/01/19/what-is-the-zero-value-and-why-is-it-useful - Zero value 내장 함수 new나 make를 호출하거나 선언을 통한 값을 저장하기 위해 메모리가 할당될 때, 명시적으로 초기화를 하지 않으면 메모리에는 기본 초기화된 값이 저장된다. 이때에는 해당 type에 맞는 zero value가 설정된다. boolean은 false, integer는 0, float은 0.0, string은 "", pointer, function, interface, slice, channel, map은 nil로 초기화된다. 초기화는 재귀적으로 일어나는데, struct 배열의 각 요소 인스턴스에는 값이 주어지지 않으면 해당 .. 2022. 6. 17.
Error handling을 간단하게 - 출처: https://dave.cheney.net/2019/01/27/eliminate-error-handling-by-eliminating-errors - 개요 Go2는 오류를 처리할 때 오버헤드를 줄이는 방향으로 목표하고 있다. 오류를 처리할 때 향상된 문법보다 더 중요한것이 있는데, 그건 바로 오류를 처리할 필요가 없도록 하는것이다. 이 말의 의미는 "error를 다루는 코드를 없애라"는 의미가 아니라 "다루어야 할 오류가 많아 지지 않도록 코드를 변경하라"는 의미이다. 원문의 저자는 해당 글을 John Ousterhout's의 A philosophy of Software Design에서 영감을 받았다고 한다. - Example 1 아래 코드는 파일의 라인 수를 세는 코드이다. func Coun.. 2022. 6. 16.