🔗 Distributed System
SAGA 패턴, JTA 트랜잭션
마이크로서비스 아키텍처를 도입하면 시스템은 점점 더 작고 독립된 서비스들의 집합으로 나뉘게 됩니다. 하지만 이로 인해 트랜잭션 처리는 복잡해집니다. 단일 DB 트랜잭션으로는 처리할 수 없는 문제가 발생하죠. 이 글에서는 마이크로서비스 환경에서 트랜잭션을 다루는 대표적인 방식인 Saga 패턴과 JTA를 비교하고, 코레오그래피 기반의 Saga 구현 방식도 함께 살펴보겠습니다.SAGASaga는 여러 개의 로컬 트랜잭션을 순차적으로 실행하면서 전체 작업을 처리하는 방식입니다. 각 단계가 성공하면 다음 단계로 넘어가고, 실패하면 이미 성공한 단계들에 대해 보상 트랜잭션(compensating transaction)을 실행합니다. @Servicepublic class OrderSagaService { @Aut..
부하 테스트로 알아본 적절한 DB 선택(RDBMS, OpenSearch, MongoDB)
기존에 NoSQL은 정규화가 필요하지 않은 데이터를 효율적으로 저장하거나 조회하기 위해 OpenSearch, MongoDB 등을 선택할 수 있다고 생각했습니다.실제로 이 것에 관해 Json 타입의 데이터를 어디에 넣을지 고민한 글도 있습니다. 물론 이 말도 틀린 말은 아닙니다.하지만 이번에 DB에 대한 부하 테스트를 해보면서 NoSQL을 선택할 더 중요한 이유를 찾게 되었고 단순히 데이터의 형태에 따라 DB를 결정하는 것이 아닌 기능 요구 사항에 따라 적절한 DB를 어떻게 선택할 수 있을지 고민할 수 있게 되어서 글을 작성합니다. 일단 거두절미하고 바로 결과를 보겠습니다.부하 테스트 결과부하 테스트는 K6로 진행했으며 5초마다 유저 사용량이 100명씩 증감되어 총 100~500명이 25초 동안 이용하는 ..
[Kafka] Kafka Streams 사용법
개요Kafka Streams를 사용하면 특정 시간동안 Kafka에 인입되는 데이터를 집계해서 통계치를 추출할 수 있습니다.토픽에 있는 데이터를 빠른 속도로 실시간으로 변환하여 다른 토픽에 적재할 수 있는 것이 기본 동작 방식입니다.아래 예제 코드는 깃헙에 올려놨습니다.기본 코드아래는 /a라는 메소드 요청에 대해 시간 별로 요청 건 수를 통계화해서 /b로 확인하는 코드입니다.결과만 보면 /a라는 메소드는 14시에 2번, 15시에 4번 이용했다는 의미가 됩니다.@RestController@RequestMapping("/api")@RequiredArgsConstructorpublic class ApiController { private final ApiService apiService; @PostM..