본문 바로가기

전체 글

(155)
부하테스트 오픈소스: Locust Locust는 부하테스트 중에 하나이다. 부하테스트의 종류는 nGrinder, Apache Jmeter 등 다양한 툴들이 존재하지만, 그중에 좀 간단해보이고 UI가 괜찮은(?) Locust를 사용해봤다. 설치 설치는 간단하다. 단, 파이썬 3.6이상 버전이 깔려있어야한다. $ sudo pip3 install locust 스크립트 작성 테스트 스크립트을 파이썬으로 작성해야한다. 파이썬을 잘모르지만, 공식문서를 참고하여 간단한 health-check를 하는 스크립트를 다음과 같이 작성했다. import time from locust import HttpUser, task from locust.user.wait_time import constant class QuickstartUser(HttpUser): wa..
Axon Framework (Command와 Event 구현) 저번 글(https://jobc.tistory.com/223)에서 Axon Framework의 전체적인 개념을 간단히 알아봤다면, 이번에는 실제로 구현을 해보며 학습한 기록을 남긴다. Spring Boot와 Axon Framework Axon Framework는 Spring Boot와 친화적이다. 따라서 다양한 어노테이션을 지원하고, 간단하게 의존성 추가로 Axon를 사용할 수 있다. implementation("org.axonframework:axon-spring-boot-starter:4.5") Command 구현 메세지 종류 중에 Command 메세지를 발행해보고 핸들러까지 구현해본다. Command Gateway Command Gateway는 Command 메세지 통로 역할을 수행한다. @Auto..
Axon Framework란? Axon Framework란? Axon Framework란 EventSourcing, CQRS, DDD 세가지 Concept을 중심으로 어플리케이션을 개발할 수 있게 도와주는 프레임워크이다. 따라서, Axon Framework를 사용하기 위해서는 Event Sourcing, CQRS, DDD 세가지의 개념을 숙지하는 것이 중요하다. 여기서는 Axon Framework가 주요 내용이므로, 이 세가지 개념은 정말 간단히 정리할 것이다. 위 그림을 보면 명령을 호출하고, DB에 저장한다. DB에 저장을 하는 동시에 상태 변화 이벤트를 발행한다. 이벤트가 발행되면 한개 이상의 이벤트 핸들러가 이벤트를 처리한다. Event Sourcing ? 이벤트 소싱이란 정말 간단히 말해, 상태 변경이 일어나는 이벤트를 그대..
ELK 로그시스템 구현하기 - 2 (With Nginx & SpringBoot & Docker) https://jobc.tistory.com/221 ELK 로그시스템 구현하기 - 1 (With Nginx & SpringBoot & Docker) 로컬에서 Nginx와 Spring Boot의 로그를 ES쌓는 파이프라인 ELK을 구현해본다. Spring Boot Application을 Docker로 띄우기 첫번째 스텝은 Nginx와 Spring Boot를 Docker로 띄어 통신이 되는지 확인한다. Spring B.. jobc.tistory.com 로컬에서 80포트로 curl을 날림 Docker Nginx가 요청을 받고 8080포트로 리버시프록시 Docker Spring Boot App이 요청을 받고 응답 위 글에서 3단계를 진행했다. 이제 서버가 띄어졌으니 여기에 본격적인 로그 시스템을 구축한다. Ng..
ELK 로그시스템 구현하기 - 1 (With Nginx & SpringBoot & Docker) 로컬에서 Nginx와 Spring Boot의 로그를 ES쌓는 파이프라인 ELK을 구현해본다. Spring Boot Application을 Docker로 띄우기 첫번째 스텝은 Nginx와 Spring Boot를 Docker로 띄어 통신이 되는지 확인한다. Spring Boot는 단순 응답만 하는 간단한 프로젝트를 생성했다. Spring Boot의 jar파일이 현재 작성할 Dockerfile과 같은 디렉토리에 있다는 전제하에 Spring Boot를 띄울 Dockerfile은 다음과 같다. FROM java:8 EXPOSE 8080 COPY ./application.jar application.jar CMD ["java", "-jar", "application.jar"] Docker 내부에서 jar파일을 실행..
[Kubernetes] Pod의 종료 사이클과 Graceful Shutdown (with nginx & spring boot) 눈에 보이지 않는건 언제나 검증이 어렵고 이해하기 힘들다. Kubernets의 경우 로그 파악하기가 쉽지도 않고, 자동으로 처리해주는 것이 많아 이해하기 어려웠다. Kubernetes의 Pod 종료 사이클과 Spring Boot, Nginx의 Graceful Shutdown을 이해한대로 정리해보자. 쿠버네티스 환경에서는 많은 이유로 충돌이 발생하고, 때때로 Auth Scaling으로 Pod이 늘어나고 줄어드는 경우가 허다하다. 따라서 이러한 쿠버네티스 환경에서 Pod이 Graceful하게 종료되는 것은 중요하다. Graceful Shutdown에 관한 내용은 여기서 확인할 수 있다. Kubernets 환경에서의 Graceful Shutdown 내가 만약 로컬이나 EC2와 같은 서버에 Spring Boot..
Graceful Shutdown (with nginx & spring boot) Graceful Shutdown ? 정확한 개념에 대해서는 말들이 많지만, 간단히 말해서 현재 들어온 요청을 모두 수행하고 우아하게(?) 종료된다는 개념이다. 예를 들어, 내가 어떠한 상품을 구매하기 위해 결제 요청을 했고, 서버가 결제를 처리하고 있는데, 뭔지 모르는 이유로 서버가 종료될 때 이미 처리하고 있는 결제 요청은 모두 처리하고 종료된다는 것을 의미한다. Graceful Shutdown을 이해하기 위해서는 SIGTERM, SIGKILL에 대한 이해도 필요하다. SIGTERM과 SIGKILL의 이해를 돕기 위한 유명한 그림이 있다. SIGTERM은 위 그림처럼 자식에게 가기 전에 인사할 시간을 준다. 쉽게 말해, 서버에게 종료될 시간을 주는 것이다. SIGKILL은 위 그림처럼 인사할 시간도 안..
Rust Ownership (Rust만의 특별한 메모리 관리법) Ownership은 Rust만의 특별한 메모리 관리법이다. 모든 프로그램은 실행중인 동안에 어떤 방법으로든 컴퓨터의 메모리를 관리해야한다. 어떤 언어는 GC를 이용해서 사용하지 않는 메모리를 찾아 지속적으로 해제해준다. 또 다른 언어는 프로그래머가 직접 메모리를 할당하고 해제하며 관리한다. Rust는 Ownership이라는 Rust만의 특별한 메모리 관리법을 사용한다. 쉽게 말해서 개발자 입장에서는 GC보다 복잡하지만 더 성능이 뛰어난 GC(?)라고 보면 된다. (C, C++로 주로 개발하던 개발자는 Rust Ownership에 혁신을 느낄 것이며... GC로 동작하는 언어에 익숙하던 개발자는 오히려 개발할 땐 불편함을 느낄 수 있다) 하지만 중요한 포인트는 GC의 런타임 도중 발생하는 오버헤드의 리스크..