Biblioteca C/C++ do Ticketing
GitHubAinda não registrado no registro oficial do vcpkg — os requisitos de submissão são rígidos e o registro ainda está em andamento. Por enquanto, clone o repositório do Github acima e compile por conta própria.
Repositório
Exemplo
Exemplo básico
Crie um broker ao iniciar a aplicação e compartilhe-o. wait=0 é uma tentativa imediata sem fila, máximo 255 s; lease é 1–250 s. O minimum-work budget final é obrigatório e pode ser zero. Frações de segundo são arredondadas para cima e valores fora do intervalo ou budget acima do lease normalizado são rejeitados antes do envio, nunca clampados.
#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);
/* In the same DB transaction: verify/update token high-water and perform the business write. */
ticketing_release(ticket, NULL);
}Close/drop automático é release bounded best-effort. Use a API de release explícito se o resultado importar. O token deve aplicar fencing ao write DB protegido na mesma transaction.
Bom saber (comportamento)
- Se um byte puder ter sido enviado, perder a resposta definitiva produz Indeterminate. Não há reenvio automático de
Acom o mesmo owner; o caller não entra na seção crítica. - Cancel antes de send é unsent; após possible-send fecha a sessão. Se grant token foi parseado em paralelo, tenta release compensatório exact-token limitado.
M, todoEe respostas malformed/oversized/unknown são session-fatal. Acquires possible-send não resolvidos ficam Indeterminate.Bé rejeição definitiva de capacity e retorna imediatamente. Sem retry interno; caller pode iniciar acquire novo com owner novo e backoff da aplicação.- Releases explícitos/compensatórios tentam exact token só por 5 segundos absolutos desde call/enqueue.
Rsucesso,Nausente/não atual; sem resposta final é erro, nunca sucesso presumido. - Ticket só é entregue com tempo conservador positivo suficiente para work budget. Trabalho acima de 250 s é unsupported antes de enviar.
- Fencing DB com token é obrigatório: na mesma transaction rejeite
token <= stored_high_water, atualize high-water e faça business write antes de commit/rollback e release.
Opções de segurança (Token · TLS)
Toda opção é opcional. token deve corresponder ao client_tokens do servidor, e o TLS tem quatro modos: desligado / repositório de confiança do sistema / uma CA especificada / pular verificação (apenas para testes).
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" | caminho para um arquivo de CA */
};
ticketing_result error;
ticketing_broker *broker = ticketing_connect_with(addrs, 3, &options, &error);Você pode gerar a configuração de token, TLS e cluster do lado do servidor na página Implantação do Servidor Ticketing.