Ticketing C/C++ مكتبة
GitHubلم يُسجَّل بعد في سجل vcpkg الرسمي — متطلبات التسجيل صارمة وعملية التسجيل ما زالت جارية. في الوقت الحالي، استنسخ مستودع Github أعلاه وابنِه بنفسك.
المستودع
مثال
مثال أساسي
أنشئ broker واحدًا عند بدء التطبيق وشاركه. wait=0 محاولة فورية واحدة بلا queue، والحد 255 ثانية؛ lease بين 1 و250 ثانية. آخر minimum-work budget إلزامي وقد يكون صفرًا. تُقرب كسور الثانية إلى الأعلى، وتُرفض القيم خارج المجال أو budget أكبر من lease بعد التطبيع قبل الإرسال، بلا clamp.
#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 التلقائي release محدود best-effort. استخدم explicit release API إذا كانت النتيجة مهمة. يجب أن يعمل token كـfencing للـDB write المحمي في transaction نفسها.
سلوك يجدر معرفته
- إذا أمكن إرسال request byte واحد، فضياع الاستجابة النهائية ينتج Indeterminate. لا إعادة تلقائية لـ
Aبالـowner نفسه؛ ولا يدخل caller الـcritical section. - Cancel قبل send هو unsent؛ وبعد possible-send يغلق session. إن parsed grant token بالتزامن، يحاول compensating exact-token release محدودًا.
MوكلEوالاستجابة malformed/oversized/unknown هي session-fatal. يصبح acquire possible-send غير المحسوم Indeterminate.Bرفض capacity مؤكد ويعود فورًا. لا retry داخلي؛ يستطيع caller بدء acquire جديد بـowner جديد بعد application backoff.- يحاول explicit/compensating release الـexact token فقط خلال 5 ثوان مطلقة من call/enqueue.
Rنجاح،Nabsent/not current؛ غياب استجابة نهائية error لا نجاح مفترض. - لا يُعاد Ticket إلا مع زمن محافظ موجب يكفي work budget. العمل فوق 250 ثانية unsupported قبل الإرسال.
- Token DB fencing إلزامي: في transaction نفسها ارفض
token <= stored_high_water، وحدّث high-water ونفذ business write قبل commit/rollback ثم release.
خيارات الأمان (رمز · TLS)
جميع الخيارات اختيارية. يجب أن يطابق token قيمة client_tokens في الخادم، ولـ TLS أربعة أنماط: إيقاف / مخزن الثقة الافتراضي للنظام / CA محدد / تخطي التحقق (للاختبار فقط).
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.