팀 프로젝트) Kafka TCP 통신 vs. Prometheus HTTP 통신
☁️ [EKS / Prometheus / Kafka]
왜 어떤 주소는 http://를 붙여야 하고, 어떤 건 안 붙여도 될까?
AWS EKS 환경에서 Prometheus와 Kafka를 함께 구성하다 보면
이런 의문이 생긴다 👇
“Kafka brokers 주소는 그냥 b-1.kafka.amazonaws.com:9094 이렇게 써도 잘 되는데,
Prometheus remote_write는 http://를 안 붙이면 에러가 나네?”
이 글에서는 이 차이의 근본적인 이유를
“프로토콜 계층” 관점에서 명확하게 정리해보았다.
🧩 1️⃣ Kafka는 HTTP가 아닌 TCP 바이너리 프로토콜 기반
Kafka는 내부 통신에 HTTP를 전혀 사용하지 않는다.
대신 TCP 기반의 바이너리 프레임 프로토콜을 사용한다.
brokers:
- b-1.sologmskcluster2.tak97t.c4.kafka.ap-northeast-2.amazonaws.com:9094
이 주소를 보면 http://가 전혀 없다. 그 이유는 Kafka 클라이언트가 직접 TCP 소켓을 열고 브로커와 연결하기 때문이다.
HTTP 계층을 거치지 않고, 메시지를 Kafka 전용 형식으로 송수신한다.
🧠 쉽게 말하면,
| 구분 | 프로토콜 예시 | 포트 | 특징 |
| Kafka | TCP (Binary Protocol) | 9092 / 9094 | HTTP 미사용, 자체 요청/응답 구조 |
즉, http://를 붙이는 순간 프로토콜이 달라지기 때문에 오히려 오류가 발생한다.
Kafka는 순수 TCP로 작동하기 때문이다.
🌐 2️⃣ Prometheus remote_write는 HTTP API 기반
반면 Prometheus의 remote_write는 데이터를 다른 Prometheus 서버나 Thanos, Mimir, Cortex 같은 리모트 스토리지로 전송할 때 HTTP POST 요청을 사용한다.
remote_write:
- url: "http://afc92fad93b284bde93e1b7d4bc8c8a0-1120332621.ap-northeast-2.elb.amazonaws.com/api/v1/write"
실제로 Prometheus는 이 설정을 기반으로 아래처럼 동작한다 👇
POST /api/v1/write HTTP/1.1
Host: afc92fad93b284bde93e1b7d4bc8c8a0-1120332621.ap-northeast-2.elb.amazonaws.com
Content-Type: application/x-protobuf
Content-Encoding: snappy
즉, remote_write는 완전한 HTTP 통신이기 때문에
url: 항목에 반드시 프로토콜을 포함해야 한다.
http://나 https://를 생략하면 이런 에러가 발생한다:
unsupported protocol scheme ""
⚙️ 3️⃣ 두 방식의 근본적인 차이
| 항목 | Kafka | Prometheus remote_write |
| 통신 방식 | TCP 바이너리 프로토콜 | HTTP/HTTPS REST API |
| 전송 포트 | 9092 / 9094 | 80 / 443 |
| 전송 형식 | Kafka 전용 메시지 프레임 | HTTP POST + Protobuf (Snappy 압축) |
| http:// 필요 여부 | ❌ 필요 없음 | ✅ 반드시 필요 |
🧠 4️⃣ 쉽게 기억하기
Kafka는 "직접 연결(TCP 소켓 통신)"
Prometheus는 "HTTP 요청(API 호출)"
즉, Kafka는 프로토콜 헤더가 없고 Prometheus는 프로토콜 헤더(http://, https://)가 필수다.
🧾 5️⃣ 정리 문장
“Kafka는 HTTP를 사용하지 않는 TCP 프로토콜 기반이기 때문에
주소에 http://를 붙이면 통신이 실패한다.
반면 Prometheus의 remote_write는 HTTP POST 요청으로 데이터를 전송하므로
반드시 http:// 또는 https:// 프로토콜을 명시해야 한다.”