일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- Helm V3
- http 413
- 윈도우키보드
- Golines
- 배포 프로세스
- body size
- goland
- Kubernetes
- AWS
- 배포 파이프라인
- Buffered channel
- elasticsearch
- 대규모 시스템 설계
- Logrus
- 티스토리챌린지
- GoF
- Infra
- 오블완
- gitops
- golang
- notification system
- 디자인패턴
- apollo router
- Intellij
- intellij ide
- go
- UnBuffered channel
- System Design
- 컴포지트패턴
- GoF 디자인패턴
- Today
- Total
목록Information Technology (301)
Fall in IT.
현재 필자의 시스템은 MSA로 구성되어있다. 그리고 각 마이크로서비스의 로그 기록은 Elasticsearch에 기록되고 있는데 그 방식이 조금 특이(?)하다.전통적인 EFK 시스템을 통해서 기록되는 것이 아니라 로그라이브러리를 통해 기록되고 있기 때문이다. 왜 로그라이브러리를 통해서 로그 데이터를 기록하게 됐는지, 각각의 장단점은 무엇인지 간략하게 설명하고자한다. 로깅 라이브러리를 통해서 Elasticsearch로 전송하는 방식장점구조 단순성Fluentd, Logstash와 같은 추가적인 로그 수집 레이어를 생략할 수 있다.애플리케이션과 Elasticsearch 사이의 연동만 설정하면 되므로 관리할 구성요소가 줄어든다.로그 장애 포인트는 Elasticsearch 하나로 줄어듬.유연성데이터 포맷을 애플리케..
로그 라이브러리 개선현재 나의 프로젝트에서 다양한 서버에서 로그를 기록하기 위해 로그 라이브러리를 사용하여 엘라스틱서치에 직접 데이터를 전송하고 있다.이 과정에서 동기적으로 동작하는 훅(Hook)을 통해 Elasticsearch에 로그를 기록하고 있었는데, 이로 인해 문제가 발생했다. Elasticsearch에 장애가 발생하거나 응답이 지연되는 상황에서, 로그 전송 작업이 API의 주요 처리 흐름을 가로막는 문제가 나타난 것이다. 결과적으로, 로그 라이브러리를 사용하는 모든 API에서 문제가 발생했고, 로그 전송이 API 응답 시간 초과를 유발하면서 시스템 전반에 장애가 발생했다.문제 요약로그 전송이 동기적으로 처리됨.엘라스틱서치 장애 시 로그 훅이 블로킹되어 API의 정상적인 동작을 방해.모든 API..
최근 연차를 보내던 중 QA 팀으로부터 서비스의 로그인 오류 문의를 받았다.문제의 원인을 조사하고 해결한 과정을 기록한다. 문제 상황QA 팀에서는 서비스 로그인이 되지 않는다고 보고했다.로그를 확인해 보니 API 타임아웃이 발생하고 있었다.원인 분석로그 기록 방식API 에러가 발생한 서비스는 로그를 로그 라이브러리를 통해 Elasticsearch에 기록하고 있었는데 동기적으로 기록하고 있었다.이 방식은 Elasticsearch에 문제가 생기면 API 요청이 지연되거나 실패할 수 있는 구조적 문제를 내포하고 있었다.Elasticsearch 상태 점검Elasticsearch는 실행 중이었으나 에러 로그가 기록되고 있었다.스토리지 상태를 확인한 결과, /usr/share/elasticsearch/data 디렉..
프론트엔드에서 발생한 HTTP 413 상태 코드 이슈 해결하기회사에서 일을 하던 중, 프론트엔드 개발자로부터 데이터를 생성하는 API를 호출할 때 HTTP 상태 코드 413 에러가 응답으로 반환된다는 이야기를 들었습니다. 이 상태 코드는 클라이언트가 서버에 보낸 요청의 body 크기가 서버가 허용하는 최대 크기를 초과했을 때 나타나는 HTTP 413 Payload Too Large 에러입니다.개발자로부터 받은 요청을 확인해 보니, 설정된 body size 제한보다 적은 크기의 요청이었고 서버 로그에도 해당 요청이 남아있지 않았습니다. 로컬 환경에서 같은 입력으로 테스트했을 때는 정상적으로 동작하는 것이 확인되었습니다. 그렇다면 문제는 서버가 아니라 클라이언트와 서버 사이의 다른 요소일 가능성이 있었습니다..
이 문서는 필자의 프로젝트에서 사용 중인 배포 파이프라인에 대해 설명합니다.배포 파이프라인은 Kubernetes, ArgoCD, AWS ECR 등의 클라우드 및 컨테이너 기술을 활용하여 애플리케이션을 효율적으로 배포하고 관리하기 위해 구성되었습니다.사전 지식ArgoCD란?ArgoCD는 Kubernetes 애플리케이션을 GitOps 방식으로 배포하고 관리하는 도구입니다. 애플리케이션의 선언적 설정 파일을 Git 리포지토리(혹은 OCI 레지스트리)에서 가져와서 Kubernetes 클러스터에 동기화하며, Git 상태와 클러스터 상태 간의 차이를 모니터링하여 자동화된 배포를 수행합니다.GitOps란?GitOps는 애플리케이션 배포 및 인프라 관리를 Git을 중심으로 수행하는 방법론입니다. 즉, 애플리케이션의 선..
안녕하세요.오늘은 맥 터미널에서(=키보드를 사용해서) Goland IDE를 실행하는 방법을 알아보겠습니다. 설정 방법1. 터미널에서 아래 경로로 이동 (/usr/local/bin)$ cd /usr/local/bin 2. goland 파일 생성$ touch goland 3. goland 파일에 아래 내용 입력#!/bin/shopen -na "GoLand.app" --args "$@" 4. goland 파일 권한 변경$ chmod +x /usr/local/bin/goland 결과goland 명령어를 사용하여 특정 경로의 프로젝트를 실행할 수 있다. 참조https://www.jetbrains.com/help/go/2024.1/working-with-the-ide-features-from-command-line..
안녕하세요. 오늘은 윈도우 PC용 키보드를 MAC에서 사용할때 편하게 사용하도록 설정하는 방법에 대해서 알아보겠습니다. 일반 키보드와 애플키보드의 차이점 애플키보드 - 컨트롤 / option(alt) / command 순으로 키보드가 배열되어 있습니다. (좌측하단에 키보드배열) 윈도우키보드 - 컨트롤 / 윈도우 / alt 순으로 키보드가 배열되어 있습니다. (여기서, 윈도우 키는 command키로 사용됩니다.) 키보드 배열을 동일하게 설정하는 방법 환경설정 > 키보드로 들어갑니다. 우측에 키보드 단축키를 클릭합니다. 좌측 하단에 보조키를 선택합니다. 해당 키보드를 선택합니다. option키는 command키로, command키는 option키로 서로 반대로 설정합니다. 완료! 모두 즐거운 코딩하세요~
고루틴과 채널을 활용한 이벤트 처리 시스템 Go 언어는 동시성(concurrency)을 간단하고 효율적으로 처리할 수 있는 강력한 기능인 고루틴(goroutines)과 채널(channels)을 제공합니다. 이들을 이해하고 올바르게 사용하는 것은 Go에서 효과적인 프로그래밍을 위해 필수적입니다. 이 글에서는 고루틴과 채널의 개념을 쉽게 설명하고, 블로킹(blocking)과 넌블로킹(non-blocking)의 차이를 설명한 후, 실제 예제 코드를 통해 설명을 더욱 구체화합니다. 고루틴과 채널의 개념 고루틴(Goroutines) 고루틴은 Go 런타임에 의해 관리되는 경량 스레드(lightweight thread)입니다. 고루틴을 사용하면 함수나 메서드를 동시에 실행할 수 있습니다. 고루틴은 go 키워드를 함수..
Go에서 의존성 역전 원칙(DIP) 활용하기현대 소프트웨어 개발 환경에서는 유연하고 유지 관리가 가능한 애플리케이션을 설계하는 것이 그 어느 때보다 중요합니다. 이를 달성하기 위한 한 가지 핵심은 객체 지향 설계를 안내하는 SOLID 원칙의 초석인 종속성 역전 원칙(DIP)을 이용하는 것입니다. 이 게시물에서는 DIP에 대해서 알아보겠습니다. 종속성 역전 원리란 무엇입니까?DIP의 핵심은 소프트웨어 모듈을 분리하는 것을 목표로 합니다. 이 원칙은 두 가지 주요 아이디어를 주장합니다.상위 모듈은 하위 모듈에 의존해서는 안 됩니다. 대신, 둘 다 추상화(인터페이스 또는 추상 클래스)에 의존해야 합니다.추상화는 세부사항에 의존해서는 안 됩니다. 오히려 세부 사항은 추상화를 따라야 합니다.DIP를 준수함으로써 ..
안녕하세요. 오늘은 Go 로깅라이브러리인 Logrus의 Hook 기능에 대하여 알아보겠습니다. Logrus란? Go 언어용으로 널리 사용되는 로깅 라이브러리이다. 확장성과 유연성을 제공하기 위해 Hook 기능을 사용할 수 있다. Hook이란? 훅 시스템을 통해 개발자는 로깅 프로세스에 추가적인 동작을 주입할 수 있다. 예를들어, 로그 메시지를 파일에 기록하는 동시에 오류 메시지를 Slack으로 전송하거나 로그 데이터를 Elasticsearch 같은 검색 엔진에 인덱싱할 수 있다. Hook 인터페이스 // logrus에 정의된 Hook 인터페이스 package logrus // A hook to be fired when logging on the logging levels returned from // `..