JSONL Store
예약 작업이 이미 수행한 작업(발송된 알림, 처리된 ID, 캡처된 이벤트)을 기억해야 하지만 데이터베이스를 사용하기에는 과할 때 이 스킬을 사용하세요. JSON Lines(줄당 하나의 JSON 객체)는 추가에 친화적이며, 사람이 읽을 수 있고, grep으로 검색 가능하며, 전체 파일을 로드하지 않고 스트리밍 방식으로 읽을 수 있습니다. 이 도우미는 원자적 추가, 손상된 줄에서도 복구되는 스트리밍 읽기, 그리고 동일한 ID가 실행 간에 두 번 기록되지 않도록 하는 append_unique(record, key)를 제공합니다.
호출 시점
- 사용자가 "JSONL 파일에 결과 기록", "디스크에 이벤트 추가", "실행 간 ID 중복 제거", "데이터베이스 없이 간단한 히스토리 유지"라고 말할 때.
- 크론/예약 스크립트가 플랫 파일에서 실행 간 상태를 지속적으로 유지해야 할 때.
호출하지 말아야 할 때
- 쿼리, 인덱스 또는 동시 쓰기가 필요한 경우 - SQLite(
sqlite-state) 또는 실제 데이터베이스를 사용하세요. - 레코드가 크거나 바이너리인 경우 - JSONL은 작은 구조화된 행을 위한 것입니다.
구체적인 예시
사용자 입력:
각 실행 후 새 알림을 alerts.jsonl에 추가하되, 동일한 알림 ID가 두 번 추가되지 않도록 하세요.
출력:
# assets/store.py를 프로젝트에 복사한 후:
from store import JsonlStore
store = JsonlStore("data/alerts.jsonl")
for alert in new_alerts:
if store.append_unique(alert, key="id"):
send(alert) # 이전 실행에서 보지 못한 ID에 대해서만 전송
print("히스토리 크기:", store.count())
읽기는 줄 단위로 스트리밍되므로 1년 치 히스토리도 메모리에 완전히 로드되지 않으며, 크래시로 인해 반쯤 쓰인 마지막 줄은 건너뛰어 다음 실행이 중단되지 않습니다.
적용 패턴
- 줄당 하나의 JSON 객체; 텍스트를 읽기 쉽게 유지하려면
ensure_ascii=False로 추가합니다. - 제너레이터로 스트리밍 읽기; 오류를 발생시키는 대신 빈 줄이나 손상된 줄을 건너뜁니다.
seen_keys(key)/append_unique(record, key)로 중복을 제거하여 실행을 멱등성 있게 만듭니다.- 스케줄러와 함께 사용하여 파일이 실행 간 지속적인 메모리 역할을 하도록 합니다.
참고: assets/store.py.
출처
작성자의 예약 봇 상태 처리에서 비롯되었습니다. v1.0.0. 참고: [[sqlite-state]], [[cron-dispatch]], [[pipeline-orchestrator]].
→ Trawlkit으로 완전한 실행 가능 봇을 구축하세요.