분류 전체보기 308

StickyPartitioner를 사용할 때 메시지가 골고루 배분되지 못하는 현상

[Overview] Apache Kafka Client 2.4 ~ 3.2 버전에서는 크게 3가지의 파티셔너가 제공된다. - RoundRobin (Key 해싱 X) - Sticky (Key 해싱 X) - Default (Sticky + Key 기반 해싱 보장) StickyPartitioner: https://jaemni.tistory.com/entry/Sticky-Partitioner 이 때 Sticky 파티셔너를 사용했을 때 특정 파티션에 메시지가 몰리는 현상이 있다고 한다. 이에 대해 확인해보고, 직접 재현해본 내용을 다룸. (이 문제로 인해 Apache Kafka 3.3 버전에서는 기존 파티셔너들이 Deprecated되고, BuiltInPartitioner가 신규로 등장하였다) [이슈] 문제 제기: ..

Kafka 2023.01.04

Logstash로 MSSQL - Redis 파이프라인 구성해보기

목차 [개요] MSSQL의 데이터를 Redis로 Sync하고 싶은데, 이 때 logstash를 활용해보려고 한다. update일자를 기준으로 최신데이터가 INSERT되거나 UPDATE되면 이를 logstash가 감지해서 Redis에 계속해서 업데이트해주는 파이프라인을 구축해보는 것이 목표. [로컬 세팅: Docker container로 MSSQL, Redis 구동] Kafka도 활용할 수 있을 것 같아 Kafka도 추가해놓았다. https://github.com/sjm767/docker-compose-storage/blob/main/docker/mssql-redis-sync/docker-compose.yml GitHub - sjm767/docker-compose-storage: 상황별로 필요한 docke..

Kafka Topic Naming Convention에 대해..

카프카에서의 화두 중 하나는 카프카 토픽의 이름을 어떻게 짓는것이냐이다. 보통 많은 회사들이 기존의 토픽명의 관습에 따라 많이 짓는다고 한다. 아래와 같은 네이밍 규칙이 권장된다. .. -- ... 그리고 chris riccomini는 아래와 같은 네이밍 규칙을 사용하기도 했다고 한다. .. [카프카에서 유효한 토픽명] 카프카에서는 '_', '-', '.' 이며 아래 정규식이 카프카에서 사용할 수 있는 토픽명이다. 하지만 '_','-' 등을 혼용해서 사용할 경우 충돌이 날 수 있기 때문에 혼용하지 않도록 해야한다. legalChars = "[a-zA-Z0-9\\._\\-]" 또한 토픽명은 대소문자를 구분한다. [카프카에서 토픽명을 정할 때 몇가지 지침들] 토픽명의 포맷을 정해라 가장 중요한 것은 포맷을 ..

Kafka 2022.12.13

Service란?

[Kubernetes의 Services란?] 쿠버네티스 공식 페이지의 설명: 파드 집합에서 실행중인 애플리케이션을 네트워크 서비스로 노출하는 추상화 방법 용어집 | Kubernetes 용어집 kubernetes.io 즉, "pod들의 서비스를 외부로 노출하기 위한 방법" 정도인데, 그렇다면 pod의 IP를 직접 노출하면 되지 않을까 라는 생각이 들 수도 있다. 하지만 pod의 경우 휘발성이라 다운되고 새로운 pod이 올라올 경우 새로운 IP를 할당받아 구동되게 된다. 그러므로 pod의 IP를 직접 외부로 노출하는 방법은 잘못되었고, 서비스를 통해 고정된 IP로 접근할 수 있도록 하는 방법이다. 예제: Flink의 Admin Web UI를 서비스를 통해 외부로 노출 Apache Flink의 예제를 보면 J..

Kubernetes 2022.12.06

ConfigMap이란?

[ConfigMap이란?] Key-Value 형태로 기밀이 아닌 데이터를 저장하는 데 사용하는 API오브젝트. 앱을 배포하다보면 DEV, PROD와 같이 환경별로 다른 변수값을 사용하는 경우가 있다. 앱의 이미지는 같지만 이러한 변수값이 차이가 나는 경우 다른 컨테이너 설정을 통해 배포하는 것은 매우 비효율적일 수 있다. 이럴 때 ConfigMap을 사용해서 값을 넣어놓고, 환경별로 다른 설정정보를 읽어오도록 처리할 수 있다. 즉, 컨테이너에서 필요한 환경 설정 내용을 컨테이너와 분리해서 제공해주기 위한 기능. [ConfigMap의 종류] Literal ConfigMap을 yml파일에 정의하거나 CLI를 통해 직접 생성하는 방법 kubectl create configmap [configmap 이름] --..

Kubernetes 2022.12.06

Apache Kafka Client 2.4 이상 버전의 RoundRobin Partitioner에서 메시지가 골고루 분배되지 못하는 현상

[문제점] Apache Kafka Client 2.4 버전이상에서 RoundRobin Partitioner를 사용할 경우 partition 메소드가 두 번 호출되면서 메시지가 파티션에 골고루 분배되지 못하는 현상이 있다. [버그 재현: 메시지 4개를 생성하기] //RR 파티셔너 사용 props.put(ProducerConfig.PARTITIONER_CLASS_CONFIG, RoundRobinPartitioner.class); ... KafkaTemplate kafkaTemplate = new KafkaTemplate(new DefaultKafkaProducerFactory(props)); ObjectMapper obj = new ObjectMapper(); //forloop를 통해 메시지 4개를 생성 f..

Kafka/Producer 2022.12.03

Sticky Partitioner

[개요] Apache Kafka 2.4 버전 이후부터 사용가능한 파티셔너이다. 기존에는 RR방식으로 동작했는데, 이 방식에 대한 단점이 있어 이를 보완한 방법 [파티셔닝?] Kafka의 메시지는 key/value 의 형태로 구성된다. 이 때 key값이 있을 수도 있고, null값으로 존재할 수도 있다. 그리고 producer는 batch.size, linger.ms 옵션을 통해 메시지를 바로 보내지 않고 배치에 일정기간 저장했다가 보내는 특성을 가진다. Key값이 있는 경우 modular 연산을 통해 어떤 파티션에 메시지가 적재될지 결정한다. Key값이 없는 경우 기존에는 RR 방식을 사용하여 메시지를 파티션에 배분했다. 아래 그림은 1~9 까지의 메시지를 생성했을 때 RR정책에 의해 파티셔닝 된 모습 ..

Kafka/Producer 2022.12.03

Kubernetes에 Apache Flink 구성해보기

[준비] 윈도우에서 WSL2 설치하기: https://gaesae.com/161#google_vignette 윈도우10 WSL2 설치하기, WSL2 우분투 설치하기 WSL이란? Linux용 Windows 하위 시스템을 사용하면 개발자가 기존 가상 머신의 오버헤드 또는 듀얼 부팅 설정 없이 대부분의 명령줄 도구, 유틸리티 및 애플리케이션을 비롯한 GNU/Linux 환경을 수정하 gaesae.com 우분투(WSL2사용 )환경 기준으로 진행하였다. kubectl 설치: https://kubernetes.io/docs/tasks/tools/install-kubectl-linux/ Install and Set Up kubectl on Linux Before you begin You must use a kubect..

팩토리 메소드 디자인 패턴

[팩토리 메소드 디자인 패턴이란] 객체지향 디자인 패턴중 하나. 상위클래스에 알려지지 않은 구체화된 클래스를 생성하는 패턴이며, 하위클래스가 구체화된 클래스를 생성하도록 하는 것. 기존 코드를 수정하지 않고, 새로운 인스턴스를 여러방법으로 생성할 수 있는 "확장에 열려있고 변경에 닫혀있는 객체 지향 원칙"을 지킬 수 있는 패턴. 이러한 원칙을 만족하는 이유는 제품과 제품을 생성하는 팩토리가 느슨한 결합 구조를 가질 수 있기 때문. 추상화와 다형성을 통해 이를 실현한다. 동일한 인터페이스를 통해 구현된 객체들은 다형성을 이용하면 코드의 수정을 최소화할 수 있기 때문에 느슨한 결합을 가져갈 수 있는 것. [코드 수정이 최소화 될 수 있는 이유] 객체를 생성하는 코드 부분을 분리 시켰기 때문에 객체를 추가 수..

Java/객체지향 2022.11.26

mysql-replicator를 활용한 MySQL - Elasticsearch Sync

MySQL에 적재되는 데이터를 Elasticsearch에 복제하여 사용하려는 요구가 있다. 다양한 방법이 있는 듯하다. logstash input - jdbc plugin output - elasticsearch plugin fluentd input - mysql-query, mysql-prepared-statement etc.. output - elasticsearch 이 중 fluentd에 mysql-replicator가 있어서 이 부분에 대해서 구동해본 내용 정리. [mysql-replicator?] github: https://github.com/y-ken/fluent-plugin-mysql-replicator GitHub - y-ken/fluent-plugin-mysql-replicator: F..

MSA에서 Outbox Pattern에 대해

[개요] MSA 환경에서 마이크로서비스들이 RBMS환경과 메시징 서비스를 결합하여 처리하는 경우가 많다. 우리의 경우 결제 서비스등이 해당될 수 있는데 결국 메시징 서비스 + RDBMS 형태로 결합되어 서비스 될 것이다. 예를 들어, 주문 서비스의 경우 크게 2가지의 이벤트로 구분할 수 있는데 "주문 상태 변경"과 "주문 상태 전파" 정도가 있을 것이다. "주문상태변경": RDBMS내에서 데이터가 변경되는 것 "주문상태전파": Kafka와 같은 메시징 플랫폼에 이벤트 메시지를 발급하는 것 참조: https://debezium.io/blog/2019/02/19/reliable-microservices-data-exchange-with-the-outbox-pattern/ Reliable Microservic..

이것저것 2022.11.20

Windows 환경에 Zulu JDK 설치하기

[설치 경로] 다운로드: https://www.azul.com/downloads/ (msi버전 다운로드하고 설치) 기본설치경로: C:\Program Files\Zulu\zulu-11 [환경변수 설정] 환경변수 - 시스템변수 - JAVA_HOME 추가 - 변수값 (C:\Program Files\Zulu\zulu-11) 환경변수 - 시스템변수 - Path 편집 후 추가 (%JAVA_HOME%\bin) [확인] cmd에서 확인 C:\Users\jaeshim>javac Usage: javac where possible options include: @ Read options and filenames from file -Akey[=value] Options to pass to annotation processor..

Java 2022.11.20

Kafka Local One Node로 구성하기

로컬 머신에 Confluent Platform들을 구동하려고 한다. Kafka, Zookeeper.. Control-center까지 로컬머신에서 구동하기 위한 환경을 갖춰보는 것. [필요한 것] confluent-CLI confluent-platform (tar로 다운받아서 압축풀어서 사용하기) [순서] Confluent-CLI 설치 #confluent-cli 조회 $ curl -sL --http1.1 https://cnfl.io/cli | sh -s -- -l 0.100.0 0.101.0 0.102.0 0.103.0 0.104.0 0.105.0 0.106.0 ... 1.5.0 1.6.0 1.7.0 1.8.0 1.9.0 latest #현재 클러스터에 맞는 버전을 확인해서 설치하라고 하는데,위 링크보고 버..

Ubuntu에 Jenkins 설치하기

Ubuntu 18.04에서 검증된 내용 Java8 이상이 설치되어 있어야 한다. #Repository Key 추가 $ sudo wget -e https_proxy=http://proxy.gmarket.co.kr:8080 -q -O - https://pkg.jenkins.io/debian/jenkins.io.key | sudo apt-key add - #sources.list 에 Jenkins 패키지 저장소 추가 $ sudo sh -c 'echo deb https://pkg.jenkins.io/debian-stable binary/ > \ /etc/apt/sources.list.d/jenkins.list' #패키지 인덱스정보 업데이트 $ sudo apt-get update #Jenkins 패키지 설치 $ ..

Jenkins 2022.11.20

유틸성 클래스를 만들기 위해 private 접근제어 활용하기

static 메서드들을 모아놓은 클래스는 기본적으로 인스턴스화를 시켜 사용하지 않는다. 우리가 Arrays를 사용할 때를 생각해보면 절대 Arrays arrays = new Arrays()로 생성하지 않고, Arrays.asList(배열)과 같은 형태로 사용하고 있다. Arrays클래스를 실제로 열어보면 아래와 같다고 한다. public class Arrays { public static boolean isArray(Object o) { ...} public static Object[] asObjectArray(Object array) { ...} public static List asList(Object array) { ...} public static boolean isNullOrEmpty(T[] a..

Java 2022.11.19