現在テスト中です: 完了後にGitHubのコードを公開する予定です。

Ticketing C/C++ライブラリ

GitHub

まだvcpkg公式レジストリには登録されていません — 登録要件が厳しく、申請手続きが進行中です。現時点では上記のGithubリポジトリをクローンしてご自身でビルドしてください。

リポジトリ

bash

基本的な例

brokerはapplication起動時に1つ作って共有します。wait=0はqueueなしの即時試行1回で最大255秒、leaseは1〜250秒です。最後のminimum-work budgetは必須で0も可能です。秒未満は切り上げ、範囲外または正規化lease超過budgetは送信前に拒否し、clampしません。

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);
    /* In the same DB transaction: verify/update token high-water and perform the business write. */
    ticketing_release(ticket, NULL);
}

自動close/dropはbounded best-effort releaseです。結果が必要ならexplicit release APIを使います。tokenは同じDB transactionで保護対象writeをfenceしなければなりません。

知っておきたい挙動

  • request byteを1つでも送った可能性があり確定応答を失うとIndeterminateです。同じownerでAを自動再送せず、callerはcritical sectionへ入りません。
  • 送信前cancelはunsent、possible-send後cancelはsessionを閉じます。同時にgrant tokenをparseした場合はboundedなexact-token補償releaseを試みます。
  • M、全てのE、malformed/oversized/unknown responseはsession-fatalです。未確定possible-send acquireはIndeterminateです。
  • Bはcapacityによる確定拒否で即時返却します。内部retryはなく、callerがapplication backoff後に新ownerで新acquireを開始できます。
  • explicit/compensating releaseはcall/enqueueから絶対5秒だけexact tokenを再試行します。Rは成功、Nは既にないかcurrent tokenでない状態、最終応答なしは成功と推定せずerrorです。
  • 正の保守的残り時間がありrequired work budgetを満たす場合だけTicketを返します。250秒超workは送信前にunsupportedです。
  • tokenによるDB fencingは必須です。同じDB transactionでtoken <= stored_high_waterを拒否し、high-water更新とbusiness writeを行ってcommit/rollback後にreleaseします。

セキュリティオプション(トークン · TLS)

すべてのオプションは任意です。tokenはサーバーのclient_tokensに合わせ、TLSはオフ / システム 信頼ストア / CA指定 / 検証省略(テスト専用)の4モードがあります。

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(オフ) | "insecure-skip-verify" | CAファイルへのパス */
};
ticketing_result error;
ticketing_broker *broker = ticketing_connect_with(addrs, 3, &options, &error);

サーバー側のトークン・TLS・クラスタ設定はTicketingサーバーデプロイ ページで生成できます。