메시지 중개인
1) 메시지 중개인
브로커는 시간/속도/신뢰성별로 생산자와 소비자를 연결합니다
피크 버퍼링 및 스무딩, 백 프레셔.
독립적으로 읽기/쓰기 스케일링.
이벤트의 관찰 및 재생.
건축 패턴: 이벤트 중심, CQRS, 이벤트 소싱, 아웃 박스/받은 편지함.
2) 기본 모델 및 용어
2. 1 카프카 (로그 모델)
주제 → 당사자 (주문 로그) → 소비자의 오프셋.
소비자 그룹: 병렬 처리, 파티 균형을 읽으십시오.
시간/볼륨 별 유지; 주요 압축.
시맨틱: 최소한 한 번 이상 설정이있는 경우 효과적으로 정확하게 한 번 (idempotent producers + travel).
주문: 파티 내에서 보장됩니다.
2. 2 NATS (피험자, 낮은 대기 시간)
계층 구조와 와일드 카드 ('foo. ',' 푸. >`).
모드: 펍/서브, 큐 그룹 (작업 배포와 함께 팬 아웃), 요청 응답 (빠른 RPC).
핵심 NATS-임시, 초저 대기 시간; JetStream-지속성/유지/반복.
주문: 최선의 노력, 강력한 글로벌 보장 없음; JetStream의 경우-스트림에서 주문하지만 실패시 드문 재정렬이 가능합니다.
3) 배달 의미 및 일관성
Kafka에서 "정확히 한 번" 이었을 때에도 Idempotence와 dedup은 적용/타박상의 책임입니다.
4) 주문, 파티션 및 키
카프카
메시지 키의 선택은 당사자 → 강력한 지역 질서를 결정합니다.
확인: '집계 _ id', '테넌트 _ id', 'order _ id'. 뜨거운 키를 피하십시오
균형: N 당사자는 병렬 처리 수준을 읽습니다.
NATS
코어에서는 큐 그룹이 균형을 이룹니다.
JetStream Stream은 주제에 의해 뒤섞입니다. 대기 시간이 짧은 넓은 팬 아웃/팬에 중점을 둡니다.
5) 유지, 재생 및 압축
카프카
유지: '유지. ms/바이트 '.
압축: "키별로 마지막 값" (스냅 샷/캐시/사가에 적합) 을 저장합니다.
재생: 모든 consummer는 오프셋을 "되감을" 수 있습니다.
제트 스트림
스트림: 파일/메모 백엔드, 시간/바이트 별 스토리지 정책/메시지 수.
소비자: 풀/푸시, 내구성/임시, 주제 접두사 별 필터.
재생: 처음/오프셋과 같은 (시퀀스) 에서 재배송 또는 읽기.
6) 거래, 아웃 박스 및 일관성
카프카
Idempotent Producer ('활성화. demempotence = 참 '): 중복으로부터 보호합니다.
거래: 여러 배치의 원자 기록 + 커밋 소비자 오프셋 → "홀" 없이 읽기 프로세스 쓰기 패턴.
거래 전송: 하나의 데이터베이스 거래에서 비즈니스 이벤트 기록과 개요 상자 라인을 작업자가 Kafka에 게시합니다.
NATS
Kafka에서와 같이 "교차 스트림" 트랜잭션은 없습니다. Outbox/받은 편지함 및 dempotent 소비자 (키, 데드 스토어) 를 사용하십시오.
7) RPC 및 요청 응답
Kafka는 RPC에 불편합니다 (높은 오버 헤드, 주문/답변이 더 어렵습니다). 비동기식 명령/이벤트를 사용하
NATS: 요청 응답에 이상적입니다 (밀리 초, 상관 관계, 타임 아웃).
예 (Go, NATS 요청 응답):go resp, err:= nc. Request("profile. get", []byte(`{"id":42}`), 200time. Millisecond)
8) 운영 및 토폴로지
8. 1 카프카
클러스터: 브로커 + ZooKeeper (이전 버전 이전) 또는 KRaft (새 메타 데이터).
복제 - 영역 RF 계정 3, ISR/컨트롤러
다중 지역: MirrorMaker 2/Cluster Linking; 충돌 정책이있는 자산 책임/자산 자산.
디스크/네트워크 용량: '처리량 × 보존 × 복제본' 에서 읽습니다.
8. 2 NATS
클러스터: 주변 장치/가장자리를위한 많은 노드, 슈퍼 클러스터 (지리 분포), 리프 노드.
JetStream: 노드 세트 별 스트림 배치 (배치), 복제 (R = 1.. 5).
WAN: 대기 시간이 짧고 쉽게 연합 할 수 있습니다.
9) 안전
카프카
엘리자베스, 스크램, OAuthBearer.
주제/그룹/거래에 대한 ACL.
"휴식 중" (OS/디스크) + 네트워크 정책 암호화
NATS
nkey/JWT 신원, 운영자 계정, 주제 당 ACL.
노드와 클라이언트 간의 mTLS.
임차인 격리 (계정) + 제한.
10) 관찰 및 성능 지표
카프카
확인: 'BytesIn/Out', 'RequestQueue', 'UnderReplicatedPartitions', GC/FS 통계.
주제/부분: 'logEndOffset', 소비자 지연 (중요).
생산자/여름: retrai, '배치. 크기 ',' 남아 있습니다. m ',' 가져옵니다. 바이트 ', 오류.
도구: JMX, 크루즈 제어 (재조정), 스키마 등록 소.
NATS/제트 스트림
서버: conn/msgs/sec, RTT, CPU/mem, 느린 소비자 탐지.
JetStream: 스트림/소비자-지연, 재전, 팩, 스토리지 바이트.
모니터링: 내장 엔드 포인트, nsc/adm-CLI, 대시 보드.
11) 성능 및 튜닝
카프카
큰 엉덩이와 남아 있습니다. ms는 처리량을 개선하고 p99를 압축합니다.
압축 (lz4/zstd) 네트워크/디스크를 저장합니다.
숫자. 소비자/코어 수에 따른 파티션이지만 오버 헤드는 아닙니다.
드라이브: NVMe가 선호하고 XFS/EXT4에 'noatime' 이 있습니다.
NATS
작은 메시지, 많은 연결이 표준입니다. 대기열 그룹을 "넓게" 유지하십시오.
JetStream: 'max _ ack _ pending' 튜닝, 풀 vs 푸시, 배치 크기.
역압: 'FlowControl', 'IdleHeartbeat', 서버 측 제한.
12) 통합 패턴
송신기/받은 편지함 (Kafka와 NATS 모두).
SAGA: 이벤트 오케스트레이션; 'saga _ id + step' 의 할아버지.
CDC (Change Data Capture): Debezium → Kafka; NATS - "데이터베이스 트리거/로그 게시자" 패턴.
스트림 처리: Kafka Streams/Flink/Spark; NATS-타사 프로세서/기능, JetStream 소비자.
DLQ (Dead Letter Queue) 및 재 시도 정책 (지수 백오프 + 지터).
13) 설정 예
13. 1 카프카: 주제와 프로듀서 만들기
bash kafka-topics. sh --create --topic orders \
--partitions 12 --replication-factor 3 \
--config cleanup. policy=delete \
--config retention. ms=604800000 # 7d
properties producer. properties bootstrap. servers=broker:9092 acks=all enable. idempotence=true batch. size=65536 linger. ms=10 compression. type=zstd
13. 2 카프카 스트림: dem 등원 가공 (스케치)
java builder. <String, Order>stream("orders")
.groupByKey()
.aggregate(/... /)
.toStream()
.to("orders-agg");
13. 3 NATS JetStream: 스트림 + 소비자 (nats CLI)
bash nats stream add ORDERS --subjects "orders. " --retention limits \
--storage file --max-bytes 100GB --replicas 3 --discard old
nats consumer add ORDERS ORDERS-WORKERS --filter "orders. created" \
--deliver pull --ack explicit --max-deliver 6 --backoff "1s,5s,30s,2m"
13. 4 NATS 요청 응답 (이동)
go nc, _:= nats. Connect("tls://nats:4222", nats. Secure(tlsConf))
sub, _:= nc. QueueSubscribe("calc. sum", "workers", func(m nats. Msg) {
//... process...
m. Respond([]byte("42"))
})
14) 카프카 vs NATS 픽: 빠른 가이드
재생, 장기 유지, 압축, 대류 프로세스 → Kafka가 필요합니다.
빠른 RPC, 팬 아웃/팬 인 마이크로 레이턴시, 간단한 작동, 엣지/IoT → NATS (코어) 가 필요합니다.
지속성 + 팬 아웃이 필요하지만 무거운 "로그" 플랫폼 → NATS JetStream이 없습니다.
엄격한 키 및 트랜잭션 주문 → Kafka.
15) 용량 계획 (단순화)
카프카
1. 처리량: '인바운드 _ MBps × RF × 보존 _ day × 86400' → 디스크.
2. 배치: '대상 _ 동시성' × 주식 1. 5-2 ×.
3. 네트워크: p99 + 복제 + 생산자 압축.
NATS/제트 스트림
1. 메시지/초 및 평균 → 처리량.
2. 보존 × 복제본 → 스토리지.
3. 소비자는 직렬화를 위해 CPU를 제한 (랙 보류, 재배송) 합니다.
16) 안전한 작동: 점검표
(PHP 3 = 3.0.6, PHP 4)
- ACL/계정/할당량 (임차인 당).
- 소비자, DLQ 및 지터 퇴각에 대한 이념성.
- 라그/처리량/오류 모니터링; URP (Kafka), 재전달 폭풍 (NATS) 에 대한 경고.
- 용량 대시 보드: 파티션, 스토리지, p99.
- 노드/영역 실패 테스트, 게임 일, 재생/백필.
- 스키마 레지스트리/JSON 스키마 키가 문서화되어 있습니다
- 보존/압축/TTL 정책은 규정 준수와 일치합니다.
- 중개인/클라이언트 버전이 정기적으로 업데이트됩 와이어 프로토콜 호환성이 검증되었습니다.
17) 반 패턴
핫 키 (동일한 ID의 모든 이벤트) → 하나의 "비등" 스트림. 선명한/버퍼.
dempotency → 이중 효과가없는 후퇴.
거대한 메시지 (MB-tens) → GC 조각화/일시 중지. 개체에 페이로드를 저장하고 링크를 보냅니다.
RPC를 혼합하고 Kafka → 복잡한 수명주기/순서로 스트리밍합니다.
JetStream은 "장기 DWH" → 오프 라벨입니다. 오브젝트/컬럼 베드에 오랫동안 보관하십시오.
DLQ → "독" 메시지가 끝없이 회전하지 않습니다.
잊혀진 보존 → 디스크가 가득 찼습니다.
18) FAQ
Q: 파이프 라인 끝에서 "정확히 한 번" 할 수 있습니까?
A: 실제로-효과적으로 그렇습니다: Kafka (dem 등원 생산자 + 트랜잭션) 및 dempotent 싱크 (키, upsert). NATS에서-응용 프로그램의 dempotence/dedup을 통해.
Q: 백만 개의 작은 RPC/초에 무엇을 선택해야합니까?
A: NATS 코어: 미세 지연, 요청 응답, 조명 연결 및 대기열 그룹.
Q: 재산의 압축과 스냅 샷이 필요하십니까?
A: 카프카 익스 '정리. 정책 = 소형 ', 키 = 집계/자원.
Q: 지연을 처리하는 방법?
A: 배치/작업자 수를 늘리고, 처리 시간을 줄이고, 배치 및 프리 페치하고, 사막화를 최적화하고, 중개인/드라이브를 수직으로 강화하십시오.
Q: 다중 지역 및 DR?
A: Kafka-MirrorMaker 2/Cluster Linking, RPO의 자산 책임 NATS - 슈퍼 클러스터/리프 노드; 영역 별 JetStream 미러링/복제본.
19) 총계
Kafka와 NATS는 다른 모드를 닫습니다. Kafka-내구성 이벤트 로그, 높은 처리량, 트랜잭션성 및 재생; NATS는 지속성을 위해 JetStream과 함께 낮은 대기 시간, RPC 및 간단한 팬 아웃을위한 초경량 버스입니다. 배달 의미론, 주문 및 유지, 대기 시간 및 운영 비용 중에서 선택하십시오. 키/파티, 보존, DLQ 및 관찰 가능성을 설계하면 이벤트 아키텍처를 예측할 수 있고 확장 가능하며 신뢰할 수 있습니다.