본문 바로가기

728x90

Work

[리뷰] 일상 속 사물이 알려주는 웹 API 디자인 #1 누구나 사용하고 있고 다들 잘 알고 있을 것이라 생각하고 있어서 너무나 중요하지만 가끔 소홀하게 되는 것들이 있다. 나에게 있어서는 API가 바로 그런 것들 중 하나였다. API를 개발하고 있는 개발자이기 때문에 API에 대해 잘 모른다는 것을 인정하기 싫었고 시간들여 공부하는 것 조차 기본도 모르는 것 처럼 여겨질까봐 잘 하지 않았던 것 같다. 이해도가 낮은 상태로 개발 업무에 들어가다보면 시작은 빠르지만 기능이 점점 확장되면 기존 API를 사용하지 못하는 지경에 이르게 된다. 게다가 API의 내용이 일반적이지 않고, 사용하기 어렵기 때문에 API를 사용하는 사용자들이 API 사용 방법에 대한 문의가 자주 왔었다. 이런 문제들이 반복되다보니 요즘에는 Back to the basic이라는 문장을 계.. 더보기
[리뷰] 클라우드 핀옵스 회사 업무와 개인 프로젝트 모두 클라우드를 적극 사용하고 있고, 그 중에서도 AWS에 의존도가 높다. AWS를 사용하다보면 나도 모르게 새어나가는 비용이 있기 마련인데 책을 읽으며 회사에서 사용하고 있는 리소스들을 살펴보니 불필요하게 비용을 지불하고 있는 것이 꽤 많았다. 곰곰히 생각해보니 회사에서 운영하는 리소스의 경우에는 내 개인돈이 나가지 않기 때문에 타이트하게 비용을 관리하지 않는 경향이 있는 듯하다. 얼마전 개인 프로젝트를 진행하며 실수로 SSH Port를 any open하고 다음 날이 되어서야 발견했던 적이 있었다. 그 사이 해커들의 공격으로 해당 서버에 굉장히 많은 트래픽이 몰렸고, 이로 인한 비용 증가가가 꽤 컸다. (대략 20만원정도) 다행히 AWS에 문의하여 지원을 받긴 했지만 내 개인.. 더보기
[IDE] Goland 컴파일 시 already exists and is not an object file 에러 Goland 2020.3 (2020.11.25) 버전으로 업데이트 이 후 최초 컴파일에는 성공하지만 이 후부터는 이미 존재한다는 오류와 함께 컴파일에 실패하는 경우가 반복되었다. 해결하기 위해 아래와 같이 Ctrl + Shift + A를 클릭 후 표시되는 Actions 입력창에 Registry라고 입력한다. 아래 그림과 같이 "go.build.output.path.cache.enabled" 항목을 찾아 체크 표시를 해제 한다. 이 후 빌드 수행 시 실행 파일을 캐시하지 않기 때문에 해당 오류는 발생하지 않는다. 다만 캐시를 하지 않으면 빌드 실행 속도 개선의 이점을 잃게 되므로 다음 버전 업데이트 시에 다시 체크하고 실행을 해서 테스트해봐야할 듯 하다. 더보기
[Go언어] API 서버간 내부 통신 시 too many open files 문제 다수의 API 서버를 실행 중이고, 각 서버간에는 주기적으로 상호 통신을 실행하고 있다. 이 때 일정 시간이 경과하면 아래와 같은 오류가 발생하면서 먹통이 되는 현상이 발생하였다. dial tcp: lookup 127.0.0.1: too many open files 먼저 메시지 내용 처럼 현재 얼마만큼의 파일이 Open 되었는지 확인해보기 위해 아래와 같이 lsof 명령을 사용하였다. lsof | wc -l 문제가 발생한 대상 API 서버에서 too many open files 발생 시 file open 수는 17141개 였는데 재시작 후 6994로 감소하였다. 이로 인해 프로세스 실행 후 문제가 발생한 시점까지 대략 10147개의 file open이 추가된 것으로 추정되는 상황이다. (다른 프로세스로 .. 더보기
[리뷰] 스파크 완벽 가이드 개발 업무를 진행하면서 서비스를 런칭 했을 때 사용자들의 행위나 서비스가 제공하는 각 기능에 대한 가치를 파악하기 위해 데이터 분석을 해보고 싶다는 생각을 항상 해왔었다. 이 전에는 게임 서버 개발 진행과 병행하여 엘라스틱서치를 도입해 데이터 분석을 위한 준비를 했었고, 서비스 런칭 후 이를 통해 사업부와 협업하여 사용자 행위 지표에 대한 다양한 차트를 만들어보기도 했었다. 이로 인해 생각지 못했던 아이디어가 떠오르기도 하고, 업데이트 된 기능에 대한 사용자들의 반응을 바로바로 확인할 수 있어서 굉장히 큰 도움이 되었었다. 이 때의 경험을 계기로 어떤 개발을 할 때는 항상 데이터 분석도 함께 해보려고 노력하고 있다. 얼마전에는 본 업무와 별개로 사이드 프로젝트를 진행하며 데이터 분석을 해보기도 했다. 이.. 더보기
[k8s] kube-prometheus #1 - 설치 Amazon EKS를 사용하면서 초기에 Kubernetes 모니터링을 위해 Container Insights를 사용하였으나 500개 이상의 Custom Metric이 CloudWatch에 추가되면서 많은 비용이 발생하게 되었다. 비용 절감을 위해 Container Insights에서 현재는 Prometheus로 변경을 진행하였고, Prometheus를 간단하게 설치 할 수 있는 CoreOS의 kube-prometheus를 사용하였다. CoreOS에서 제공하는 kube-prometheus를 사용하면 Prometheus를 간단하게 설치할 수 있고, 설치 절차는 다음과 같다. 1. Git clone git clone https://github.com/coreos/kube-prometheus.git 2. 의존성.. 더보기
[k8s] DaemonSet 실행 시 Pending 문제 DaemonSet으로 Pod를 실행하면 각 워커노드에 Pod가 하나씩 실행이 되는데 특정 노드에서만 Pending이 발생하는 현상이 있었다. example-9sz7d 1/1 Running 0 3d16h 10.0.62.16 ip-10-0-38-38.ap-northeast-2.compute.internal example-d7jf6 1/1 Running 0 3d16h 10.0.110.150 ip-10-0-96-136.ap-northeast-2.compute.internal example-gdkpk 1/1 Running 0 3d16h 10.0.113.194 ip-10-0-126-203.ap-northeast-2.compute.internal example-jt2lv 1/1 Running 0 3d16h 10.. 더보기
[Go언어] for 루프에서 포인터 사용 시 동일 객체 참조 문제 문제 아래와 같이 for 루프를 사용했다. for _, data := range sampleDataSlice { GetStore().storeOne(&data) } 위 코드를 실행하면 저장된 모든 데이터가 동일한 값을 가지게 된다. 원인 위 코드에서 sampleDataSlice는 slice 이기 때문에 for 루프의 변수로 인덱스와 현 루프의 객체를 변수에 할당한다. 이 때, 인덱스를 사용하지 않고 그 뒤의 변수를 사용하게 될 경우 변수에는 슬라이스에 포함된 현재 요소가 지역 변수에 할당된다. 그러므로 변수에 할당되는 값은 계속 변경되지만 storeOne 함수로 전달되는 변수의 주소는 동일하기 때문에 storeOne 함수 안에서 사용한 변수는 결과적으로 제일 마지막에 지역변수에 할당했던 객체를 동일하게 .. 더보기

728x90