분류 전체보기

DevOps/Monitoring

AlertManager를 통해 슬랙으로 시스템 장애 알림 받기 - 모니터링 시스템 구축기 (3)

개요이전 글을 통해 서버와 Nginx, DB의 메트릭을 모두 수집하고 대시보드로 시각화하여 개발자가 모니터링 할 수 있도록 시스템을 구성하였다. 하지만 장애를 대비하기 위해서 대시보드만 볼 수는 없는 노릇이다. 컴포넌트의 이상이 있거나 다운이 될 경우, 슬랙으로 알림이 오도록 시스템을 보완해보자. AlertManager란AlertManager를 추가하여 알림 시스템을 구성할 것이다. 우리는 프로메테우스를 통해 특정 상황에 대한 알림이 발생하도록 규칙을 설정할 것이다. 프로메테우스가 메트릭을 수집하고 규칙을 평가해서 알림을 발생시킨다면, AlertManager는 해당 규칙을 누구에게 어떻게 보낼지 라우팅한다. 슬랙 웹훅 설정슬랙의 webhook은 해당 블로그 글이 정리가 잘 되어있어서 참고하였다. 슬랙..

DevOps/Monitoring

Exporter를 통해 DB와 프록시 서버 모니터링하기 - 모니터링 시스템 구축기 (2)

개요이전 글에서는 Prometheus & Grafana를 통해서 Spring 서버 어플리케이션의 메트릭을 수집하고 대시보드를 통해 조회할 수 있도록 시스템을 구성하였다. 이제 더 나아가 DB와 프록시 서버의 메트릭을 수집하고 모니터링 할 수 있도록 추가 구성해보자 Exporter란Exporter에 대해서 간단하게 알아보자.Exporter는 프로메테우스가 직접 메트릭을 수집할 수 없는 시스템의 메트릭을 수집하여 프로메테우스가 읽을 수 있는 형식으로 변환하고 노출해주는 에이전트이다.각 시스템에서는 고유하게 메트릭을 내려주는데, 시스템에 맞는 Exporter가 메트릭을 조회하고 프로메테우스에 형식에 맞게 변환하여 엔드포인트로 제공해준다. 프로메테우스에서는 Exporter에서 제공하는 엔드포인트를 통해 알맞게..

DevOps/Monitoring

Prometheus & Grafana를 통한 메트릭 모니터링 시스템 구축하기 - 모니터링 시스템 구축기 (1)

개요회사에 합류하여 곧장 어드민 페이지와 모니터링 시스템 구축 업무를 맡게 되었다. 서비스가 이제 막 출시된 상태에서 운영을 위해서는 두 시스템 모두 중요하며, 특별히 모니터링 시스템을 통해 서버가 여러가지 방면으로 이상은 없는지 확인할 수 있고, 큰 일이 발생하기 전 예방할 수 있다. 이번 글에서는 서버 메트릭 모니터링 시스템을 구축하는 과정을 공유해보려 한다. 메트릭이란?메트릭이란 무언가를 측정하기 위한 기준이나 지표를 말한다. 그렇다면 소프트웨어에서 메트릭은 상태를 나타내는 수치를 말하며, 예로 CPU 사용률이나 서버 응답 평균 시간, 에러 발생 횟수 등이 있을 것이다.메트릭을 실시간으로 수집함으로써, 서버의 상태를 체크하고 장애 시 대응 혹은 예방할 수 있을 것이다. 목표현재 서버는 이중화되어..

Spring

[Spring] @Scheduled를 통한 스케쥴러 구현 시 주의할 점

개요Spring에서는 @Scheduled 어노테이션을 통해 간편하게 스케쥴러 기능을 구현할 수 있다. 주기적으로 특정 로직을 수행하거나, 특정 시간에 작업을 예약해서 기능을 실행시킬 수 있다. 정말 편리한 기능이지만, 여러가지 부딪힌 이슈들이 있기에 공유해보려 한다. 설정설정 클래스에 @EnableScheduling 어노테이션을 사용하여, @Scheduled 어노테이션을 사용할 수 있다.@Configuration// 스케쥴링 기능 활성화@EnableSchedulingpublic class SchedulerConfig { } @Scheduled을 통한 스케쥴링 작업 실행일정 주기로 작업을 실행하고 싶다면 @Scheduled 어노테이션에 fixedDelay 옵션을 통해 주기를 입력해주면 된다.@Com..

Spring

[Spring] @EventListener를 통해 도메인 간 결합 끊기

개요서비스가 커질수록 하나의 비즈니스 동작의 여러 부수 효과를 동반하게 된다.예를 들어 DDD로 설계된 어플리케이션에서 회원가입을 하면 환영 이메일 발송 및 쿠폰 지급 등 회원 관련 서비스에서 다양한 도메인이 경계를 넘나들게 되어 결합성이 높아지게 된다. Spring Event는 결합성을 낮추고 복잡성을 해결하기에 가장 간단하면서도 효율적인 방법 중 하나이다. Spring Event 구조와 동작Spring Event는 애플리케이션 내부의 PUB/SUB 패턴으로 동작한다. 이벤트 발행을 통해 도메인의 상태의 변경을 알리고, 해당 이벤트에 대한 구독자가 이벤트에 반응하는 구조이다. Spring Event의 구조는 이벤트 객체, Publisher, Listener 세 가지로 구성되어 있다.이벤트 객체는 도메..

Spring

[Spring] @Async를 통해 비동기로 작업 처리하기

개요Spring의 @Async 어노테이션은 메서드를 비동기적으로 실행할 수 있게 해주는 강력한 기능이다.스레드를 통해 비동기 방식으로 로직을 처리하여, 시간이 오래 걸리는 작업을 백그라운드에서 수행할 수 있다. @Async 사용 이점ThreadPoolExecutor를 직접 사용하지 않고 @Async를 사용할 때 얻을 수 있는 이점은 정말 많지만 가장 큰 이점을 뽑자면 코드의 간결성이다. //1. ThreadPoolExecutor 사용public void sendEmail(String email) { executor.execute(() -> { try { // 비동기로 실행할 로직 } catch (Exception e) { log.er..

Language/Java

[Java] Virtual Thread 부셔보기

개요 - 기존 스레드의 한계Java의 전통적인 동시성 모델은 Thread per Request 모델로 요청에 대해 하나의 스레드를 할당한다. 해당 요청 처리가 끝날 때 까지 스레드가 점유된다. 문제는 JVM의 스레드(Platform Thread)는 OS 스레드와 1:1로 매핑되며, 스레드 당 메모리를 1~2MB 점유하므로 비용이 비싸다.서버의 자원은 한정되어 있기에 요청이 늘어난다고 해도, 수천 개 이상의 스레드를 생성하기에는 한계가 있다.또한 JVM의 스레드는 I/O 블로킹이 발생하면, 작업이 완료될 때까지 다른 요청을 처리할 수 없다. 동시 요청이 스레드 풀 크기를 초과하게 되면 나머지 요청은 대기할 수 밖에 없고 병목이 될 수 있다. Virtual Thread는 이러한 한계를 극복하고 처리량을 늘릴..

Language/Java

[Java] Callable과 Future & CompletableFuture

개요자바는 스레드를 통해 작업들을 병렬적으로 처리할 수 있다.하지만 Runnable 인터페이스를 통해 작업을 제출하게 되면, 반환값을 받을 수 없다는 단점이 있다.Executor 프레임워크는 이러한 문제를 해결하기 위해 Callable과 Future라는 인터페이스를 도입했다. 이전 글에 이어지는 내용이다. Runnable vs Callablepublic interface Runnable { void run();}Runnable 인터페이스는 반환 값이 없으며, 예외를 던질 수도 없다. public interface Callable { V call() throws Exception;}Callable 인터페이스는 값을 반환할 수 있으며, 예외를 던질 수 있다. Callable과 Future 사용class ..

Language/Java

[Java] 자바 스레드 풀과 ExecutorService

개요스레드 생성 과정은 간략하게 아래와 같은 과정이 이루어진다.메모리 할당 -> 시스템 콜(커널 모드 전환) -> 운영체제에서 스레드 생성 -> 운영체제 스케쥴러 관리 -> 작업이 완료되면 스레드 종료스레드 생성 과정은 너무 무겁다.또한 서버의 자원은 한정되어 있기에, 스레드를 무한하게 생성할 수도 없다. 스레드 풀을 이용하면 스레드들을 미리 만들어서 보관해놓고 생성 과정을 일부 생략하여 작업을 빠르게 진행시킬 수 있으며, 최대 스레드 수를 설정하여 서버의 자원을 초과하지 않도록 할 수 있다. Executor 프레임워크자바에서는 Executor 프레임워크를 통해 스레드 풀 관리를 간단하고 효율적으로 처리할 수 있다. public interface ExecutorService extends Execut..

Etc

동기/비동기 & 블로킹/논블로킹

개요동기와 비동기, 블로킹과 논블로킹, 많이 들어본 용어이지만 가끔씩은 헷갈린다.어떤 기준으로 나뉘었는지 알아보고 이 두 종류 조합도 알아보자. 동기와 비동기동기와 비동기를 나누는 기준은 '작업들을 순차적으로 수행하는지'에 대한 관점이다.동기는 작업을 순차적으로 수행하고, 비동기는 작업들이 순서에 상관없이 수행된다. 블로킹과 논블로킹블로킹과 논블로킹을 나누는 기준은 '작업의 제어권을 어떻게 처리하느냐'에 대한 관점이다.다른 말로 '현재 진행중인 작업이 block 되느냐 안되느냐'이다.A 작업이 B 작업을 호출할 때 제어권을 A가 B에게 넘기게 되어서 A 작업이 중단된다면, 해당 상황은 블로킹이다.반대로 A 작업이 B 작업을 호출해도 제어권을 A 작업이 그대로 갖고 있어 작업이 중단되지 않는다면, 해당..

kkang._.h00n
'분류 전체보기' 카테고리의 글 목록