JetStream Multi-Subject InterestPolicy PoC

검증 목적

JetStream의 InterestPolicy스트림에 등록된 모든 consumer가 ack하면 메시지를 삭제한다.

그런데 consumer마다 FilterSubjects가 다를 때 — 즉, 특정 subject를 구독하지 않는 consumer가 있을 때 — 그 consumer의 존재가 해당 subject 메시지의 삭제 조건에 영향을 주는지 확인한다.

핵심 질문: subject2를 구독하지 않는 ConsumerC가 내려가 있을 때, subject2 메시지는 삭제되는가?

(실제 비즈니스 구성과 같이 복잡한 사례에도 적용을 할려고 일부러 이런 복잡한 시나리오를 구성해서 테스트를 했습니다)


구성

Stream

항목
이름 multiSubjectSink
Subjects test.subject1, test.subject2, test.subject3
Retention InterestPolicy
Storage FileStorage

Consumer 구독 관계

Consumer FilterSubjects 의미
ConsumerA (serviceA) subject1, subject2 subject3에는 관심 없음
ConsumerB (serviceB) subject1, subject2 subject3에는 관심 없음
ConsumerC (serviceC) subject1, subject3 subject2에는 관심 없음
             subject1  subject2  subject3
serviceA  →    ✅        ✅        ✗
serviceB  →    ✅        ✅        ✗
serviceC  →    ✅        ✗        ✅

테스트 시나리오 및 결과

Phase 1 — 전체 서비스 가동, 모든 subject에 발행

시나리오: A, B, C 모두 가동 → subject1·2·3에 각 3개 발행

예상: 각 consumer는 자신의 FilterSubjects에 해당하는 메시지만 수신·ack → 전부 삭제

결과:

Stream.Msgs = 0
ConsumerA: NumPending=0, NumAckPending=0
ConsumerB: NumPending=0, NumAckPending=0
ConsumerC: NumPending=0, NumAckPending=0