ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Cloudflare Queues][비교] preview는 비었는데 oldest_message_timestamp_ms가 남을 때 replay aftercare와 metrics 지연을 어떤 reopen 기준으로 나누나
    기타개발지식/풀스택개발 2026. 9. 4. 09:13

    IT 리서치 노트

    [Cloudflare Queues][비교] preview는 비었는데 oldest_message_timestamp_ms가 남을 때 replay aftercare와 metrics 지연을 어떤 reopen 기준으로 나누나

    Cloudflare Queues에서 replay success 뒤 preview는 비어 보이는데 backlog 지표가 남아 있으면 많은 팀이 같은 aftercare 메모 안에서 close와 reopen을 동시에 고민하게 된다. 하지만 2026년 9월 4일 기준 Cloudflare 공식 문서를 다시 보면 preview fetch는 queue 상태를 바꾸지 않는 읽기 경로이고, backlog metrics는 point-in-time 값이며, oldest_message_timestamp_ms는 별도 필드로 구조화해 남길 수 있다. 이 글은 preview는 비었는데 oldest_message_timestamp_ms가 남을 때 replay aftercare와 metrics 지연을 어떤 reopen 기준으로 나눠야 하는지 정리한다.

    1. 개요

    결론부터 말하면 preview가 비었다는 사실과 oldest_message_timestamp_ms가 남아 있다는 사실은 같은 완료 신호가 아니다. preview empty는 현재 읽은 표본이 비어 있다는 뜻이고, metrics tail은 queue 상태를 다른 시점에서 본 point-in-time 증거다. 따라서 replay aftercare에서는 preview_checked_at과 metrics_rechecked_at을 다른 필드로 남기고, 둘이 동시에 0에 가까워질 때만 close 후보로 올리는 편이 맞다.

    특히 replay 직후 reviewer signoff가 끝났더라도 backlog metrics가 남아 있으면 close가 아니라 watch 또는 reopen 보류가 더 안전하다. 이미 preview 재확인과 oldest_message_timestamp_ms 글을 읽었다면, 이번 글은 그 값을 언제 metrics lag로 보고 언제 실제 tail로 보고 다시 여는지의 기준을 덧붙이는 단계다.

    2. 어디서 실제로 막히는가

    현장에서 가장 흔한 실패는 preview empty를 보고 곧바로 incident를 닫는 것이다. preview fetch는 acknowledge나 retry를 일으키지 않는 읽기 경로라서 안전한 재확인 수단이지만, 그 순간에 읽힌 일부 메시지 묶음이 비었다는 사실만 알려 준다. 반대로 backlog metrics는 API와 dashboard에서 point-in-time 값으로 보이기 때문에, 읽은 시각이 다르면 같은 queue라도 서로 다른 상태를 보여 줄 수 있다.

    두 번째 실패는 metrics 값이 남았는데도 단순 지연인지 실제 tail인지 구분하지 않는 것이다. replay 직후 일시적으로 backlog_count나 oldest_message_timestamp_ms가 남아 있을 수 있는데, 이때 바로 reopen을 선언하면 운영 메모가 과장되고 reviewer signoff 이유도 다시 설명해야 한다. 반대로 실제 tail인데도 metrics lag라고 단정하면 재전달이 남은 상태를 놓친다.

    세 번째 실패는 preview 결과와 metrics 재조회 시각을 같은 문장에 섞어 적는 것이다. 이러면 다음 교대자가 '언제 비어 있었고, 언제 숫자가 남아 있었는지'를 다시 추적해야 한다. replay success, preview checked, metrics rechecked, signoff, reopen hold는 각각 다른 이벤트이므로 필드도 분리해야 한다.

    • 증상: preview는 비었는데 backlog 지표가 계속 남는다.
    • 실패: preview empty를 close 완료 신호로 곧바로 본다.
    • 막힘: metrics tail이 지연인지 실제 잔존 메시지인지 구분하지 않는다.
    • 누락: preview 재확인 시각과 metrics 재조회 시각을 따로 남기지 않는다.
    겉으로 보이는 상태 바로 내리기 쉬운 오판 실제로 더 봐야 할 값
    preview empty 완전히 비었으니 close 가능 metrics 재조회 시각과 backlog_count
    oldest_message_timestamp_ms 잔존 무조건 reopen 필요 다음 재조회에서 감소하는지 확인한다
    reviewer signoff 완료 사람이 승인했으니 상태도 종료 queue 기준 근거가 같은 시각에 남았는지 본다

    3. 실무에서 적용하는 순서

    실무 적용 순서는 다섯 단계가 가장 짧다. 먼저 replay success 시각을 저장한다. 다음으로 preview fetch를 실행해 결과가 empty인지 메시지 visible인지 남긴다. 세 번째로 backlog metrics를 다시 조회해 backlog_count와 oldest_message_timestamp_ms를 적는다. 네 번째로 reviewer signoff가 있더라도 metrics와 다른 시각이면 close 대신 watch를 유지한다. 마지막으로 다음 재조회에서 metrics가 떨어지는지 보고 reopen 또는 close를 결정한다.

    1. replay success 시각을 먼저 저장한다.
    2. preview fetch 결과를 empty 또는 visible로 기록한다.
    3. metrics를 재조회해 backlog_count와 oldest_message_timestamp_ms를 저장한다.
    4. reviewer signoff와 metrics 시각을 같은 값으로 합치지 않는다.
    5. 다음 재조회 결과로 reopen 또는 close를 결정한다.

    이 순서를 따르면 preview empty와 metrics tail을 같은 문제로 섞지 않게 된다. 예를 들어 preview empty인데 metrics도 바로 0으로 떨어지면 close 후보다. preview empty인데 oldest_message_timestamp_ms가 남아 있으면 watch 메모를 남기고 한 번 더 재조회한다. preview에 메시지가 다시 보이거나 metrics가 오르면 reopen이 맞다.

    preview_result=empty
    preview_checked_at=2026-09-04T09:16:10+09:00
    metrics_rechecked_at=2026-09-04T09:17:00+09:00
    backlog_count=1
    oldest_message_timestamp_ms=1756944960000
    closure_state=watch-metrics-tail-before-reopen

    핵심은 preview 결과, metrics 값, reviewer signoff를 같은 완료 칸으로 합치지 않는 것이다. 이미 approval timestamp와 replay result 글이 close 직전 증거를 다뤘다면, 이번 기준은 success 뒤 남은 애매한 상태를 더 짧게 설명하는 역할을 한다.

    4. 공식 문서와 예시 화면으로 확인하기

    첫 자료는 Cloudflare Queues metrics 문서다. 여기서는 backlog 지표가 집계 평균이 아니라 point-in-time 값이라고 설명한다.

    Cloudflare backlog metrics는 point-in-time 값이므로 preview 결과와 같은 의미로 합치면 안 된다.
    Cloudflare backlog metrics는 point-in-time 값이므로 preview 결과와 같은 의미로 합치면 안 된다.

    즉 preview가 비어 보여도 metrics가 남아 있다면 먼저 지표 지연인지 실제 tail 잔존인지 나눠야 한다. replay success 뒤 reopen 기준을 세울 때 이 문장을 출발점으로 두는 편이 맞다.

    두 번째 자료는 dashboard preview 문서다. preview fetch는 메시지를 acknowledge하거나 retry하지 않는 읽기 경로라고 적혀 있다.

    preview는 queue 상태를 바꾸지 않는 읽기 경로라 aftercare 재확인 근거로 쓰기 좋다.
    preview는 queue 상태를 바꾸지 않는 읽기 경로라 aftercare 재확인 근거로 쓰기 좋다.

    따라서 preview empty는 운영자가 지금 본 표본이 비어 있다는 뜻이지, backlog 지표가 완전히 0이 되었다는 뜻은 아니다. 이 둘을 같은 완료 신호로 두면 reopen 메모가 길어진다.

    세 번째 자료는 pull messages API 문서다. oldest_message_timestamp_ms는 자유문장이 아니라 응답 필드로 남길 수 있는 값이라는 점이 중요하다.

    oldest_message_timestamp_ms는 backlog tail 존재 여부를 구조화해 남길 수 있는 실제 필드다.
    oldest_message_timestamp_ms는 backlog tail 존재 여부를 구조화해 남길 수 있는 실제 필드다.

    preview empty와 별도로 이 필드를 재조회해 두면 reopen 판단이 감에 기대지 않는다. aftercare row에서 preview 결과와 metrics 결과를 분리해야 하는 이유가 여기서 더 분명해진다.

    실무에서는 replay success 뒤 preview empty를 보고 바로 close하려는 유혹이 크다. 아래 표는 preview 결과와 metrics 결과를 언제 다른 reopen 신호로 나눌지 정리한 예시다.

    preview 결과와 metrics 결과를 분리하면 replay aftercare의 reopen 기준이 짧아진다.
    preview 결과와 metrics 결과를 분리하면 replay aftercare의 reopen 기준이 짧아진다.

    이미 preview 재확인과 oldest_message_timestamp_ms 글이 첫 분기를 다뤘다면, 이번 표는 reviewer signoff와 backlog snapshot 글 다음 단계인 reopen 기준 고정판이다.

    마지막 자료는 aftercare 메모 예시다. 핵심은 preview 결과와 metrics 재조회 시각을 다른 필드로 남기는 것이다.

    aftercare note에는 preview_empty와 metrics_rechecked_at을 따로 적는 편이 좋다.
    aftercare note에는 preview_empty와 metrics_rechecked_at을 따로 적는 편이 좋다.

    이 구조를 쓰면 reviewer signoff가 있었더라도 왜 reopen을 보류했는지 다시 설명하기 쉬워진다. 같은 queue incident를 다음 교대자가 이어받을 때도 어떤 값이 아직 남았는지 바로 보인다.

    5. 주의사항과 리스크

    첫 번째 리스크는 metrics가 point-in-time 값이라는 사실을 잊고 preview empty만으로 close를 결정하는 것이다. 두 번째 리스크는 metrics가 남았다는 이유만으로 곧바로 reopen을 선언해 운영 메모를 과장하는 것이다. 세 번째 리스크는 reviewer signoff 시각과 metrics 재조회 시각을 섞어 다음 교대자가 시간축을 다시 복원하게 만드는 것이다.

    운영 note에는 최소한 preview_checked_at, preview_result, metrics_rechecked_at, backlog_count, oldest_message_timestamp_ms, closure_state를 남기는 편이 좋다. 그래야 close를 했는지, watch를 유지했는지, reopen을 했는지가 숫자와 시각으로 같이 보인다.

    • preview empty와 metrics tail은 같은 완료 신호가 아니다.
    • reviewer signoff보다 queue 근거 시각을 따로 적는다.
    • metrics 재조회 한 번 없이 reopen 또는 close를 서두르지 않는다.

    6. 결론

    Cloudflare Queues replay aftercare에서 preview가 비었는데 oldest_message_timestamp_ms가 남아 있을 때는 close와 reopen을 같은 문장으로 쓰지 않는 편이 맞다. preview는 읽은 표본의 결과이고 metrics는 queue 상태의 point-in-time 근거이므로, 두 값을 다른 필드로 남기고 재조회 흐름까지 적어 두어야 reopen 판단이 짧아진다.

    관련 흐름으로는 preview 재확인과 oldest_message_timestamp_ms 글과 reviewer signoff와 backlog snapshot 글을 같이 보면 close 직전과 reopen 보류 기준이 한 줄로 이어진다.

    • preview 결과와 metrics 결과를 다른 필드로 저장한다.
    • metrics 재조회 뒤에만 close 또는 reopen을 확정한다.
    • aftercare note에 시간축을 그대로 남긴다.

    7. 참고 링크

    1. https://developers.cloudflare.com/queues/observability/metrics/
    2. https://developers.cloudflare.com/queues/examples/list-messages-from-dash/
    3. https://developers.cloudflare.com/api/resources/queues/subresources/messages/methods/pull/
    4. https://developers.cloudflare.com/queues/configuration/dead-letter-queues/
Designed by Tistory.