자본시장과 결제 · 장애 뒤 재처리에서 주문을 두 번 내지 않기 · 실습
재시작한 프로세스가 같은 주문을 다시 냈다
목표
죽었다 살아난 전송 프로세스의 체크포인트와 전송 로그에서 재처리 구간을 찾고, 거래소 접수 확인과 대조해 실제로 두 번 접수된 주문만 골라낸 뒤, 결정적 주문 id 와 중복 제거 창 길이를 자료에서 구해 복구 절차서를 남깁니다.
왜 중요한가
재처리는 없앨 수 없습니다. 체크포인트를 보낸 뒤에 저장하면 죽었을 때 그 구간이 다시 나가고, 보내기 전에 저장하면 그 구간이 빠집니다. 둘 사이에 안전한 지점이 없기 때문에, 전송 경로는 대개 다시 보내는 쪽을 고르고 중복은 받는 쪽에서 거릅니다. 거르려면 같은 신호가 몇 번을 다시 읽혀도 같은 주문 id 를 내야 하는데, 실행마다 새로 매기는 일련번호나 시각을 섞은 id 는 그 조건을 깨뜨립니다. 그리고 정정과 취소는 이전 id 를 가리키므로, id 규칙이 흔들리면 사슬까지 끊어져 취소하려던 주문이 남습니다.
단계
1. python3 로 /root/cap/replay/data 에 여섯 개 자료 파일을 만듭니다. 생성 스크립트를 그대로 쓰세요.
2. 체크포인트와 전송 로그를 견줘 재처리 구간을 /root/cap/replay/crash.txt 에 적습니다.
3. 그 구간에서 다시 나갈 주문을 /root/cap/replay/replay.csv 와 /root/cap/replay/replay.txt 에 적습니다.
4. 신호의 안정된 필드만으로 주문 id 를 만들어 /root/cap/replay/clordid.csv 와 /root/cap/replay/idcheck.txt 에 적습니다.
5. 접수 확인과 대조해 두 번 받아들여진 주문을 /root/cap/replay/dup.csv 와 /root/cap/replay/dup.txt 에 적습니다.
6. 체크포인트 저장 시점 두 가지를 각각 계산해 /root/cap/replay/modes.csv 에 한 줄씩 적습니다.
7. 원주문을 가리키지 못하는 취소와 정정을 /root/cap/replay/broken.csv 와 /root/cap/replay/broken.txt 에 적습니다.
8. 중복 제거 창 길이를 /root/cap/replay/window.txt 에, 복구 절차서를 /root/cap/replay/runbook.md 에 남깁니다.
참고
- 자료는
/root/cap/replay/data에 있습니다.signals.jsonl은 오프셋이 붙은 입력 신호,sent.csv는 실제로 나간 주문 메시지,acks.jsonl은 거래소 접수 확인,checkpoint.json은 어디까지 커밋했는지,incident.json은 죽은 시각과 살아난 시각,policy.json은 주문 id 규칙과 커밋 주기입니다. - 시각은 전부 자료에 못박혀 있습니다.
date로 오늘을 쓰면 같은 자료에서 날마다 다른 답이 나옵니다. - 주문 id 규칙은
policy.json의clordid에 있습니다.fields를 그 차례대로sep으로 이어 붙여hash로 요약하고, 앞hex_len글자만 잘라prefix를 붙입니다. 값은 모두 문자열로 바꿔 잇습니다. intent가hold인 신호는 문턱을 못 넘어 주문이 나가지 않았습니다. 신호 수와 주문 수는 다릅니다.- 흔한 실수 1: 전송 로그만 보고 중복을 세는 것. 접수 확인에서 거절된 건은 거래소에 남지 않았으므로 이중 접수가 아닙니다.
- 흔한 실수 2: 6단계에서 배치 경계를 잊는 것. 체크포인트는 한 건마다가 아니라
commit_every건마다 저장됩니다. - 규격: [FIX Trading Community 표준](https://www.fixtrading.org/standards/), [FIXimate](https://fiximate.fixtrading.org/) 에서
ClOrdID와OrigClOrdID의 뜻을 확인할 수 있습니다. 이 실습의 종목 코드와 실행 이름은 모두 합성입니다.
단계 8개
- 장애가 남긴 자료 만들기
- 어디부터 다시 읽었는지 찾기
- 그대로 재시작하면 무엇이 다시 나가는지 세기
- 다시 읽어도 같은 주문 id 만들기
- 정말 두 번 받아들여진 주문만 남기기
- 체크포인트를 언제 저장하느냐로 갈리는 것
- 취소가 가리키던 주문이 사라졌다
- 중복 제거 창을 자료에서 구하고 절차서 쓰기