자본시장과 결제 · 시세 피드 — 순번과 지연 · 실습
시세 피드의 갭과 지연 다루기
목표
시세 피드 캡처에서 빠진 것과 늦게 온 것을 구분하고, A/B 중재로 메울 수 있는 것과 진짜 구멍을 가르고, 지연을 백분위수로 재어 꼬리가 몰린 구간을 짚고, 복구 방식을 구간마다 정할 수 있게 됩니다.
왜 중요한가
시세 피드는 순서도 도착도 보장하지 않는 전송 위에 올라가 있습니다. 그래서 받는 쪽이 순번으로 판정해야 하는데, 판정 방식이 틀리면 그 실수가 조용히 넘어가지 않고 회선을 막습니다. 도착 순서로 갭을 세면 실제보다 다섯 배 넘게 나오고, 그 숫자만큼 재전송을 요청하면 요청 트래픽이 지연을 키우고 지연이 재정렬을 키워 갭이 더 보입니다.
이 실습이 강제하는 네 가지는 전부 현장의 규칙입니다. 갭은 집합으로 판정한다 — 늦게 온 것은 빠진 것이 아니고, 이 둘을 도착 순서로는 구분할 수 없습니다. 재전송 전에 다른 채널을 본다 — 이중화가 있는 이유가 그것이고, 요청 없이 메워지는 비율이 압도적입니다. 지연은 꼬리로 본다 — 평균은 두 세계를 섞어 하나의 숫자로 만들어 버립니다. 계산 방식을 파일에 적는다 — 백분위수 정의가 다르면 같은 데이터로 다른 결론이 나오고, 그때부터는 데이터 이야기가 아니라 정의 이야기가 됩니다.
이번 캡처는 2026-08-27 개장 직후 약 11분간의 것입니다. 거래소가 내보낸 원본은 순번 1부터 12000까지 빈 곳이 없고, 우리는 그것을 A·B 두 채널로 받았습니다. 두 채널은 각각 유실을 겪었고, 개장 직후와 09:08 분경에 지연이 크게 튀었습니다.
백분위수는 이렇게 계산합니다 — 최근접 순위. 값을 오름차순으로 정렬한 뒤 idx = ceil(p * n / 100) 번째 값을 취합니다(1부터 셉니다). 파이썬 정수로는 lat[(p*n + 99)//100 - 1] 입니다. 평균은 합을 건수로 나눈 뒤 버립니다. 지연 분석은 채널 A 만 대상으로 하고, 같은 seq 가 여러 번 왔으면 가장 먼저 도착한 한 건만 씁니다.
단계
1. /root/cap/feed 를 만들고 정답지의 생성기를 그대로 돌려 /root/cap/feed/feed.jsonl 을 만드세요. 씨앗을 바꾸면 채점 값과 어긋납니다.
2. /root/cap/feed/shape.txt 에 일곱 줄을 적으세요. lines=, ch_a_lines=, ch_b_lines=, ch_a_unique=, ch_b_unique=, ch_a_dup=, seq_max= 입니다.
3. /root/cap/feed/gaps.txt 에 arrival_jumps_a=, missing_a=, missing_b=, gap_runs_a= 를 적고, /root/cap/feed/gaps_a.csv 에 채널 A 가 못 받은 순번을 연속 구간으로 묶어 from_seq,to_seq,count 머리글과 함께 적으세요.
4. /root/cap/feed/arb.txt 에 recoverable_from_b=, true_holes=, hole_runs= 를 적고, /root/cap/feed/holes.csv 에 양쪽 다 못 받은 구간을 from_seq,to_seq,count 로 적으세요.
5. /root/cap/feed/latency.txt 에 method=nearest_rank 와 n=, p50_us=, p95_us=, p99_us=, max_us=, mean_us= 를 적으세요.
6. ts_send 의 분으로 버킷을 나눠 /root/cap/feed/tail.csv 에 minute,n,mean_us,p99_us,over_10ms 를 적고, /root/cap/feed/tail.txt 에 worst_minute=, worst_p99_us=, over_10ms_total=, burst_minutes= 를 적으세요. minute 은 09:00 을 0으로 하는 정수이고 burst_minutes 는 평균이 10ms 를 넘는 분을 쉼표로 잇습니다.
7. /root/cap/feed/retx.csv 에 진짜 구멍 구간마다 from_seq,to_seq,count,action 을 적으세요. 연속 5개 이상이면 snapshot, 미만이면 retransmit 입니다. /root/cap/feed/retx.txt 에 retransmit_runs=, retransmit_seqs=, snapshot_runs=, snapshot_seqs= 를 적습니다.
8. /root/cap/feed/report.md 에 보고서를 쓰세요. ## 무슨 일이 있었나, ## 갭, ## 지연, ## 돈으로 얼마인가, ## 무엇을 고쳐야 하나 다섯 절이 필요합니다.
참고
- 시각은 마이크로초까지 있습니다. 문자열 자르기로 읽으면 부동소수점을 거치지 않아 안전합니다.
- 이 캡처의 분 버킷은 0부터 10까지 열한 개입니다.
- 흔한 실수 1: 3단계에서 파일을 도착 순서대로 훑으며 갭을 세는 것. 그 숫자는 재전송 요청 대상이 아닙니다.
- 흔한 실수 2: 5단계에서 중복을 빼지 않는 것. 재전송으로 두 번 온 건까지 세면 분포가 흔들립니다.
- 흔한 실수 3: 6단계에서 채널 B 까지 섞어 세는 것. 두 채널은 경로가 달라 지연 분포도 다릅니다.
단계 8개
- A/B 이중화 피드 캡처 만들기
- 채널별 수신 건수와 중복 세기
- 빠진 것과 늦은 것 구분하기
- B 채널로 메우고 진짜 구멍만 남기기
- 지연 백분위수 내기
- 꼬리가 몰린 구간 짚기
- 재전송과 스냅샷 나누기
- 피드 품질 보고서 쓰기