Ticketing C/C++ 라이브러리
GitHub아직 vcpkg 공식 레지스트리에 등록되지 않았습니다 — 등록 절차가 까다로워 준비 중입니다. 지금은 위 Github 저장소를 직접 클론해 빌드해서 사용하세요.
리포지토리
bash
예제
간단한 예제
스레드 안전한 블로킹 C API입니다(C++에서도 그대로 사용). 브로커는 앱 시작 시 한 번 만들어 공유하면 되고, 연결·재접속·리더 추적은 알아서 처리됩니다. 시간은 초 단위(double)로, wait=0은 queue 없는 즉시 시도이고 최대 255초, lease는 1~250초입니다. 마지막 min_work_budget_secs는 필수이며 0도 허용됩니다. wire 초로 올린 뒤 범위 초과, lease 0, budget 250초 초과 또는 정규화한 lease 초과는 송신 전에 TICKETING_ERR_INVALID_INPUT으로 거부하며 값을 잘라 맞추지 않습니다.
c
#include <ticketing/ticketing.h>
const char *addrs[] = {"127.0.0.1:5225"};
ticketing_broker *broker = ticketing_connect(addrs, 1);
ticketing_wait_ready(broker, 5);
ticketing_ticket *ticket = NULL;
if (ticketing_acquire(broker, "key", 5.0, 30.0, 2.0, &ticket) == TICKETING_OK) {
uint64_t token = ticketing_ticket_token(ticket);
/* 같은 DB transaction에서 token high-water 검사/갱신과 업무 write */
ticketing_release(ticket, NULL);
}ticketing_release와 ticketing_close(백그라운드 반납) 모두 티켓을 해제하므로 별도의 free가 필요 없습니다.
알아 두면 좋은 동작
- 송신 뒤 확정 응답을 잃으면
TICKETING_ERR_INDETERMINATE입니다. 같은 owner로 자동 재전송하지 않으며 임계 구역에 들어가면 안 됩니다. - acquire는 공개 취소 인자가 없는 blocking API입니다.
pthread_cancel이나 thread 강제 종료를 안전한 취소 경로로 지원하지 않습니다. M, 모든E, malformed 응답은 session-fatal이며 unresolved possible-send acquire는TICKETING_ERR_INDETERMINATE입니다.TICKETING_ERR_BUSY는 server capacity의 확정 미획득이며 즉시 반환됩니다.- 명시적·보상 반납은 호출 또는 queue 등록 시점부터 계산한 절대 5초 deadline 안에서만 정확한 token으로 재시도합니다.
R은 성공,N은 이미 없거나 현재 token이 아님이 확정된 결과이고, deadline까지 최종 응답이 없으면 성공으로 가장하지 않고 오류를 반환합니다. TICKETING_ERR_INSUFFICIENT_LEASE면 알려진 정확한 token으로 보상 반납을 시도하고 Ticket을 전달하지 않습니다.ticketing_ticket_conservative_remaining()은 보수적인 local 보조값이며 fencing을 대신하지 않습니다.ticketing_ticket_token()은uint64_t펜싱 토큰입니다. DB high-water와 업무 write를 같은 transaction에서 처리하고 DB 작업 종료가 확인된 뒤 반납합니다.
보안 옵션 (토큰 · TLS)
옵션은 모두 선택입니다. token은 서버의 client_tokens와 맞추고, TLS는 끔 / 시스템 신뢰 저장소 / CA 지정 / 검증 생략(테스트 전용) 네 가지 모드입니다.
c
const char *addrs[] = {"10.0.0.1:5225", "10.0.0.2:5225", "10.0.0.3:5225"};
ticketing_options options = {
.token = "123",
.tls = "system-roots", /* NULL(off) | "insecure-skip-verify" | CA 파일 경로 */
};
ticketing_result error;
ticketing_broker *broker = ticketing_connect_with(addrs, 3, &options, &error);서버 쪽 토큰·TLS·클러스터 구성은 Ticketing 서버 배포에서 만들 수 있습니다.