전체 글
Kafka Streams
kafka streams - kafka 에서 공식적으로 지원하는 라이브러리 토픽에있는 데이터를 낮은 지연률로 빠른 속도로 데이터 처리 가능 장점 1. 카프카와의 호환성 카프카의 버전정보에 대해 다른 툴들은 완벽한 호환성을 제공하지 않지만 카프카 스트림즈는 카프카 호환성을 걱정하지 않아도 된다. 유실과 중복 처리 방지에 대한 완벽한 기능을 제공하고 있다. 2. 스케줄링 도구가 필요없다 스파크 스트리밍과 연동해서 사용한다면 마이크로 배치 서비스를 구축 할 수 있지만 이를 위해 클러스터 관리자, 리소스 관리자가 필요하고 또한 서버들도 필요합니다. 하지만 Kafka Streams는 다른 것 필요없이 스트림즈 어플리케이션만 가지고 사용할 수 있습니다. 3. 스트림즈 DSL , 프로세서 API 제공 많은 기능들을 ..
kafka - Consumer
Consuemr는 데이터를 가져가도 kafka 내에서 데이터가 사라지지 않음 -> 아주 유용한 유연성을 제공 Consumer 의 역할 - topic의 파티션으로부터 데이터 polling - partition offset 위치 기록(커밋) - Consumer 그룹을 통해 병렬 처리 # 토픽 파티션에서 레코드 조회 prop - 옵션 설정 변수 group 1 - > 컨슈머 그룹 설정 consumer.subscribe - 읽을 토픽 설정 polling 루프 - poll 메서드가 포함된 무한 루프 poll() 설정한 시간동안 기다리고 데이터를 가져온다 이 때 데이터가 없다면 그냥 빈값을 반환 가장 작은 단위 : record # 파티션 - 그룹 단위 할당 파티션의 개수보다 컨슈머의 개수가 많아지면, 컨슈머는 놀게된..
kafka - Producer
토픽에 데이터를 생성하는 역할 특정 토픽으로 데이터를 publish (전송) 브로커에게 전송하며 처리 실패 / 재시도 라이브러리 명시에 버전을 주의할 것 - 모든 버전의 하위호환성이 완벽하지 않다. 프로듀서 생성 및 send 코드 bootstrap.servers 설정시 이 때 반드시 2개이상의 브로커정보를 넣어주는 것이 장애 발생시 대처가 가능하다. key 직렬화 - Byte array String, Integer Serializer 설정 가능 이 때 토픽에 메시지를 보내는 방법 2가지 key 를 포함하여 보내기 - key 값 기준 파티션 선정 중간에 파티션이 늘어나게 되면, 키에 대한 매핑이 깨지기 때문에 규칙이 깨진다. key 포함하지 않고 보내기 - RR 방식으로 전송 전송이 완료되면 .close(..
Kafka의 구조
특징 : 대용량 실시간 처리에 특화 기존의 메시지를 메모리에 저장하는 메시징 시스템과 달리 파일에 저장을 통해 재시작해도 메시지 유실 우려가 적음 컨슈머(Consumer)가 브로커(Broker)에게 메시지를 직접 가져가는 Pull 방식으로 동작 따라서 컨슈머의 처리 능력만큼 메시지를 가져옴 -> 최적의 성능 카프카의 구성 요소 # Topic / Partition topic : 카프카에 저장되는 메시지의 대분류 단위 (메시지를 구분하는 단위 - 파일시스템의 폴더) Partition : Topic 은 여러 patition 으로 나눠진다. ( 한 개의 토픽은 한 개 이상의 파티션으로 구성 - 메시지를 저장하는 물리적 파일) - (partition 내에는 상대적 위치의 offset을 통해 메시지의 위치 정보를 ..
equals 재정의
일단, 결론부터 얘기하자면 Object Class를 믿고, equals 꼭 필요한 것이 아니면 재정의하지 말자 그래도 반드시 재정의를 해야할 때가 있을 수 있으니 고려하고 준수해야할 사항들을 살펴보도록 하자. # 재정의하지 않는 것이 좋은지 다시 확인 재정의하지 않는 것이 최선인 상황들이 존재한다. 각 인스턴스가 본질적으로 고유할 때 ex) 동작하는 개체를 표현하는 클래스 - Thread 인스턴스의 논리적 동치성(logical equality)을 검사할 일이 없을 때 상위 클래스에서 재정의한 equals가 하위클래스에서도 적절하게 동작할 때 Constructor Set / List / Map 은 모두 AbstractSet / AbstractList / AbstractMap 으로부터 상속받아서 그대로 사용..
다 쓴 객체 참조 해제하기
자바에서는 가비지 컬렉터(GC)가 사용하지 않는 객체들에 대해서 메모리를 알아서 관리해준다. 먼저 가비지 컬렉션에 대해 간단하게만 짚고 넘어가보자 # GC (Garbage Collection) 힙 영역 내의 참조되지 않는 객체가 아닌 Reachability 라는 개념을 통해 도달되지 않는 객체를 메모리에서 해제하여 메모리 관리를 해준다. 가비지 컬렉션의 동작 방식 Heap 에서의 Young 영역과 Old영역은 서로 다른 메모리 구조기 때문에, 세부적으로는 가비지 컬렉터가 다르게 동작하지만, 기본적으로 가비지 컬렉션은 2가지의 공통된 단계를 거친다. Stop The World 가비지 컬렉션을 실행하기 위해 JVM이 실행중인 GC를 진행하는 쓰레드를 제외한 모든 쓰레드의 작업을 중단하여 애플리케이션의 실행이..
불필요한 객체 생성 피하는 방법
static boolean isRomanNumeral(String s) { return s.matches(" ... "); } # 정적 팩토리 메서드 방법 똑같은 기능을 제공하는 객체를 반복적으로 생성하는 것보다 객체 하나를 재사용하는 것이 더 효율적 /* 실행될 때마다 new 를 통해 새로운 인스턴스 생성 - 쓸데없는 String 인스턴스가 계속해서 생성된다. */ String s = new String("Xonmin"); /* 하나의 String 인스턴스 생성 JVM 안에서 이와 똑같은 문자열 리터럴을 사용하는 모든 코드는 같은 객체를 재사용하게 된다. */ String s = "Xonmin"; 생성자 대신 정적 팩토리 메서드를 통해 불변 클래스에서 불필요한 객체 생성 회피 가변 객체라고 해도 사용 ..
Request Mapping Handler Adapter
Spring MVC 에서 HTTP 메시지 컨버터의 동작 위치 애노테이션 기반의 컨트롤러, @RequestMapping을 처리하는 핸들러 어댑터 - RequestMappingHandlerAdapter에서 동작 # 전체 동작 개요 이 때 RequestMappingHandlerAdapter에서는 들어온 request에 대해서 어떠한 형식(파라미터, 애노테이션 정보)를 기반으로 ArgumentResolver가 전달 데이터를 생성 Controller 정보 - HttpServletRequest, Model, @RequestParam, @ModelAttribute, @RequestBody, HttpEntity 등 이후 ArgumentResolver가 전달해준 값을 RequestMappingHandlerAdapter가..