2025년 11월 3일 작성
Kafka REST Proxy - HTTP를 통한 Kafka 접근
Kafka REST Proxy는 HTTP/REST API를 통해 Kafka cluster에 접근할 수 있게 하여, native client를 사용할 수 없는 환경에서도 Kafka를 활용할 수 있게 합니다.
Kafka REST Proxy
- Kafka REST Proxy는 RESTful HTTP API를 통해 Kafka cluster와 상호 작용할 수 있게 하는 component입니다.
- native Kafka client를 사용할 수 없는 환경이나 언어에서도 HTTP 기반으로 Kafka를 사용할 수 있습니다.
- Confluent에서 개발하고 유지 보수하는 open source project입니다.
REST Proxy가 필요한 이유
- 다양한 언어에서 Kafka를 사용할 수 있습니다.
- native Kafka client가 없는 언어에서도 HTTP client만 있으면 Kafka를 사용할 수 있습니다.
- 모든 programming 언어가 HTTP library를 갖고 있으므로 접근성이 높습니다.
- application과 간단하게 통합할 수 있습니다.
- Kafka client library를 application에 포함시킬 필요가 없습니다.
- dependency 관리와 version 호환성 문제를 줄일 수 있습니다.
- 방화벽 환경에서 사용하기 용이합니다.
- Kafka native protocol(9092 port)을 열지 않고 HTTP/HTTPS(80/443 port)만 열면 됩니다.
- 보안 정책상 제한된 port만 허용하는 환경에서 유용합니다.
- 빠른 prototype 개발이 가능합니다.
curl같은 도구로 간단히 test하고 검증할 수 있습니다.- client library 설정 없이 즉시 Kafka를 사용할 수 있습니다.
REST Proxy Architecture
- REST Proxy는 HTTP request를 받아 Kafka native protocol로 변환하는 gateway 역할을 합니다.
- client의 HTTP request를 Kafka producer/consumer API 호출로 변환합니다.
- Kafka response를 HTTP response로 변환하여 client에게 전달합니다.
flowchart LR
http_client[HTTP Client] -->|REST API| rest_proxy[REST Proxy]
rest_proxy -->|Native Protocol| kafka_cluster[Kafka Cluster]
rest_proxy -->|Schema Registry| schema_registry[Schema Registry]
- REST Proxy는 stateless service로 설계되어 수평적 확장이 가능합니다.
- 여러 REST Proxy instance를 실행하고 load balancer로 분산할 수 있습니다.
- Schema Registry와 통합하여 Avro, JSON Schema, Protobuf 등의 schema를 지원합니다.
주요 기능
- REST Proxy는 producer와 consumer 기능을 HTTP API로 노출합니다.
Producer 기능
- HTTP POST request로 topic에 message를 전송하며, 단일 또는 batch 전송을 지원합니다.
- partition key를 지정하여 message를 특정 partition으로 routing할 수 있습니다.
# 단일 message 전송
curl -X POST -H "Content-Type: application/vnd.kafka.json.v2+json" \
--data '{"records":[{"value":{"name":"testUser"}}]}' \
"http://localhost:8082/topics/my-topic"
# partition key를 지정하여 전송
curl -X POST -H "Content-Type: application/vnd.kafka.json.v2+json" \
--data '{"records":[{"key":"user1","value":{"name":"testUser"}}]}' \
"http://localhost:8082/topics/my-topic"
Consumer 기능
- consumer group 생성, topic 구독, message 조회, offset commit의 순서로 사용합니다.
# 1. consumer group 생성 및 consumer instance 등록
curl -X POST -H "Content-Type: application/vnd.kafka.v2+json" \
--data '{"name":"my-consumer","format":"json","auto.offset.reset":"earliest"}' \
"http://localhost:8082/consumers/my-consumer-group"
# 2. topic 구독
curl -X POST -H "Content-Type: application/vnd.kafka.v2+json" \
--data '{"topics":["my-topic"]}' \
"http://localhost:8082/consumers/my-consumer-group/instances/my-consumer/subscription"
# 3. message 조회
curl -X GET -H "Accept: application/vnd.kafka.json.v2+json" \
"http://localhost:8082/consumers/my-consumer-group/instances/my-consumer/records"
# 4. offset commit
curl -X POST -H "Content-Type: application/vnd.kafka.v2+json" \
"http://localhost:8082/consumers/my-consumer-group/instances/my-consumer/offsets"
Metadata 조회
- topic 목록과 partition 정보를 HTTP GET으로 조회할 수 있습니다.
# 모든 topic 목록 조회
curl -X GET "http://localhost:8082/topics"
# 특정 topic의 partition 정보 조회
curl -X GET "http://localhost:8082/topics/my-topic/partitions"
지원하는 Data Format
- REST Proxy는 여러 data format을 지원합니다.
JSON Format
- 가장 간단하고 일반적으로 사용되는 format이며,
Content-Type: application/vnd.kafka.json.v2+json으로 지정합니다.
{
"records": [
{"value": {"name": "Alice", "age": 30}},
{"value": {"name": "Bob", "age": 25}}
]
}
Avro Format
- Schema Registry와 함께 사용하여 schema 관리가 가능하며,
Content-Type: application/vnd.kafka.avro.v2+json으로 지정합니다.
{
"value_schema": "{\"type\":\"record\",\"name\":\"User\",\"fields\":[{\"name\":\"name\",\"type\":\"string\"}]}",
"records": [
{"value": {"name": "Alice"}}
]
}
Binary Format
- base64 encoding된 binary data를 전송하며,
Content-Type: application/vnd.kafka.binary.v2+json으로 지정합니다.
{
"records": [
{"value": "SGVsbG8gV29ybGQ="}
]
}
REST Proxy 설정
- REST Proxy는
kafka-rest.propertiesfile을 통해 설정합니다.
기본 설정
- 주요 설정 항목은 listener, broker 주소, Schema Registry 주소입니다.
# REST Proxy가 listen할 port
listeners=http://0.0.0.0:8082
# Kafka broker 주소
bootstrap.servers=localhost:9092
# Schema Registry 주소 (Avro 사용 시)
schema.registry.url=http://localhost:8081
# Consumer request timeout
consumer.request.timeout.ms=30000
보안 설정
- SSL과 SASL 인증을 설정하여 보안을 강화할 수 있습니다.
# SSL 활성화
listeners=https://0.0.0.0:8082
ssl.keystore.location=/path/to/keystore.jks
ssl.keystore.password=password
ssl.key.password=password
# SASL 인증
client.security.protocol=SASL_SSL
client.sasl.mechanism=PLAIN
client.sasl.jaas.config=org.apache.kafka.common.security.plain.PlainLoginModule required username="admin" password="admin-secret";
REST Proxy의 제약 사항
- 성능 overhead가 발생합니다.
- HTTP protocol overhead로 인해 native client보다 throughput이 낮습니다.
- latency가 증가할 수 있습니다.
- 일부 기능이 제약됩니다.
- native client의 모든 고급 기능을 지원하지 않습니다.
- transaction, exactly-once semantic 등 일부 기능은 제한적입니다.
- consumer state 관리에 제약이 있습니다.
- consumer는 REST Proxy server에 state를 유지하므로, server 재시작 시 consumer를 재생성해야 합니다.
- long-running consumer에는 적합하지 않을 수 있습니다.
- server resource를 사용합니다.
- 각 consumer instance가 server의 resource를 사용합니다.
- 많은 수의 consumer를 동시에 사용하면 server 부하가 증가합니다.
REST Proxy 사용 Best Practice
- 짧은 작업에 사용하는 것이 적합합니다.
- message를 가끔 전송하거나, 일회성 조회 작업에 적합합니다.
- 지속적인 streaming 처리에는 native client를 권장합니다.
- 적절한 timeout을 설정해야 합니다.
consumer.request.timeout.ms를 적절히 설정하여 장시간 대기를 방지합니다.
- consumer를 정리해야 합니다.
- 사용 완료한 consumer는 반드시 삭제하여 server resource를 확보합니다.
- 예 :
curl -X DELETE "http://localhost:8082/consumers/my-consumer-group/instances/my-consumer".
- batch 처리를 활용해야 합니다.
- 여러 message를 한 번에 전송하여 network overhead를 줄입니다.
- load balancing을 구성해야 합니다.
- 여러 REST Proxy instance를 실행하고 load balancer를 앞단에 배치합니다.
REST Proxy Alternatives
- Kafka Connect : data pipeline 구축에는 Kafka Connect가 더 적합합니다.
- 다양한 connector를 통해 외부 system과 통합할 수 있습니다.
- Native Client Libraries : 고성능이 필요한 경우 Java, Python, Go 등의 native client를 사용합니다.
- 더 많은 기능과 더 나은 성능을 보입니다.
- ksqlDB : SQL 기반으로 Kafka를 다루고 싶다면 ksqlDB를 고려합니다.
- stream processing과 query 기능을 갖추고 있습니다.
Reference
- https://docs.confluent.io/platform/current/kafka-rest/index.html
- https://github.com/confluentinc/kafka-rest
- https://velog.io/@holicme7/Apache-Kafka-Kafka-REST-Proxy%EB%9E%80