전체 글
-
Zookeeper 클러스터 및 컨트롤러 선출Kafka 2021. 9. 19. 01:47
1) 서론 간단하게 zookeeper 3개의 서버를 실행시켜 클러스터로 만듭니다. 그리고 zookeeper에 등록되는 컨트롤러 브로커의 장애 발생 시 어떻게 되는지 살펴봅니다. +) 공부하는 입장에서 작성하는 "Hello World" 수준의 글입니다. 내용에 잘 못된 점이 있다면, 언제든지 댓글 남겨주세요! 2) Zookeeper zookeeper는 분산 애플리케이션들의 관리를 도와주는 역할을 합니다. 개발자로 하여금 비즈니스 로직에만 집중할 수 있게 하고, 클라이언트(kafka) 관리는 zookeeper가 대신해줍니다. 만약 zookeeper가 관리해주지 않는다면, 거대한 클러스터 애플리케이션의 설정과 동기화 등을 직접 관리해야 할 겁니다. kafka와 연동하여 서비스할 때 아래의 동작을 하게 됩니다...
-
Kafka 클러스터 구성 및 장애 해결Kafka 2021. 9. 12. 20:44
1) 서론 주키퍼(zookeeper) 1개 + 카프카(kafka) 3개 구성의 클러스터를 구성합니다. 학습에 목적을 두고 있기 때문에 최대한 간단한 클러스터를 구성했습니다. 이를 통해 카프카, 주키퍼의 설정 방식을 공부합니다. +) 학습과정의 블로그이므로, 오류는 댓글로 남겨주시면 감사히 수정하겠습니다! 2) Zookeeper 1대의 주키퍼 서버를 사용한다면, 더 설정할 것은 없습니다. 아래의 명령어를 통해 주키퍼를 먼저 실행합니다. $ bin/zookeeper-server-start config/zookeeper.properties or $ brew services start zookeeper 3) Kafka 카프카 브로커의 클러스터를 구성합니다. 우선, config/server.properties를 ..
-
첫 stackoverflow 질문을 남기다.Contribution 2021. 9. 2. 01:02
Kafka 관련하여 2주 정도 고민을 하고, 아무리 검색을 해봐도 답을 찾지 못했습니다. 그래서... 이 참에 처음으로 stackoverflow에 질문을 남겨봤습니다. 그리고 느낀 점을 간략히 기록합니다. 질문글 https://stackoverflow.com/questions/68987866/kafka-consumer-classnotfoundexception 1) 영어 저는 제가 영어를 잘하는 줄 알았습니다(?) 나름 캐나다에서 옷도 열심히 팔아봤고, 친구들도 사귀면서 문제없다고 생각했는데요... 막상 질문을 남기려고 영어를 작성하다 보니 헷갈리는 표현도 많고, 불필요하게 길어지기도 했습니다. 아무래도 축약할 수 있는 표현에 부족하기에 설명을 위한 문장이 길어졌습니다. 특히 말할 때는 문제가 없더라도, ..
-
(Kafka) 객체를 JSON 타입으로 넘겨보자Kafka 2021. 9. 1. 17:22
1) 서론 Kafka는 메시지 브로커를 이용해 서로 다른 프로젝트 사이에 메시지를 주고받을 수 있습니다. 이를 통해 비동기적인 처리를 할 수 있는데요. 메시지를 넘겨줄 때 int, string 등 타입을 지정해서 넘기는 것이 가장 간단한 방법입니다. 하지만 이러한 방식은 하나의 데이터 객체를 가지고 있더라도, 각각의 타입을 가진 직렬화 방식을 사용해야 합니다. 즉 개수도 많아지고, 어떤 목적으로 메시지를 전달하는지 명확히 파악하기 어렵다고 생각합니다. 그래서 모든 메세지 전달을 JSON 타입으로 통일하여 전달하고, 직렬화에 필요한 객체의 정의 방법을 기록합니다. 그리고 해당 과정에서 발생한 오류를 기록합니다. 아직 코린이 입니다. 혹시나 더 좋은 방법이나, 틀린점이 있다면 알려주세요. 2) 목적 사용자가..
-
(Java)primitive, reference 타입Java & Kotlin 2021. 8. 26. 18:28
1) 서론 primitive, reference 타입은 개발을 공부했거나 컴퓨터공학과 수업을 들었다면, 당연히 알 수 있습니다. 하지만 막상 면접 때 질문을 받으니 머릿속에서 정리가 안 되는 경험을 했습니다. "긴장을 했기 때문"이라는 좋은 핑계가 있지만, 아무리 긴장을 해도 그 순간 바로 대답하지 못했다는 것은 제대로 알지 못했기 때문이라고 생각합니다. 그래서 이번 기회에 제대로 한번 정리해보려고 합니다. 2) primitive type 먼저 늘 그렇듯 영어의 의미를 알아야 합니다. primitive는 "초기의, 원시의"라는 의미입니다. 자바 언어에서는 primitive는 사전에 정의된 예약 키워드입니다. 즉 그 말은 변수명, 메서드명 등으로 사용할 수 없습니다. 자바에서는 아래와 같이 8개의 prim..
-
JPA N+1 문제를 해결해보자Spring Framework 2021. 8. 20. 17:41
1) N+1 문제란? ORM은 객체의 관계를 연결하는데요. 이를 활용하는 JPA는 엔티티 기준으로 쿼리를 사용하고, 엔티티에 연관된 모든 객체를 조회합니다. 모든 연관된 객체를 조회 하기에 문제가 발생합니다. N개의 결과를 얻기 위해 DB를 조회했는데, 추가적으로 쿼리가 발생하는 것입니다. 즉 얻고자 하는 결과에서 1개가 더 붙어서 조회가 되는 현상입니다. 마트에서 하는 1+1 행사라고 생각하시면 됩니다. "파를 샀더니, 마늘을 주네? 근데 난 마늘 안 먹는데... 이걸 굳이 왜..?" 얻고자 하는 결과 외에 추가로 결과를 얻는다는 것은, 추가 쿼리가 발생합니다. 그만큼 성능적으로 손해 볼 수밖에 없습니다. 2) 전체 구조 // 애노테이션들 생략 했습니다. public class Post { privat..
-
Kafka, @Async 비동기 처리 맛보기Kafka 2021. 8. 16. 16:50
서론 이 글의 계기는 이렇습니다. 특정 게시글을 조회하고, 조회 수를 올려준다. 하지만 해당 게시글에 트래픽이 몰리고, 조회 수를 처리하는데 자원을 낭비해야 할까? 일단 글부터 보여주고, 조회 수는 천천히 반영해도 되지 않을까? 그래서 게시글을 조회 후 빠르게 사용자에게 보여주고, 조회 수는 Kafka, @Async를 사용해서 다른 서버에서 비동기로 처리하는 것이 더 좋지 않을까 생각했습니다. Hello World 수준의 예제입니다. 오류가 있다면 언제든지 댓글 남겨주세요! Kafka Kafka는 크게 producer, consumer, topic으로 이루어진 데이터 스트리밍 플랫폼입니다. (앞으로 producer: 생산자, consumer: 소비자로 부르겠습니다.) 생산자가 메시지를 만들어내고, 소비자..
-
[JPA, Redis]페이지별 결과 캐싱Spring Framework 2021. 8. 11. 17:45
1. 서론 Spring Data Redis와 JPA의 페이징을 이용해서 해당 결과를 캐싱하겠습니다. 2. JPA 페이징 2. 1. query 작성 @Query("from Post") Optional findAllPosts(Pageable pageable); 모든 게시물 목록을 조회합니다 Pageable 인터페이스를 파라미터로 받습니다 2. 2. Test @Test public void findPosts() { Pageable pageRequest = PageRequest.of(0, 10); List posts = postRepository.findAllPosts(pageRequest).orElseThrow(RuntimeException::new); posts.forEach(p -> System.out.p..