메시지 대기열: RabbitMQ, Kafka
메시지 대기열: RabbitMQ, Kafka
1) 선택시기
RabbitMQ (AMQP 0-9-1/1. 0, 클래식 대기열, 쿼럼 대기열, 스트림)
RPC/명령, 워크 플로, 짧은 작업, 팬 아웃/주제 라우팅, 유연한 확인, 우선 순위 제어.
장점: 풍부한 라우팅 의미론 (교환), '기본. qos '(프리 페치), 메시지 당 TTL/지연, 편리한 RPC (회신) 패턴, 쉬운 시작.
단점: 대기열에 저장된 이력은 대기열/파편을 가로 질러 수평으로 확장됩니다. 매우 큰 흐름으로 높은 처리량 비용.
아파치 카프카 (이벤트 로그, 파티, 소비자 그룹)
이벤트 스트림, 감사, 이벤트 소싱, ETL/통합 (Connect), 높은 RPS/MBps, 재생/재 처리, 스트림 처리 (Streams/ksqlDB) 에 적합합니다.
장점: 장기 저널, 당사자 별 확장, 안정적인 재생, 주요 압축.
단점: 작은 RPC가 아닌 풀 + 파티 모델; 파티 내에서만 주문; 스키마 관리/상호 운용성은 팀의 책임입니다.
2) 배달 의미론 및 불변량
최대 한 번에: 배상금이 없습니다. 빨리, 손실 위험.
적어도 한 번: 퇴각; 소비자 demopotency가 필요합니다
정확히 한 번: 제한된 조건에서 달성 할 수 있음 (Kafka TX + dem 등원 생산자 + 일관된 싱크; RabbitMQ-중복 제거 테이블/idempotent 키를 통해).
주문: RabbitMQ - 대기열 주문 (retras/multi-savers에서 위반될 수 있음); 카프카-파티에서 순서대로 키가 파티션을 설정합니다.
도메인 불변: 돈/잔액-잡지/사가 및 demmpotent 팀을 통한; LWW에 의존하지 마십시오.
3) 통합 패턴
Inbox/InBox: 데이터베이스에서 이벤트의 원자 기록 → 대기열 (Outbox) 에 게시 및 처리 로그 (받은 편지함) 를 사용한 dem 등원 소비.
DLQ (데드 문자): N 시도/오류 후-DLQ + 경고에서.
시작/지연: RabbitMQ-TTL + 데드 레터 교환; 카프카-백오프로 주제를 다시 시도하십시오.
요청/응답: RabbitMQ- '회신 _ to' + '상관 _ id'; 카프카-드물게, 특별한 패턴으로 만.
보상: 사건에 대한 사가; 각 작업에는 역수가 있습니다.
4) 키 및 토폴로지 디자인
RabbitMQ
교환: '직접', '주제', '팬 아웃', '헤더'.
키를 라우팅합니다. 대기열을 누르십시오. 우선 순위 지정 - 별도의 대기열.
QoS: '프리 페치' (예: 50-300) 은 요율/대기 시간의 균형을 유지합니다.
정원 대기열: 뗏목에 복제 된 대기열; 교체 미러 클래식.
스트림: 처리량이 많은/재생을 위해 오프셋 (카프카와 같은) 으로 스트리밍하십시오.
카프카
주제 → 파티션: 대상 처리량 및 병렬 처리에 대한 '# 파티션' 을 계획하십시오 (이전 호환 증가는 감소보다 쉽습니다).
키: 하나의 키에 대한 모든 레코드-한 부분에서 (키별로 순서 보장).
복제 계수: 생산적인 주제의 경우 3, '최소한. 동기화되지 않습니다. 신뢰성을 위해 replicas = 2 '+' acks = all '.
보존: 시간/크기 별; 압축-삭제를 위해 키 + 묘비별로 마지막 값을 저장합니다.
5) Retrai, DLQ, demempotency
RabbitMQ
반복: 백오프 (예: 1m → 5m → 15m) 가있는 메시지 별 TTL + DLX (데드 레터 교환).
이데올로기: 'correlation _ id '/' messation-id' + 처리 된 메시지 테이블 (TTL) 또는 결정 론적 명령.
확인: 수동 '기본. '성공적인 거래 후;' 기본. nack (requeue = 잘못된) 'DLQ.
카프카
반복: 개별 재 시도 주제; 소비자는 성공적인 부작용 후 상쇄를합니다.
정확히 한 번의 처리 (EOS): 프로듀서 가능. demempotence = 참 ', 거래 생산자/소비자, 소비자에 대한' 읽기 _ 커밋 '; 싱크 (예: 트랜잭션을 통한 Kafka → Kafka 또는 Kafka → DB) -깔끔하게 동기화됩니다.
결제: 기본 측면의 키/idempotent 키 또는 압축 주제를 통해.
6) 성능과 차원
작은 법칙: 'L = λ× W'
vorker의 경우: 겹치는 'N λrate _ rate × avg _ processing _ time × stock (1. 2–1. 5)`.
RabbitMQ 프리 페치: 'prefetch = 100' 으로 시작하고 p99/기내 시간을 측정하십시오.
카프카 파티션: 원하는 소비자 병렬 처리 및 처리량 목표에서 계산 (예: 1 배치는 SSD/10GbE에서 안정적인 5-20MB/s).
7) 관찰 및 경고
일반:- 래그/백 로그 (메시지/바이트), 메시지 연령 (p95/p99), 처리 오류율, DLQ 속도.
- 시간 "publikatsiya → obrabotka" (엔드 투 엔드).
- 의존성 맵: 생산자 → 중개인 → 소비자.
- (PHP 3 = 3.0.6, PHP 4)
- Quorum에 대한 보고서 (래프트 로그 리더, '쿼럼이 충분하지 않음').
- 복제되지 않은 파티션, ISR 축소/확장, 컨트롤러 변경
- 생산자 오류 (타임 아웃, '요청 대기 시간'), 그룹/파티션 당 소비자 지연.
- Broker I/O, 페이지 캐시 히트, GC, ZooKeeper/KRaft 건강.
8) 안전 및 다중 임대
대중 교통 암호화, 인증 (ML/PLAIN/SCRAM/OAuth, mSL).
승인: vhost/rights (RabbitMQ), ACL to 주제/그룹 (Kafka).
쿼터: 연결, 채널, 대기열 크기/주제, 게시/읽기 속도.
환경 별 분리 (v/stage/prod) 및 네임 스페이스/호스트.
9) 작동 및 튜닝
RabbitMQ
사후 교환/대기열을 노드로 변경합니다 (CPU/IO 대문자).
큰 버퍼를위한 게으른 대기열 (디스크에 메시지); 선명하지 않고 "뜨거운" 대기열을 피하십시오.
HA를위한 정원 대기열; 뗏목 크기 및 디스크를 계획하십시오.
TTL/길이 제한 정책, 실제 필요에 대해서만 우선 순위 대기열 (비싼).
bash rabbitmqctl set_policy DLX "^task\." \
'{"dead-letter-exchange":"dlx","message-ttl":60000,"max-length":100000}' --apply-to queues
카프카
SSD/NVMe, 빠른 네트워크; OS 튜닝 (교환 성이 낮고 파일 제한이 있음).
'acks = all', '남아 있습니다. ms '(버칭), 압축. 대역폭의 형태 = zstd '/lz4.
소비자 옵션: 'max. 설문 조사. 간격. ms ',' max. 여론 조사. 기록 ',' 가져옵니다. 분. 바이트 '.
보존 및 압축-스토리지 밸런스/재생.
java props. put("acks","all");
props. put("enable. idempotence", "true");
props. put("max. in. flight. requests. per. connection","1");
props. put("retries","10");
10) 통합 및 생태계
Kafka Connect (싱크/소스), 스키마 레지스트리 (Avro/JSON/프로토 타입) 및 상호 운용성 ('BACKWARD/FORWARD/FULL').
Kafka Streams/ksqlDB: 고마운 작업, 창문, 집계.
RabbitMQ Shovel/Federation: 클러스터/센터 간 전송.
K8s 운영자: Strimzi (Kafka), RabbitMQ 클러스터 운영자; GitOps 선언문.
11) 구현 점검표 (0-45 일)
0-10 일
사용 사례를 정의하십시오: 명령/작업 (RabbitMQ), 이벤트/감사 (Kafka).
키 ('라우팅 키 '/' 파티션 키') 를 선택하고 SLO "publikatsiya → obrabotka" 를 설정하십시오.
기본 보안 정책 (SL, ACL), 할당량, DLQ/TTL.
11-25 일
Outbox/받은 편지함, demotency 및 데드 업을 구현하십시오.
백오프로 retreas를 설정하십시오 (토끼: TTL + DLX; 카프카: 주제를 다시 시도).
대시 보드: 지연, 연령, DLQ 비율, 엔드 투 엔드 대기 시간; 경고.
26-45 일
튜닝 대역폭: 프리 페치/팩 (토끼); 파티션/팩/배치 (Kafka).
DR 절차 (미러링/복제), 노드 고장 테스트.
문서 이벤트 계약 (스키마) 및 상호 운용성 정책.
12) 반 패턴
모든 작업을위한 하나의 "범용" 도구.
DLQ/TTL의 부재: 영원한 독 (독 메시지).
무제한 '프리 페치' → 소비자 기아, p99 성장.
키가없는 카프카 → 기본적으로 주문/핫 파티 손실.
실제 필요/징계가없는 "정확한 한 번" 은 잘못된 보안 감각입니다.
TLS/ACL없이 코드의 비밀/로그인.
레지스트리 및 마이그레이션이없는 메시지의 체계/버전 하드 코드.
13) 성숙도 지표
Lag/age SLO는 시간의 99% 이상을 수행합니다. 통제되는 DLQ 비율.
Idempotency는 100% 의 중요한 경로를 다룹니다. 아웃 박스/받은 편지함 구현.
보존/압축이 문서화되어 있으며, 리플레이는 소비자를 방해하지 않습니다.
ISR/URP (Kafka) 및 Raft/disk 한계 (Rabbit) 에 대한 경고가 설정됩니다.
이벤트 계약은 다양하며 (Schema Registry) 호환성은 CI에서 테스트됩니다.
정규 게임 일: 노드/브로커/AZ 고장, 복구 점검.
14) 구성 요소의 예 (요약)
RabbitMQ: 접두사 및 확인 (의사 코드):python channel. basic_qos(prefetch_count=200)
for msg in consume("tasks"):
try:
handle(msg)
channel. basic_ack(msg. delivery_tag)
except Transient:
channel. basic_nack(msg. delivery_tag, request = False) # will go to DLQ
카프카 소비자 (아이디어):
java props. put("enable. auto. commit","false");
props. put("isolation. level","read_committed"); // при EOS
//...
poll -> process(idempotent) -> commitSync()
15) 결론
RabbitMQ와 Kafka는 명령/작업 및 장기 이벤트 로그 및 확장 가능한 스트리밍에 대한 풍부한 라우팅과 같은 다양한 클래스의 문제를 해결합니다. 성공-올바른 전달 의미론, dempotence, 사려 깊은 키잉, retrays/DLQ, 관찰 성 및 엄격한 보안 분야에서. 아웃 박스/받은 편지함, 스키마 및 GitOps 정책과 같은 대기열을 중심으로 엔지니어링 관행을 구축하면 통합이 예측 가능하고 확장 가능하며 지속 가능해집니다.