모놀리식 아키텍처에서 이벤트 기반으로 비즈니스 로직의 원자성 확보하기 (2)
·
Project
이번 포스팅은 이전 포스팅에 이어서 코드로 구현하는 과정을 담았습니다.구현 목표모놀리식 아키텍처에서 MSA로 전환하는 작업의 초석이 되도록 서비스 간 결합도를 낮추기외부 API 호출 응답을 받으면 이벤트를 발행하는 방식으로 서비스 간 결합도를 낮춥니다.`편지 서비스`는 `처리율 제한기 서비스`에 대한 의존성을 제거하고, 편지를 저장하는 책임만 집니다.`답장 서비스`는 `외부 API 호출 서비스`에 대한 의존성을 제거해 트랜잭션에서 분리하고, 답장을 저장하는 책임만 집니다.다만, 데이터베이스에 저장하는 로직은 하나의 트랜잭션에서 처리할 수 있도록 상위 계층에서 편지와 답장을 저장하도록 설계합니다. ⇒ 이벤트 발행의 주체를 퍼사드 서비스로 구현합니다.이벤트에 상태(Status)를 추적할 수 있도록 하기Spr..
모놀리식 아키텍처에서 이벤트 기반으로 비즈니스 로직의 원자성 확보하기 (1)
·
Project
이 포스팅에서는 프로젝트에서 기존 비즈니스 로직의 문제점을 확인하고, Spring Events를 활용해 비즈니스 로직을 원자적으로 처리하는 내용을 다룹니다. 제목에 "모놀리식 아키텍처"를 붙인 이유는 MVP 개발부터 채택한 모놀리식 아키텍처를 그대로 유지하면서 최소한의 변경으로 문제를 해결하는 과정을 강조하기 위함입니다.현재 서비스 규모가 작고, 이용자 수가 많지 않은 상황에서 오버 엔지니어링을 하지 않고 개선해 보겠습니다.문제의 발단: 클로바 스튜디오 서비스의 장애1월 13일 오후 9시 45분경 클로바 스튜디오에 장애가 발생했습니다.우리 서비스의 첫 MVP였던 달토의 답장 서비스는 클로바 스튜디오에 의존하고 있었는데, 팀에서는 10시 30분이 지나서야 장애 발생을 인지했습니다. 문제 발단은 클로바 스튜..
Spring Event Deep Dive
·
Spring
Spring EventSpring Framework에서 제공하는 이벤트(Event) 객체가 있습니다.이 객체는 `ApplicationContext`가 제공하는 기능의 일부인데요, Spring에 내장된 이벤트들을 이용해 특정 상황에서 원하는 동작을 수행하도록 개발할 수 있는 기능입니다.Spring Event 동작 원리동작 과정이벤트는 하나의 쓰레드에서 동작합니다. 즉, 동기적으로 동작합니다.한 쓰레드 내부에서 발행자가 이벤트를 발행(publish)하면 수신자가 이벤트를 수신(listen)하여 이벤트를 처리합니다.이벤트 발행자(Event Publisher)a. ApplicationEventPublisher 에서 이벤트를 발행한다.실제로 이벤트를 발행하는 코드를 작성할 땐 `ApplicationEventPub..
루씬(Lucene) 검색 엔진의 구조 (FST, Burst Trie, 역 인덱스)
·
ElasticSearch
ElasticSearch는 아파치 루씬(Apache Lucene)이라는 검색 엔진 라이브러리를 활용해 분산 환경에서의 고성능 검색 기능을 제공한다.고성능 검색 기능은 루씬(Lucene)의 저수준 API를 조립해 REST API로 제공하는 것인데, 루씬은 어떤 방식을 사용하길래 대용량 데이터를 디스크에서 빨리 읽을 수 있는 걸까? 루씬의 구조를 파악해 보자.사전 지식 1. 역 인덱스역 인덱스는 위의 이미지처럼 Hash Table로 되어있지 않지만 단어(Term)로 문서의 아이디를 찾을 수 있는 자료구조라고 이해하자.사전 지식 2. 루씬은 최소 단위로 세그먼트를 사용한다.루씬(Lucene)은 색인의 최소 단위로 세그먼트(segment)를 사용한다. 다시 세그먼트는 여러 문서(Document)로 되어있는데,..
ElasticSearch 역 인덱스(Inverted Index)
·
ElasticSearch
Token, TokenizingTokenizing: 문서(document)에 포함된 텍스트를 특정 기준(예시에선 공백)으로 나누는 것을 말한다.Token(또는 Term): 토크나이징에 의해 나눠진 문자열 덩어리 하나를 토큰(또는 Term)이라고 부른다.Inverted Index위의 설명에서 1번 문서(Document 1)에 포함된 "Hello I am yelly"를 토크나이징한 결과가 "Hello", "I", "am", "yelly"라는 토큰으로 분리되었다. 마찬가지로 2번 문서(Document 2)에 포함된 "Hello You are jelly" "Hello", "You", "are", "jelly"라는 토큰으로 분리되었다. 색인이때 토큰과 문서 정보(Document ID)를 매핑해서 저장한 자료구조..
ElasticSearch 7.8부터 사용하는 Index template과 Component template
·
카테고리 없음
2025.01.10 - [ElasticSearch] - ElasticSearch 클러스터 설정과 인덱스 설정 변경하기 ElasticSearch 클러스터 설정과 인덱스 설정 변경하기클러스터 API설정 변경ElasticSearch 클러스터의 설정은 클러스터 API인 `/_cluster/settings`로 변경할 수 있습니다.클러스터 API는 클러스터 전체에 설정을 적용할 때 사용하는데, 아래 예시처럼 `persistentdev-gallery.tistory.com이전 포스팅에서 살펴봤던 인덱스 설정은 API를 통해 변경했습니다.만약 인덱스가 생성될 때마다 API를 통해 설정하려면 꽤나 번거롭습니다.ElasticSearch는 이 번거로움을 해결하기 위해 template API를 제공하는데요, 기존 templat..
ElasticSearch Cluester API & Index API - 클러스터 설정과 인덱스 설정 변경하기
·
ElasticSearch
클러스터 API설정 변경ElasticSearch 클러스터의 설정은 클러스터 API인 `/_cluster/settings`로 변경할 수 있습니다.클러스터 API는 클러스터 전체에 설정을 적용할 때 사용하는데, 아래 예시처럼 `persistent`, `transient` 필드를 포함해 JSON 포맷으로 요청을 보냅니다. (두 필드 중 하나만 입력할 수 있습니다.)PUT /_cluster/settings{ "persistent": { "cluster.routing.allocation.node_concurrent_recoveries": 4 # 동시에 복구할 노드 수 }, "transient": { "cluster.routing.allocation.enable": "new_primaries" #..
2024년 Real MySQL 1권 + 2권 스터디 기록, 그리고 회고
·
MySQL
학습 범위 및 체크Real MySQL 1권완료 - 4장. 아키텍처 (InnoDB 부분만)완료 - 5장. 트랜잭션과 잠금완료 - 8장. 인덱스완료 - 9장. 옵티마이저와 힌트완료 - 10장. 실행 계획Real MySQL 2권완료 - 11장. 쿼리 작성 및 최적화완료 - 12장. 확장 검색완료 - 15장. 데이터 타입완료 - 16장. 복제완료 - 17장. InnoDB 클러스터스터디 기간1권 (5장, 8장): 2024년 9월 22일(일) ~ 10월 6일(일)2권 (11장, 15장): 10월 27일(일) ~ 11월 10일(일)1권 (9장): 11월 17일(일) - 스터디 종료11월 17일 이후 개인 스터디로 전환스터디 방식각자 README 작성 ⇒ 퀴즈 출제 & 퀴즈 풀기 ⇒ 스터디 모임 종료 후 개인 스터디퀴..