728x90
728x90
SLA/SLO/SLI KPI(Key Performance Indicator) KPI 는 성공을 측정하는데 사용될 수 있는 메트릭이다. KPI 는 목표나 목적과는 다른, 목표를 달성하는 과정 중에 있는지 측정하는 메트릭이다. 따라서 수반하는 목표가 필요하다. 또한 KPI 를 모니터링하는 것은 목표를 달성하기 위해 필수적이다. SMART 법칙 Specific: KPI 는 구체적이어야 한다. Measurable: 모니터링하기 위해서 KPI 는 측정 가능해야 한다. Acheivable: 100% 는 성취하기 어렵다. Relevent: 관련있지 않은 KPI 는 목표 달성을 이끌어 낼 수 없다. Time-bound: 99% available-Per Year? Per month? Per day? 종류 Business..
아파치 카프카는 ActiveMQ, Artemis, RabbitMQ 와 유사한 메시지 브로커이다. 그러나 카프카는 특유의 아키텍쳐를 가지고 있다. 카프카는 높은 확장성을 제공하는 클러스터로 실행되도록 설계되었다. 그리고 클러스터의 모든 카프카 인스턴스에 걸쳐 토픽을 파티션으로 분할하여 메시지를 관리한다. RabbitMQ 가 거래소와 큐를 사용해서 메시지를 처리하는 반면, 카프카는 토픽만 사용한다. 카프카의 토픽은 클러스터의 모든 브로커에 걸쳐 복제된다. 클러스터의 각 노드는 하나 이상의 토픽에대한 리더로 동작하며, 토픽 데이터를 관리하고 클러스터의 다른 노드로 데이터를 복제한다. 각 토픽은여러 개의 파티션으로 분할될 수 있다. 이 경우 클러스터의 각 노드는 한 토픽의 하나 이상의 파티션(토픽 전체가 아니다..
유레카란? 마이크로서비스가 서로를 찾을 때 사용되는 서비스 레지스트리의 이름이다. 유레카는 마이크로서비스 애플리케이션에 있는 모든 서비스의 중앙 집중 레지스트리로 작동한다. 유레카 자체도 마이크로서비스로 생각할 수 있고 더 큰 애플리케이션에서 서로 다른 서비스들이 서로를 찾는 데 도움을 주는 것이 목적이다. 유레카의 역할 때문에 서비스를 등록하는 유레카 서비스 레지스트리를 가장 먼저 설정하는 것이 좋다. 서비스 인스턴스가 시작될 때 해당 서비스는 자신의 이름을 유레카에 등록한다. 동일한 이름을 갖는 서비스 인스턴스가 여러개 생성될 수 있다. 어느 순간 다른 서비스가 some-service 를 사용해야 할 때 이 때 some-service 의 특정 호스트 이름과 포트 정보를 other-service 코드에..
JDBC 트랜잭션 Spring 에서 JDBC 를 사용하여 트랜잭션을 사용할 수 있다. // 데이터베이스를 사용하기 위해 연결을 진행 Connection connection = dataSource.getConnection(); try (connection) { // Java 에서 데이터베이스 트랜잭션을 시작하는 유일한 방법이다. // setAutoCommit(false) 는 트랜잭션을 직접 관리할 수 있게 해준다. 개발자가 원할 대 커밋 또는 롤백이 가능 connection.setAutoCommit(false); // 쿼리문 작성 connection.commit(); // 커밋을 진행 } catch (SQLException e) { connection.rollback(); // 예외가 발생한 경우 롤백 }..
클러스터는 물리적 혹은 논리적으로 여러개의 리소스를 하나로 묶어서 사용하는 것을 뜻한다. 기본적으로 Docker 는 클러스터라는 기능은 없다. 도커 컨테이너들은 각각 따로 관리된다. 이를 하나로 한꺼번에 관리할 수는 없다. 이런 형태를 stand alone 이라고 부르며, stand alone 형태는 관리하기가 힘들다. 즉, 클러스터는 리소스를 하나로 묶어서 한번에 관리를 하는 것이다. 쿠버네티스 클러스터의 핵심 Control Plane Node Node(구 명칭 worker, Minions) Control Plane 과 Node 라는 VM 형태로 나눠진다. 즉 역할이 분리되는 것이다. Node 는 실제 컨테이너를 실행해준다. 즉, Node 안에 도커(podman, CRIO...)가 설치되있어야 한다. ..
Entity 클래스를 생성할 때, 주의할 것은 무분별한 setter 메소드 생성이다. 자바빈 규약을 생각하시면서 getter/setter를 무작정 생성하는데, 이렇게 되면 해당 클래스의 인스턴스 값들이 언제 어디서 변해야하는지 코드상으로 명확히 구분할수가 없어, 차후 기능변경시 정말 복잡해진다.해당 필드의 값 변경이 필요하면 명확히 그 목적과 의도를 나타낼 수 있는 메소드를 추가해야만 합니다. 예를들어 주문 취소 메소드를 만든다고 가정하면 아래 코드로 비교해보시면 될 것 같다. 잘못된 사용 public class Order{ public void setStatus(boolean status){ this.status = status } } public void 주문서비스의_취소메소드 (){ order.se..