결론부터
| 전 | 후 | |
|---|---|---|
| 가격 기록 방식 | 토큰마다 한 행 | 1분 실행마다 한 행(그 분의 가격을 묶어서) |
| 하루 쓰는 행 수 | 한도(10만 행) 초과 | 약 1,500행(한도의 1.5%) |
| 결과 | 약 7시간 기록 끊김 | 10월 19일부터 판정에 쓴 4,383분 동안 끊김 없음 |
- D1 무료 한도는 하루 쓰기 10만 행, 읽기 500만 행입니다. 넘으면 그날 한도가 다시 채워질 때까지 쿼리가 오류로 돌아옵니다.
- 한도는 UTC 0시(한국 시간 오전 9시)에 다시 채워집니다. 그래서 끊김은 한국 시간 새벽 2시 무렵부터 아침 9시까지 이어졌습니다.
1. 증상
밈코인 관찰기는 Cloudflare Workers에서 1분마다 돌며, 새로 발견한 토큰을 등록하고 추적 중인 토큰의 가격을 D1에 적습니다. 10월 17일 UTC 17시부터 자정까지 약 7시간 동안 기록이 비어 있었습니다.
비어 있던 시간이 UTC 자정에 딱 끝났다는 점이 단서였습니다. 하루 단위 한도가 다시 채워지는 시각과 같았기 때문입니다.
2. 원인: 행 수는 곱셈으로 늘어난다
처음에는 가격 기록을 "토큰 하나, 시각 하나 = 한 행"으로 저장했습니다. 이렇게 하면 하루에 쓰는 행 수는 추적 중인 토큰 수 × 하루 실행 횟수가 됩니다.
1분마다 돌면 하루 실행은 1,440번입니다. 추적하는 토큰이 70개만 돼도 70 × 1,440 = 100,800행으로 한도를 넘습니다. 새 토큰이 몰려 추적 목록이 길어지는 날이면 오후쯤 한도에 닿는 구조였습니다.
3. 해결: 1분에 한 행
- 묶음 표 만들기 — 실행 한 번(1분)마다 한 행을 쓰는 표를 따로 두었습니다. 그 분에 잰 토큰들의 가격과 유동성을 한 덩어리(JSON)로 담습니다.
- 분석할 때 펼치기 — 나중에 수익률을 계산할 때 이 덩어리를 풀어 토큰별 시계열로 다시 만듭니다.
- 간격은 그대로 — 토큰마다 처음 60분은 1분 간격, 4시간까지는 15분 간격, 24시간째 한 번 재는 설계는 유지했습니다. 바뀐 것은 저장하는 모양뿐입니다.
그 결과 가격 기록은 하루 약 1,500행, 한도의 1.5% 수준이 됐습니다. 토큰이 아무리 많아져도 1분에 한 행이라 늘어나지 않습니다.
4. 다음 병목: 가격 요청 거절
데이터베이스가 풀리자 다른 곳이 막혔습니다. 10월 22일, 따라 볼 지갑 100개를 추가하자 새로 추적하는 토큰이 시간당 약 300개로 늘었습니다. 추적 상한 150개에 걸렸고, 가격을 묻는 외부 API(Jupiter) 요청의 3분의 1이 "너무 많이 요청함(429)"으로 거절됐습니다.
- 추적 상한을 150개에서 500개로 올렸습니다.
- 가격 요청 사이에 0.7초 간격을 두었습니다.
- 거절되면 잠시 쉬었다가 다시 묻게 했습니다.
이후 383~392개를 추적하면서 거절은 0건이 됐습니다. 다른 출처(DexScreener)는 1분 실행의 약 절반에서 요청 한도 초과로 실패하는 문제가 남아 있습니다. 여러 사용자가 함께 쓰는 서버 주소가 막힌 것으로 추정하고 있으며, 원인은 아직 확인하지 못했습니다.
정리
- 매분 도는 작업은 "항목 수 × 1,440"으로 하루 쓰기를 먼저 계산해 봅니다. 무료 한도는 생각보다 빨리 닿습니다.
- 시계열 기록은 시각마다 한 행으로 묶어 쓰면 행 수가 항목 수와 상관없어집니다.
- 한 병목을 풀면 다음 병목이 나옵니다. 외부 API에는 요청 간격과 재시도를 처음부터 넣어 두는 편이 낫습니다.
이 관찰기로 무엇을 시험했는지는 밈코인 봇 전에 관찰기부터에 있습니다. 같은 D1을 아주 적게 쓰는 예는 구구단 순위 백엔드입니다.
자주 묻는 질문
한도를 넘으면 데이터가 지워지나요?
아닙니다. 이미 저장된 데이터는 그대로 있고, 한도가 다시 채워질 때까지 새 쿼리가 오류로 돌아옵니다. 그 사이에 기록하려던 내용이 빠질 뿐입니다.
유료로 바꾸면 해결되지 않나요?
Workers 유료 요금제로 바꾸면 이 하루 한도가 사라집니다. 다만 행 수가 곱셈으로 늘어나는 구조는 그대로라, 먼저 구조를 고치는 쪽을 택했습니다.
JSON으로 묶으면 조회가 불편하지 않나요?
데이터베이스 안에서 토큰 하나를 바로 찾기는 불편해집니다. 대신 쓰는 행 수가 토큰 수와 상관없어지는 이점이 훨씬 컸습니다.
한도에 가까워진 것을 미리 알 수 있나요?
Cloudflare는 무료 한도에 가까워지면 계정 메일로 사용량 경고를 보냅니다. 그 메일을 놓치지 않는 것이 가장 쉬운 방법입니다.