반응형

Study 76

Kafka를 이용한 실패처리 삽질 기록

이번 글에서는 Kafka DeadLetterQueue 관련하여 삽질했던 내용을 기록하는 글 입니다. 요구조건 1. 로직을 수행 중 실패할 경우 Repository에 데이터를 적재 2. 특정 주기마다 실패한 데이터를 처리 ( 실패하면 재처리 ) 결론 바쁘신 분들을 위해 결론부터 말씀드리자면 Kafka를 이용하여 특정 주기마다 데이터를 읽어와 처리하는 방법은 선택하지 않았습니다. 카프카는 실시간 데이터 처리 플랫폼 이유로는 카프카의 성격과는 맞지 않았습니다. 실시간 처리 플랫폼을 특정 주기마다 읽어온다는 것 자체가 어색하였습니다. 또한 다양한 시도를 통해 적합하지 않다고 생각하였습니다. 다양한 시도 RetryTemplate, ReplyTemplate, DeadLetterPublishingRecover 모두 ..

Study/message-queue 2022.06.09

[데이터 중심 어플리케이션 설계] 트랜잭션

이번 글은 데이터 중심 어플리케이션 설계 도서의 트랜잭션의 내용을 정리하였습니다. 들어가기 전에 데이터 시스템의 여러 가지 문제 데이터베이스 포스프퉤어나 하드웨어는 언제라도 실패할 수 있음 애플리케이션은 언제라도 죽을 수 있음 네트워크가 끊기면 애플리케이션과 데이터베이스의 연결이 갑자기 끊기거나 데이터베이스 노드 사이의 통신이 안될 수 있음 여러 클라이언트가 동시에 데이터베이스에 쓰기를 실행해서 다른 클라이언트가 쓴 내용을 덮어쓸 수 있음 클라이언트가 부분적으로만 갱신돼서 비정상적인 데이터를 읽을 수 있음 클라이언트 사이의 경쟁 조건은 예측하지 못한 버그를 유발할 수 있음 트랜잭션이란? 위와 같은 문제를 단순화하는 매커니즘으로 채택 애플리케이션에서 몇 개의 읽기와 쓰기를 하나의 논리적 단위로 묶는 방법 ..

Study 2022.05.12

[Kotlin] 테스트 코드 쉽게 작성하기 ( KotlinFixture, MockK, LiveTemplates )

개인적으로 테스트 코드는 중요하다고 생각합니다. 하지만 다양한 이유로 테스트 코드는 많이 Skip 됩니다. 시간적 여유가 없을 때 테스트 코드를 위한 노가다 작업이 많을 때 그 외 등등... 이 방법을 백퍼센트 보완하진 못하지만 좀 더 용이하게 작성하기 위해 제가 사용하는 방법을 공유합니다. 목차 MockK KotlinFixture Live Templates 1. MockK Java 진영에는 Mockito가 있다면 Kotlin 진영에서는 Mockk가 있습니다. Mockk는 Java에서 Mock처리하는 것과 동일하게 Kotlin스럽게 Mock을 처리할 수 있도록 도와줍니다. 환경구성 build.gradle.kts testImplementation 'com.ninja-squad:springmockk:{ver..

Study/test 2021.12.27

대규모 시스템 설계 - 채팅 시스템 설계

들어가기 전에 가상 면접 사례로 배우는 대규모 시스템 설계 기초 라는 도서 중 12장인 채팅 시스템 설계를 정리한 내용입니다. http://www.kyobobook.co.kr/product/detailViewKor.laf?mallGb=KOR&ejkGb=KOR&barcode=9788966263158 가상 면접 사례로 배우는 대규모 시스템 설계 기초 - 교보문고 2020년 출간 이후 아마존베스트셀러!아마존 컴퓨터네트워크응용 분야 베스트셀러 1위!《가상 면접으로 배우는 대규모 시스템 설계 기초》는 16가지 실제 시스템 설계 면접 문제와 상세한 답안을 www.kyobobook.co.kr 스터디 그룹에서 공유를 목적으로 작성한 글이기 때문에 이전 글과는 다르게 중요한 내용만 추려 작성하였습니다. ( PPT 방식 ..

Study 2021.12.07

Spring-Kafka Consumer 실패 시 재처리 ( Reply - @SendTo )

들어가기 전에 Consumer를 통해 카프카 클러스터에서 데이터를 Read할 때 모두 정상처리된다면 좋겠지만 그렇치 못한 경우도 있습니다. 그럴 경우 Spring-Kafka에서 재처리를 편리하게 할 수 있도록 Reply(@SendTo), Retry 기능을 제공합니다. 이번 글에서는 재처리 하는 방법에대해서 정리해보겠습니다. 목차 재처리를 해야하는 이유 ReplyTemplate 구성 @SendTo를 사용한 ReplyTemplate 구현 Reply 처리 플로우 1. 재처리를 해야하는 이유 Consumer를 이용해 카프카 클러스터에서 Read 한 후 Repository에 저장할 수도 있고 메일 발송을 할 수도 있고 다양하게 사용할 수 있습니다. 하지만 Repository 서버가 다운된다거나 메일 발송 중 메일..

Study/message-queue 2021.10.15

Spring-Kafka Consumer Offset 관리

들어가기 전에 Consumer를 AutoCommit을 false로 설정하고 사용하고 있습니다. Consumer에서 로직을 완료하고 partition에 commit을 처리하도록 작성하였습니다. 그런데 로직을 처리하던 중 Exception이 발생했고 partition에 commit을 하지 못했습니다. 그렇다면 이 Consumer는 무한 루프에 빠져 데이터를 계속 읽고 Exception을 계속 발생시킬까요? 정답은 NO! 입니다. Consumer 내부에서 Partition Offset과는 별개로 Consumer만을 위한 Offset을 관리하고 있기 때문입니다. Consumer Polling 방식 Consumer는 KafkaMessageListenerContainer에서 새로운 Thread를 생성하여 while..

Study/message-queue 2021.10.14

[엘레강트 오브젝트] 4-3장 final이나 abstract이거나

이 글은 엘레강트 오브젝트 새로운 관점에서 바라본 객체지향 도서를 보며 스터디한 글입니다. 책에서 주장하는 내용을 정리하였으며 예제들은 모두 코틀린 코드로 변환하여 작성하였습니다. 목차 잘못된 상속 클래스의 신분 올바른 설계 결론 1. 잘못된 상속 상속은 매우 강력한 기능입니다. 하지만 상속을 잘못 사용한다면 문제를 일으킬 수 있습니다. 문제를 일으키는 원인은 가상 메서드입니다. 코드로 살펴보겠습니다. open class Document { fun length(): Int { return content().length } open fun content(): String { // read document // load byte array return "" } } 위 코드와 같은 Document 클래스가 있..

Study/object 2021.10.13

Spring-Kafka Consumer Validation

모든 코드는 Github에 올려두었습니다. 들어가기 전에 Consumer는 Kafka에 Topic, Partition의 Record를 읽어오는 역할을 합니다. 하지만 Kafka에 잘못된 데이터가 들어오는 경우 Consumer에서는 데이터를 Validation 처리하여 올바른 데이터만 처리해야합니다. 이번 글에서는 Spring-Kafka를 사용하는 Consumer에서 어떻게 Validation 처리를 하는지 작성해보겠습니다. 목차 Validation 방식 Validation 구성 Consumer Validation 구현 Validation 테스트 @KafkaListener ErrorHandler 결론 Validation 방식 Spring-Kafka는 Version 2.2 부터 @KafkaListener의 ..

Study/message-queue 2021.10.12

[엘레강트 오브젝트] 4-2장 체크 예외(checked exception)만 던지세요

이 글은 엘레강트 오브젝트 새로운 관점에서 바라본 객체지향 도서를 보며 스터디한 글입니다. 책에서 주장하는 내용을 정리하였으며 예제들은 모두 코틀린 코드로 변환하여 작성하였습니다. 목차 Checked Exception vs Unchecked Exception 꼭 필요한 경우에만 예외를 잡자 항상 예외를 체이닝하자 단 한번만 복구하자 관전-지향 프로그래밍을 사용하자 하나의 예외 타입만으로도 충분하다 1. Checked Exception vs Unchecked Exception 두 Exception의 차이는 이 글을 참조해주세요. unchecked exception fun length(file: File): Int { if (!file.exists()) throw IllegalArgumentException..

Study/object 2021.10.06

[엘레강트 오브젝트] 4-1장 절대 NULL을 반환하지 마세요

이 글은 엘레강트 오브젝트 새로운 관점에서 바라본 객체지향 도서를 보며 스터디한 글입니다. 책에서 주장하는 내용을 정리하였으며 예제들은 모두 코틀린 코드로 변환하여 작성하였습니다. 목차 무너진 신뢰 빠르게 실패하기 vs 안전하게 실패하기 NULL 대안 주관적인 생각 1. 무너진 신뢰 이전 글에서 메서드 인자에 Null을 전달하는 것은 매우 안좋은 방법이라고 소개하였습니다. 마찬가지로 NULL을 반환하는 방법 또한 안좋은 방법입니다. class Page( val title: String? ) { fun title(): String? { if (title == null) { return null // null return } return "Elegant Objects" } } 위와 같은 Page 클래스가 있..

Study/object 2021.10.05

[엘레강트 오브젝트] 3-7장 인트로스펙션과 캐스팅을 피하세요

이 글은 엘레강트 오브젝트 새로운 관점에서 바라본 객체지향 도서를 보며 스터디한 글입니다. 책에서 주장하는 내용을 정리하였으며 예제들은 모두 코틀린 코드로 변환하여 작성하였습니다. 목차 인트로스펙션을 피하세요 캐스팅을 피하세요 정리 1. 인트로스펙션을 피하세요 타입 인트로스펙션은 리플렉션이라는 더 포괄적인 용어로 불리는 여러 가지 기법들 중 하나입니다. 리플렉션을 사용하면 메서드, 명령어, 구문, 클래스, 객체, 타입을 변경할 수 있습니다. 리플렉션은 매우 강력한 기법이지만 유지보수를 어렵게 만드는 안좋은 기법입니다. fun size(items: Iterable): Int { if (items is Collection) { return items.size } var size = 0 for (item in..

Study/object 2021.09.27

[엘레강트 오브젝트] 3-6장 부 ctor 밖에서는 new를 사용하지 마세요

이 글은 엘레강트 오브젝트 새로운 관점에서 바라본 객체지향 도서를 보며 스터디한 글입니다. 책에서 주장하는 내용을 정리하였으며 예제들은 모두 코틀린 코드로 변환하여 작성하였습니다. 목차 잘못된 의존성 주입 올바른 의존성 주입 정리 1. 잘못된 의존성 주입 잘못된 의존성 주입은 종종 치명적인 결과를 초래합니다. 코드로 살펴보겠습니다. class Cash( private val dollars: Int ) { fun euro() = Exchange().rate("USD", "EUR") * this.dollars } euro() 메서드 안에서 Excahnge 인스턴스를 생성하고 있습니다. 이 코드의 문제는 '하드코딩된 의존성'입니다. Cash 클래스는 Exchange 클래스에 직업 연결되어 있기 때문에, 의존성..

Study/object 2021.09.26

[엘레강트 오브젝트] 3-5장 절대 getter와 setter를 사용하지 마세요

이 글은 엘레강트 오브젝트 새로운 관점에서 바라본 객체지향 도서를 보며 스터디한 글입니다. 책에서 주장하는 내용을 정리하였으며 예제들은 모두 코틀린 코드로 변환하여 작성하였습니다. 목차 객체 대 자료구조 좋은 의도, 나쁜 결과 접두사에 관한 모든 것 1. 객체 대 자료구조 먼저 getter와 setter를 사용하지 말아야하는 이유를 알아보기 전에 객체와 자료구조에 대해서 짚고 넘어가겠습니다. 자료구조 class Cash( var dollars: Int ) // use val cash = Cash(20) // get val dollars = cash.dollars // set cash.dollars = 30 // print println("dollars:: ${cash.dollars}") 자료구조는 단순한..

Study/object 2021.09.25

[엘레강트 오브젝트] 3-4장 충성스러우면서 불변이거나, 아니면 상수이거나

이 글은 엘레강트 오브젝트 새로운 관점에서 바라본 객체지향 도서를 보며 스터디한 글입니다. 책에서 주장하는 내용을 정리하였으며 예제들은 모두 코틀린 코드로 변환하여 작성하였습니다. 목차 상태와 데이터 가변 객체와 불변 객체 정리 1. 상태와 데이터 이전 2.6 섹션에서 불변성에 다루었습니다. 이번 섹션을 정리하기 전에 다시 한 번 불변성에 대해 명확하게 정리하려고 합니다. 먼저 상태(state)와 데이터(data)에 대해서 명확하게 짚고 넘어가겠습니다. class WebPage( private val uri: URI ) { fun content(): String { // 외부 연동하여 웹페이지의 Content을 읽어 반환 return "" } } 상태: uri 데이터: content() 메서드를 호출하여..

Study/object 2021.09.18

[엘레강트 오브젝트] 3-3장 인자의 값으로 NULL을 절대 허용하지 마세요.

이 글은 엘레강트 오브젝트 새로운 관점에서 바라본 객체지향 도서를 보며 스터디한 글입니다. 책에서 주장하는 내용을 정리하였으며 예제들은 모두 코틀린 코드로 변환하여 작성하였습니다. 목차 객체를 존중하라 NULL Object를 이용하라 외부 영향 1. 객체를 존중하라 객체는 목표를 가지고 역할을 수행하고 있습니다. 하지만 객체의 인자값에 NULL을 허용한다면 객체가 역할을 수행하는 것을 무시하는 행위가 됩니다. // NULL 허용 fun find(mask: String?): Iterable { // 경로 탐색 // mask가 null일 경우 모든 파일 검색 // mask를 이용한 파일 검색 } // NULL 허용하지 않는 경우 fun find(mask: String): Iterable fun findAll..

Study/object 2021.09.17
728x90
반응형