목록KimJinHwan/Project (16)
ecsimsw
배경 소개 팀에서 새로 인프라 구조, 아키텍처를 구성해야 하는 일이 있었다. 우리 팀은 Container 기반으로 서버를 운영하여, AWS ECS + Fargate를 사용하여 배포하기로 결정했다. 이때 VPC, ECR, ECS의 배포 정책이나 오토 스케일링을 모두 Terraform으로 관리하여 인프라 구성을 코드로 작성할 수 있도록 작업하였다. 이 글에선 이런 구조를 선택한 근거와 함께, 테라폼을 사용해서 얻을 수 있었던 팀 시점의 이점을 소개하려고 한다. ECS + Fargate우선 컨테이너를 사용한 배포를 전제로 하였다. 배포를 위한 파일 관리보다 컨테이너 이미지 관리가 훨씬 쉽고, 컨테이너 런타임만 있는 환경이라면 쉽게 배포하고 앱을 확인해 볼 수 있으니까. AWS의 '이 글'을 참고하여 우리 팀에..
이벤트 전달 구조 개선회사의 기기 이벤트 전달 구조를 SNS+SQS 조합으로 개선한 경험을 소개한다. 기존에는 아래 그림에서 Event producer가 Http로 각 서비스에 이벤트를 전달했는데, 기기가 늘어남에 따라 많아진 이벤트를 빠르게 처리할 수 있으면서도 유실에 안정적인, 그러면서도 서비스 확장에 유연한 아키텍처를 고민하게 되었다. 작은 팀이니만큼 러닝 커브가 적고, 인프라 비용에 큰 부담이 없었으면 좋겠다는 생각이었다. 이벤트 전달 구조 / SQS 도입 이유1. 직접 전달, 이벤트 유실과 의존 문제 Http 직접 전달은 위험하다. 수신하는 서버에 문제가 발생하는 경우, 그 시간 동안 직접 전달된 이벤트는 유실된다. 또 전송자는 수신하는 서버의 정보를 모두 알아야 하기 때문에, 수신 서비스가 늘..
OOM 발생기기 이벤트를 수신하여 후처리 하는 서버에서 OOM이 발생하고 있다. 특정 시간대에서 스파이크성 트래픽이 발생하는 것은 아니고, 서버를 실행하고 N시간 후에 OOM과 함께 서버가 다운된다. 이 글에선 해당 문제를 모니터링했던 방법과 원인, 해결 방안을 정리한다. 원인 파악메모리 누수 파악 서버의 힙 메모리와 GC 동작 기록이다. 위 보드의 노란색이 Old Gen, 아래 보드의 파란색과 녹색이 각각 Minor GC, Major GC이다. GC 동작 이후에도 Old Gen의 최저 수위가 점점 높아지는 것을 볼 수 있다. Major GC의 처리 대상이 되지 못하는 누수가 계속 쌓이고 있고, 결국 Old gen이 메모리를 가득 채워 OOM이 발생하게 된다. OOM에 메모리 누수를 예상했지만서도, 다른..
파일업로드 속도 문제현재 'FE -> BE -> S3' 으로 사진을 업로드하고 있는데, 큰 패킷 전달이 두번이다 보니 업로드 속도가 너무 느리다. S3 업로드가 아니라 애초에 사이즈가 큰 요청이 오가는 시간 자체가 느린 것을 부하 테스트로 확인했다. 1MB 파일, 100명의 동시 요청 테스트에서 단순히 서버에서 MultipartFile 로 첨부 파일을 응답 받는 것만으로 응답 평균 시간은 200ms 가 걸렸다. 클라이언트에서 직접 S3 업로드파일 전달에 필요한 비용을 낮추고 서버의 요청 처리 속도를 개선하기 위해 클라이언트에서 직접 S3에 사진을 업로드한다. 프론트엔드에서 백엔드 서버로 이미지 파일이 전송되는 비용을 아낄 수 있다. 허용된 path에, 허용된 용량만큼만 업로드 할 수 있도록 S3 Pre..
미리 보기 컨트롤러에 @ShutDown 어노테이션을 추가하고 임시 응답을 어떻게 전달할지를 지정해주는 것으로 ShutDown 조건에서 해당 컨트롤러 아래 모든 핸들러의 임시 응답을 자동으로 생성해 준다. 위 예시에서 DailyCountRepository 타입의 빈이 존재하지 않으면 /api/counts 를 GET 요청하는 경우 아래와 같이 응답한다. HTTP status : 503, SERVICE_UNAVAILABLEContent type : application/jsonMessage : This API is currently unavailable. 아래 사용 방법이나 버전, 기능은 현재 글을 쓰는 첫 배포 시점을 기준으로 한다.최신 변경 사항은 https://github.com/ecsimsw/api-..
JNI-JellyBean-HBE-SM5-S4210하드웨어 드라이버를 수정하고, 안드로이드 커널에 포함/빌드하여, 보드 내 임베디드 하드웨어를 제어한다. JNI를 이용하여 시스템 콜을 호출, JVM 환경 안에서 수정된 드라이버로 하드웨어를 제어한다. Concepts 1. BootLoader PC에서 전원이 켜지면 ROM의 BIOS가 로드되고, BIOS는 미리 설정된 부팅 순서대로 저장 장치의 부트로더를 로드, 실행하게 된다. 부트로더는 하드웨어를 초기화하고, 커널을 메모리에 적재하는 것으로 운영체제가 구동된다. 저장 장치가 다수인 PC와 달리, ARM 임베디드 시스템에선 단일 플래시 메모리에 BootLoader, Kernel 이미지, 사용자 파일과 App Storage가 존재한다. 이런 임베디드 시스템의 ..
Web server with socket API Socket API를 이용하여 Http 형식의 요청을 처리, 응답할 수 있는 웹 서버를 제작한다. github : https://github.com/ecsimsw/multiplexing-server Steps 1. Socket API를 구현한 간단한 Socket Server를 제작한다. - Socket server를 구현하고 client 연결, 메시지를 처리한다. - Http 요청, 응답 포맷을 확인하고 Socket Server가 이를 해석, 처리, 반환할 수 있도록 한다. - Jsoup을 이용하여 html 파일을 변환, 사용자의 접근에 따른 동적인 페이지를 반환한다. 2. Multi-Threading을 이용한 비동기 요청 처리를 구현한다. 3. Selec..
클릭 위치가 부채꼴 안에 포함되어 있는지 알고 싶어요! 옆 회의실에서 '프롤로그'팀이 수학 문제 푸는 거를 보고 재밌어 보여 나도 참여해보았다. 라이브러리 없이 직접 확률에 따른 사잇각을 구하고 영역 클릭시 해당 내용을 확인할 수 있는 기능을 구현 중이었고, 사용자 클릭 이벤트가 주어졌을 때 그 좌표가 해당 영역에 포함되어 있는지 확인할 수 있는 로직이 필요했다. 1. 클릭 범위 확인 우선 클릭할 수 있는 범위가 맞는지를 확인했다. 아래 그림에서 빨간색으로 표시한 부분을 말한다. 간단히 작은 원보다 밖에 있고, 큰 원 안에 있는지를 확인하면 된다. 2. 각도 확인 이번에는 좌표가 A 영역 부채꼴 안에 포함되었는지를 확인할 것이다. 영역 시작 선을 a, 영역 끝 선을 b이라고 한다. x축과 a가 이루는 각..