큐와 비동기 API · 큐 설계(순서·중복·유실) · 퀴즈
퀴즈: 큐 설계
문항 6개. 정답과 해설은 풀어 본 뒤에 보여 드립니다.
`BRPOP` 으로 만든 큐가 메시지를 잃는 순간은?
- Redis 가 데이터를 정상 저장하고 재시작할 때
- 메시지를 꺼낸 뒤 처리 중에 소비자가 죽을 때
- 큐가 가득 찰 때
- TTL 이 만료될 때
`LMOVE` 를 쓰는 이유는?
- 명령 한 번으로 끝나 왕복이 줄고 더 빨라서
- 꺼내기와 처리 중 목록 등록을 원자적으로 해서 유실 창을 없애려고
- 처리 중 목록을 따로 두지 않아 메모리를 아끼려고
- 여러 소비자 사이에서도 순서를 보장하려고
Redis Stream 에서 `XREADGROUP` 으로 읽은 메시지는 어디에 남나?
- 확인응답 없이도 즉시 사라진다
- 실패로 간주돼 DLQ 스트림으로 간다
- PEL 에 남고 XACK 해야 지워진다
- 복제본에만 남고 마스터에서는 지워진다
소비자를 2대로 늘리면 FIFO 순서는?
- 보장되지 않는다 — 두 소비자의 처리 완료 순서를 알 수 없다
- 그대로 보장된다
- Redis 가 자동으로 보장한다
- 스트림이면 보장된다
스트림에 `MAXLEN` 을 걸지 않으면?
- 엔트리가 늘어 XRANGE 읽기가 느려진다
- XACK 해도 엔트리가 남아 메모리가 계속 자란다
- 오래된 엔트리부터 밀려나 순서가 깨진다
- 길이를 몰라 소비자 그룹을 만들 수 없다
여러 서비스가 같은 이벤트를 각자 소비해야 할 때 리스트 큐가 부적합한 이유는?
- 리스트는 한 번 꺼내면 사라져 다른 소비자가 같은 메시지를 볼 수 없어서
- 소비자가 늘수록 꺼내는 속도가 급격히 느려져서
- 소비자마다 사본이 생겨 메모리를 많이 써서
- 리스트 원소에 TTL 이 없어 메시지가 쌓이기만 해서