Ankusa는 Stripe, GitHub, Shopify 등에서 들어오는 웹훅을 먼저 저장하고 Kafka, RabbitMQ, NATS JetStream, SQS, Google Pub/Sub, Redis pub/sub 또는 HTTP로 전달하는 수집 인프라다. 2xx 응답은 설정한 저장 조건을 충족했을 때만 보내며, 전달 재시도와 실패 메시지 보관·재전송 기능을 제공한다.
Ankusa는 컨테이너로 실행하고 YAML에서 소스별 서명 검증, 전달 대상, 재시도 정책, 속도 제한, 중복 제거와 라우팅을 설정한다. 한 소스를 여러 대상으로 전달할 수 있으며, 큰 본문은 큐 메시지에 직접 싣는 대신 claim check 방식으로 가져오게 할 수 있다. 소비자는 원하는 언어로 작성할 수 있다.
wal.type 설정에 따라 응답 전 보장하는 저장 범위가 달라진다. 기본값 disk는 노드의 로컬 저장소에 기록하고 디스크 동기화가 끝난 뒤 응답한다. 호스트를 잃으면 마지막 백업 이후 승인한 웹훅을 잃을 수 있으며, 백업이 꺼져 있으면 해당 노드의 승인 데이터가 모두 손실될 수 있다. dual은 로컬 기록에 더해 Kafka 수집 로그의 확인도 요구한다. 이를 사용하려면 Kafka의 replication.factor를 3 이상, min.insync.replicas를 2 이상으로 설정하고 백업을 켜야 한다. none은 요청 처리 중 모든 싱크의 확인을 기다리며, 재시도는 제공자가 맡는다.
어느 모드에서든 설정한 저장 보장을 지킬 수 없으면 Ankusa는 2xx 대신 503과 Retry-After를 반환한다. 전달은 최소 한 번(at-least-once) 이뤄지므로 소비자는 멱등성 키를 기준으로 중복을 처리해야 한다. 백업은 기본적으로 꺼져 있으며, 활성화하면 저장소 체크포인트와 수집 오프셋을 객체 저장소에 기록한다. Prometheus용 /metrics를 제공하지만 OpenTelemetry 추적과 구조화된 JSON 로그는 아직 지원하지 않는다.
시작은 Docker 이미지와 예제 설정을 이용할 수 있다. 기본 설정에는 인증 없이 요청을 받아 기록하는 demo 소스가 포함돼 있어, 실제 제공자 인증 정보를 넣기 전에도 수집 흐름을 시험할 수 있다. 다중 노드 구성에서는 각 노드가 별도의 저장소와 데이터 볼륨을 사용하며, 필요하면 Redis로 라우트·소스와 일부 제한 설정을 공유한다. 자세한 설치와 구성은 빠른 시작 안내와 배포 문서를 참고할 수 있다.
코드와 예제는 Ankusa 저장소에서 확인할 수 있다.
댓글 (0)
로그인하면 이 기사에 내 생각을 남길 수 있어요