배경
메타 이슈 #515 의 Phase 2 Sub 4 — Parser stage 가 단일 토픽 (issuetracker.fetched) 소비 + Kafka partition FIFO 라서 priority sub-ordering 부재.
선택된 메커니즘: 옵션 2-C — Redis ZSET intermediate queue
변경 방향
인입 단계 (Kafka → Redis)
- Parser consumer 가
TopicFetched 메시지를 받으면 Redis ZSET 에 즉시 적재
- ZSET key:
parser:queue (단일) 또는 parser:queue:{priority} (priority 별 분리 — TBD)
- score 계산:
priority × 1e10 + arrival_timestamp_ms (낮을수록 먼저 처리)
- 적재 직후 Kafka commit — Kafka 가 buffer 가 아닌 transport 역할
처리 단계 (Redis → Worker)
인프라
- 기존
pkg/redis 활용
pkg/queue 에 PriorityZSetQueue 추상화 신설 (Validate/Enrich 가 재사용)
- 메트릭: queue depth / pop latency / priority 별 처리 비율
완료 조건
위험 / 롤백
- Redis 부하 증가 — 현재 BufferingProducer (normal/low) 가 사용 중이므로 capacity 사전 점검 필요
- ZSET overflow 시 정책: 최대 size 도달 → 가장 오래된 low priority 항목 drop + 로그
- 롤백: feature flag
PARSER_PRIORITY_QUEUE_ENABLED=false 로 기존 단일 토픽 경로 복귀
관련
배경
메타 이슈 #515 의 Phase 2 Sub 4 — Parser stage 가 단일 토픽 (
issuetracker.fetched) 소비 + Kafka partition FIFO 라서 priority sub-ordering 부재.선택된 메커니즘: 옵션 2-C — Redis ZSET intermediate queue
BufferingProducer/BufferDrainer패턴 재사용변경 방향
인입 단계 (Kafka → Redis)
TopicFetched메시지를 받으면 Redis ZSET 에 즉시 적재parser:queue(단일) 또는parser:queue:{priority}(priority 별 분리 — TBD)priority × 1e10 + arrival_timestamp_ms(낮을수록 먼저 처리)처리 단계 (Redis → Worker)
ZPOPMIN(또는 atomic LuaZRANGEBYSCORE + ZREM) 으로 popRawContentRefpayload 그대로 보존 (Claim Check 패턴 유지)bus.RetryScheduler경유 (PR [FEAT#512] BufferDrainer leader election + publish-fail Kafka 재시도 경로 #516 패턴 — Redis 가 아닌 Kafka 로 흐름)인프라
pkg/redis활용pkg/queue에PriorityZSetQueue추상화 신설 (Validate/Enrich 가 재사용)완료 조건
pkg/queue.PriorityZSetQueue신설 + Validate/Enrich 가 재사용 가능한 APIRetryScheduler경유 (Redis 잔존 아님).env.example갱신:PARSER_ZSET_QUEUE_KEY,PARSER_ZSET_POP_BATCH_SIZE,PARSER_ZSET_MAX_SIZE(overflow 방어)위험 / 롤백
PARSER_PRIORITY_QUEUE_ENABLED=false로 기존 단일 토픽 경로 복귀관련
internal/processor/parser/worker/— 1,241 LoC 변경 대상