이 글은 ksqlDB
(당시에는 KSQL
이라는 명칭이었습니다)를 학습하기 위해 정리한 연재글입니다.
이 글의 순서는 아래와 같습니다.
ksqlDB를 이해하고 효율적으로 사용하기 위해 아래 기능들에 대해 이해하고 넘어갈 필요가 있습니다.
아파치 카프카의 몇몇 API에 대한 설명을 살펴봅시다. 이 링크를 살펴본다면 ksqlDB를 살펴볼 때에도 도움이 될 것입니다.
너무 직역이라, 이를 풀어보자면 아래와 같습니다.
미리 말씀드리자면, ksqlDB는 이 스트림 API를 SQL문 작성 만으로 사용할 수 있도록 하는 애플리케이션이라 볼 수 있습니다.
Avro는 스키마 정의를 아래의 방식으로 수행합니다. • 파일타입 • 레코드의 길이 • 레코드의 이름 • 레코드 필드 • 필요한 데이터타입에 맞게 정의
아래와 같은 형식으로 담깁니다.
{"type": "typeName" ...attributes...}
record
라는 값을 별도로 기재합니다.e.g. document을 정의하고 namespace는 “Test”이며 이름은 “Employee”이고 2개의 필드를 가지고있다. 각각 string 타입의 “Name”, int 타입의 “Age”이다.
라고 하는 데이터 타입에 대한 Avro 정의는 아래와 같습니다.
{
"type": "record",
"namespace": "Test",
"name": "Employee",
"fields": [
{ "name": "Name", "type": "string" },
{ "name": "Age", "type": "int" }
]
}
Test.Employee
가 되겠습니다.Avro의 primitive data type은 아래와 같습니다.
데이터타입 | 상세 |
---|---|
null |
아무값도 없는 값 |
int |
32bit signed integer |
long |
64bit signed integer |
float |
IEEE 754를 따르는 32-bit 부동소수점 값 |
double |
IEEE 754를 따르는 64-bit 부동소수점 값 |
bytes |
8-bit unsigned bytes의 시퀀스 |
string |
유니코드 캐릭터 시퀀스 |
Avro의 Complex data type은 다음과 같으며, 이는 "type": "<complex_data_type>"
와 같은 형태로 정의하며, 여기에서는 일부만 소개 하겠습니다.
데이터타입 | 상세 |
---|---|
Record | 다양한 애트리뷰트들의 컬렉션 |
Enum | 아이템 리스트에 대한 enumuration |
Arrays | 배열 형식의 값을 담을 수 있는 데이터 타입 |
Maps | key, value 쌍의 값을 담을 수 있는 데이터 타입 |
그 외의 내용은 아래 링크를 통해 확인해보시기 바랍니다.
자, 원하는 타입대로 직렬화/역직렬화를 수행할 수 있도록 포맷을 정했습니다. 그 다음은 어떤 절차를 거쳐야할까요? 아래 내용을 살펴봅시다. 이 내용은 파이썬의 confluent-kafka-python 라이브러리를 통해 사용하였음을 말씀드립니다.
KafkaAvroSerializer
를 raise한다.이 예시코드를 살펴보시면 이해가 빠릅니다!
AvroSerializer
객체를 통해 Schema Registry 정보를 받고 직렬화/역직렬화 처리준비를 완료함produce
수행이 예시코드를 살펴보시면 이해가 빠릅니다!
AvroDeserializer
객체를 통해 Schema Registry 정보를 받고 직렬화/역직렬화 처리준비를 완료함subscribe
한다.스키마 레지스트리 호출을 언급했는데, 정확히 어떤식으로 작동하는 걸까요? 그 내용에 대해선 아래 도식을 통해 설명하겠습니다.
Producer
는 Avro포맷으로 REST API에 POST
를 수행합니다.Consumer
는 binary data를 Kafka에서 consume합니다.
docker-compose에 스키마 레지스트리 관련 컨테이너 설정을 추가하면 됩니다.
docker-compose 내의 환경설정값은 'SCHEMA_REGISTRY_'
형태의 prefix를 붙여야합니다.
이 설정값은 기본적으로 체크해야 합니다.
kafkastore.bootstrap.servers
: 연결할 카프카 브로커들의 리스트listeners
: HTTP(S)를 통해 API request를 받을 리스너의 리스트kafkastore.connection.url
: ZooKeeper URLhost.name
: 스키마 레지스트리가 여러 노드로 작동중일 때의 설정추가로 확인해야할 설정값(SSL, SASL 등의 설정이 필요하다면 아래 링크를 참조해 주세요)
deployment시 점검해야할 스펙은 아래와 같습니다:
서버 세팅이 완료되면, 그 후 스키마 레지스트리 서버에 대해 API 요청을 테스트해볼 수 있습니다:
schema를 사용할 때 생기는 장점
schema를 사용할 때 생기는 단점
스키마 레지스트리를 강요하지하지는 않지만, 많은 케이스 에서 스키마 레지스트리 형식으로 포맷을 보장하기를 바라는 것으로 보입니다.
이번 글을 통해, 아래 내용들을 살펴볼 수 있었습니다:
다음 파트에선 ksqlDB를 명확히 이해하기 위해 Kafka Streams에 대해 명확히 알아보도록 합시다.
읽어주셔서 대단히 감사합니다.