프로젝트
-
우리는 왜 spring kafka batch listener를 활용하지 않나요?프로젝트/kafka 2024. 12. 1. 23:38
개요신규입사자분께서 우리는 왜 kafka message를 consume 할 때 batch listener를 활용하지 않는지, 그 선택에서 어떤 히스토리와 결정이 있었는지 물으셨습니다. 단건씩 메시지를 받지 않고 batch listener를 활용하여 한번에 여러 건의 메시지를 받으면 네트워크 레이턴시를 아낄 수 있을 것 같다는 의견을 주셨습니다. 질문 주신 내용이 합리적인 생각이라는 들었지만 batch listener에 대한 지식이 없었기 때문에 why에 답변을 할 수 없었습니다. 그에 대한 답을 찾기 위한 여정을 기록해보고자 합니다. Batch Listener란?@Beanfun myContainerFactory(): ConcurrentKafkaListenerContainerFactory { val..
-
spring kafka auto-commit 동작원리 : 데이터 유실과 중복처리프로젝트/kafka 2024. 10. 13. 14:52
대상 독자spring kafka의 auto-commit 동작원리를 알고 싶으신 분들 auto-commit을 활용할 때 데이터 유실과 중복처리를 제어할 수 있는 방법을 알고 싶으신 분들 개요많은 블로그들을 살펴보면 kafka consumer의 옵션 중 하나인 auto-commit은 일정주기로 commit을 수행하기 때문에 메시지의 중복 및 유실이 발생할 수 있다고 설명합니다. 일정주기로 자동으로 commit을 수행한다는 것은 메시지가 처리되는 중간에도 commit이 일어날 수 있을 것 같습니다. 만약 auto-commit을 활성화한다면 내부적으로는 어떤 일이 일어날까요? 이번 글에서는 spring kafka에서 auto-commit이 어떻게 동작하는지 알아보고 이 과정에서 데이터 유실과 중복처리를 어떻게..
-
Redis Cluster + Spring Boot + Lettuce client 이론과 세팅프로젝트/redis 2024. 8. 5. 00:00
Redis Sentinel이란? Redis Cluster를 알아보기 전에 간략하게 Redis Sentinel에 대해서도 알아보겠습니다.만약 Redis Cluster를 활용하지 않는다면 대안으로 자동으로 failover를 지원하는 Redis Sentinel을 활용해 볼 수 있습니다.마스터가 더 이상 사용할 수 없다는 사실에 여러 Sentinel이 합의하여 Slave 중 하나를 Master로 승격시키고 기존의 Master는 Slave로 강등시킵니다. 단순히 하나의 Sentinel에서 네트워크 문제로 Master와 연결되지 않을 수 있으므로 특정 quorum 이상에서 다운되었다고 인지한 경우 장애 조치를 진행합니다. Redis Cluster란 무엇일까?Redis Cluster는 N개의 마스터 노드를 활용하여 ..
-
분산락을 위한 Redis RedLock 톺아보기프로젝트/redis 2024. 7. 20. 20:42
분산락이란?분산락은 여러 개의 분산된 서버가 존재할 때 동일한 데이터에 대한 동기화를 보장하기 위해 사용하는 락의 종류 중 하나입니다. 분산락을 활용하면 서로 다른 서버들이 critical section 실행을 동시에 하지 못하도록 방지할 수 있습니다. 이때 MySQL의 네임드락, Zookeeper 등을 활용해서 분산락을 구현할 수 있는데 Redis의 RedLock 알고리즘을 활용하여 분산락을 구현할 수 있습니다. Redis가 다운되는 경우?단일 인스턴스를 활용하여 분산락을 구현할 수 있지만 이는 단일 실패점이 될 수 있습니다. 단일 실패점을 극복하기 위해서는 Master - Slave구조를 선택할 수 있습니다. 하지만 Slave로의 복제는 비동기이므로 아래와 같은 상황에서 race condition이..
-
MongoDB Replication이란?프로젝트/mongoDB 2024. 3. 2. 00:01
개요 공식문서를 기반으로 MongoDB Replication에 대해 알아보는 시간을 가져보고자 합니다. Replication이란? Replication은 복제라는 뜻을 가지며 컴퓨터 과학에서는 데이터 저장과 백업을 하는 방법과 관련이 있습니다. 기존 데이터를 중복으로 여러 개 복제해 둠으로써 단일 데이터베이스의 데이터에 문제가 생기는 상황에 장애 내결함성을 제공합니다. 또한 데이터가 여러군데 복제되어 있으므로 읽기 작업 또한 여러 군데 데이터베이스에서 수행할 수 있습니다. 즉, 읽기 성능이 증가할 수 있습니다. Primary와 Secondary Replication을 수행하면 데이터베이스가 N개가 되며 여기서 하나의 데이터베이스를 Primary 그 외의 것들은 Secondary라고 부릅니다. Primar..
-
MongoDB 인덱스 운영법프로젝트/mongoDB 2024. 2. 22. 00:01
개요 공식문서를 기반으로 MongoDB의 인덱스의 운영법에 대한 알아보는 시간을 가져보고자 합니다. 기존에 존재하는 컬렉션에 인덱스 만들기, 인덱스 사용 측정법, 인덱싱 전략에 대해 정리해보고자 합니다. 기존에 존재하는 컬렉션에 인덱스 만들기 기존에 존재하는 컬렉션에 인덱스를 만들기 위해서는 인덱스가 내부적으로 어떻게 생성되는지 이해해야 Live(Production) 레벨에 나가있는 상용 데이터베이스에 문제가 발생하지 않을 수 있습니다. MongoDB 인덱스는 내부적으로 어떻게 생성될까요? MongoDB 4.2부터 인덱스가 생성되는 처음과 끝에 메타데이터 변경을 보호하기 위해 exclusive lock을 잡는 최적화된 빌드 프로세스를 사용합니다. (빌드 프로세스의 시자과 끝에서만 잠금이 유지되어 효율적이..
-
MongoDB 인덱스란?프로젝트/mongoDB 2024. 2. 15. 00:01
개요 공식문서를 기반으로 MongoDB의 인덱스를 알아보는 시간을 가져보려고 합니다. 인덱스 생성법, 인덱스의 타입, 인덱스의 속성에 대해 정리해보고자 합니다. 인덱스란? 인덱스는 쿼리의 효율적인 실행을 지원합니다. 인덱스가 없을 경우에 쿼리 결과를 반환하기 위해 컬렉션의 모든 문서를 스캔해야 합니다. 하지만 적합한 인덱스가 존재하면 스캔하는 문서의 수를 줄일 수 있습니다. 인덱스는 읽기 작업의 성능을 향상시키지만, 쓰기 작업에는 성능에 부정적인 영향을 미칩니다. 즉, 읽기와 쓰기의 비율을 잘 고려해서 적용해야 합니다. MongoDB의 인덱스는 내부적으로는 B-Tree 데이터 구조를 활용합니다. 기본적으로 지원하는 인덱스 _id 필드에 고유 인덱스를 생성하며 해당 인덱스는 삭제할 수 없습니다. 인덱스 만..
-
Spring Boot + Kotlin + MongoDB로 CRUD 해보기프로젝트/mongoDB 2024. 2. 12. 00:01
개요 Spring Boot + Kotlin + MongoDB를 활용하여 CRUD를 수행해보고자 합니다. 만약 MongoDB에 대해 잘 모르겠다면 "MongoDB란?"이라는 글을 참고하시고 오셔도 좋을 것 같습니다. 실제 코드는 github을 참고해 주세요. 환경 Spring Boot 3.1 JDK 17 MongoDB with Docker Gradle 의존성 추가 implementation("org.springframework.boot:spring-boot-starter-web") implementation("org.springframework.boot:spring-boot-starter-data-mongodb") web와 mongodb에 대한 의존성을 추가해 줍니다. docker-compose.yml v..