본문 바로가기

게으른개발자

Kafka Streams 파티션 할당 과정 Kafka Streams 애플리케이션에서 파티션은 논리적 단위인 Task에 할당된다는 점은 기본적으로 알고 있지만, Task는 애플리케이션의 성능과 데이터 처리 효율성에 중요한 영향을 미치기 때문에, Task에 파티션이 할당되는 과정을 더 자세히 이해할 필요가 있다. 우선적으로 StreamsPartitionAssignor에 대해 알 필요가 있다.StreamsPartitionAssignor란?ConsumerPartitionAssignor설명:  Kafka의 컨슈머 그룹에서 사용되는 인터페이스로, 특정 토픽의 파티션을 컨슈머 그룹 내의 각 컨슈머에게 어떻게 할당할지를 결정하는 역할대표 구현체RangeAssignorRoundRobinAssignorStickyAssignorStreamsPartitionAssig.. 더보기
카프카 스트림즈(Kafka Streams) 설명과 간단 예제 카프카 스트림즈(Kafka Streams)란? Kafka 에서 공식적으로 제공하는 Kafka 클라이언트 자바 라이브러리 (JVM 기반의 언어(자바/스칼라/코틀린 등) 중 하나를 선택해서 개발 가능) 토픽(topic)에 있는 데이터를 낮은 지연과 빠른 속도로 처리 토픽에 적재된 데이터를 실시간으로 변환하여 다른 토픽에 적재하는 라이브러리 Kafka Consumer 와 차이가 잘 안느껴질수 있지만, 그림으로 보자면 아래와 같이 차이가 있다. Kafka Consumer Kafka Streams 카프카 스트림즈(Kafka Streams) 장점은? 카프카와 완벽한 호환 Kafka에서 공식적으로 제공되는 라이브러리임에 따라 로그스태시, 스파크와 같은 오픈소스툴과 다르게 매 Kafka버전에 맞춰서 호환을 제공 딱 1.. 더보기
DB three-valued logic (NULL의 의미) 우선, 아래의 쿼리를 살펴보자. select 1 = 1, --true 1 != 2, -- true 1 = null, -- null null = null, -- null null != null, -- null 1 != null, -- null 1 is null, -- false 1 is not null, -- true null is null, -- true null is not null; -- false 위의 쿼리 결과를 보고 두가지 의문이 든다. 일반값의 비교는 = 혹은 != 로 하면서 왜 null 의 비교는 is 혹은 is not 을 쓸까? 1 = null 과 1 != null 의 결과가 false, true 일거같은데 왜 null이 나올까? 의문을 해결하기위해선 SQL 에서 NULL의 의미를 알아야한.. 더보기
DB(PostgreSQL) 인덱스와 활용방법 (컴포지트 인덱스, 커버링 인덱스) DB를 활용하다 보면 빠른 동작을 위해 인덱스를 많이 활용합니다. 컬럼에 인덱스를 생성하면 빠르게 검색된다는건 알지만, 그 장점을 잘 활용못하는 경우가 많아 작성해보았습니다. DB 인덱스란? 데이터베이스 분야에 있어서 테이블에 대한 동작의 속도를 높여주는 자료 구조 자료 구조 - 위키백과, 우리 모두의 백과사전 위키백과, 우리 모두의 백과사전. 자료구조(資料構造, 영어: data structure)는 컴퓨터 과학에서 효율적인 접근 및 수정을 가능케 하는 자료의 조직, 관리, 저장을 의미한다.[1][2][3] 더 정확히 말해, ko.wikipedia.org 인덱스 활용 방법 1. 컴포지트 인덱스 (Composite Index ) vs 인덱스 머지 (Index merge) 컴포지트 인덱스 (Composite.. 더보기
gRPC 간단 정리와 예제 배경 마이크로서비스 기반으로 구축되는 시스템은 서비스 간 네트워크 통신 연결이 급증 마이크로서비스용 통신을 구축할 때에 주로 사용하는 RESTful 서비스는 프로세스 간 통신을 구축할 때 부피가 크고, 비효율적 설명 Google에서 만든 오픈 소스 원격 프로시저 호출(RPC) 시스템 gRPC는 성능이 좋고, 전송 효율이 높은 서비스를 제공하는데 사용 gRPC는 여러 언어로 구현되어 있으며, 일반적으로 HTTP/2 프로토콜을 기반으로 구현되어 있음. 사용 순서 프로토콜 버퍼를 IDL(Interface Definition Language)로 사용해 서비스 인터페이스 정의 (메서드 종류, 호출 파라미터, 메시지 형식 등) 서비스 정의를 사용해 서버 스켈레톤(server skeleton)이라는 서버 측 코드 생.. 더보기
OSI 7Layer와 L1, L2, L3, L4, L7 스위치 어떠한 서비스를 구축할때 우리는 대용량 트래픽을 처리하기위한 방법 중 하나로 로드밸런싱(https://aws.amazon.com/ko/what-is/load-balancing/)을 한다. 로드밸런싱을 제공 하는 요소(소프트웨어 혹은 하드웨어)를 로드밸런서라고 하며, 대표적으로 L4/L7 스위치가 있다. L4/L7 스위치의 'L'은 OSI 7Layer의 Layer를 의미하며 4/7은 각 계층(4계층,7계층)을 의미한다. 그이유는 스위치들은 각계층을 기반으로 동작하기 때문이다. 단순히 L4/L7의 동작원리를 암기하여 외울순 있겠지만, 각계층이 어떤역할을 하는지 알게된다면, 굳이 외우지 않아도 L1,L2,L3 등등 스위치도 어떻게 동작하는지 유추가 가능할 것 입니다. 그래서 일단, OSI 7Layer의 각 계.. 더보기
REST vs. RESTful 개발자라면 익숙한 REST API 하지만 누군가에게 설명하려면 막막한 느낌이 든다. 그리고 REST 와 RESTful은 분명 차이가 있지만, 현업에 종사하고 있는 개발자중에서도 이 차이점을 명확히 이해하고 있는 사람의 비율은 그렇게 높지 않을 것 이라 생각된다. 이 글에서는 REST와 RESTful이 무엇인지 알아 볼것이다. 상황을 가정해보자. 회사 동료가 회원의 데이터를 수정하는 기능을 제공하기위해 /update/member 와 같은 형태의 엔드포인트로 API를 제작했고, 리뷰를 요청했다. 팀동료들은 이 API를 보고 "REST 스럽지 않은데?" 라고 표현할것이다. 도대체 REST 가 뭐길래 그런 말을 하는 것일까? 일단, 일반적으로 개발자들은 RESTful API의 의미로 아래와 같은 뜻으로 이해 한.. 더보기
JPA OneToMany 중복조회 JPA 에서 OneToMany를 사용할경우 예상치 못하게 동일한 데이터가 중복 조회되는 경우가 있다. 배경 아래와 같이 두개의 Entity가 있는 상황있다고 가정하자. @Entity class Team { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) @Column(name = "ID", nullable = false) var id: Long? = null @Column(columnDefinition = "varchar(30)") var name: String? = null @OneToMany(mappedBy = "team") var members = mutableListOf() } @Entity class Member { @Id @GeneratedV.. 더보기