Ticketing Java / Kotlin লাইব্রেরি
GitHub Maven Centralএকটি TicketBroker-ই তিন ধরনের কল-স্টাইল একসঙ্গে সরবরাহ করে — Kotlin কোরুটিনে acquire, Java async-এ acquireAsync (CompletableFuture), আর Java ব্লকিং-এ acquireBlocking। যেটাই ব্যবহার করুন, ব্রোকার ও সংযোগ একই থাকে।
রিপোজিটরি
উদাহরণ
সাধারণ উদাহরণ
Application startup-এ একটি broker তৈরি করে share করুন। wait=0 queue ছাড়া একবার immediate attempt, সর্বোচ্চ 255 সেকেন্ড; lease 1–250 সেকেন্ড। শেষ minimum-work budget বাধ্যতামূলক এবং 0 হতে পারে। Sub-second ওপরের দিকে round হয়; out-of-range বা normalized lease-এর বেশি budget send-এর আগে reject হয়, clamp নয়।
Kotlin (coroutines):
val broker = TicketBroker.connect("127.0.0.1:5225")
broker.waitReady(Duration.ofSeconds(5))
val ticket = broker.acquire("key", Duration.ofSeconds(5), Duration.ofSeconds(30), Duration.ofSeconds(2))
val token = ticket.token
// In the same DB transaction: verify/update token high-water and perform the business write.
ticket.release()Java (blocking):
TicketBroker broker = TicketBroker.connect("127.0.0.1:5225");
broker.waitReadyBlocking(Duration.ofSeconds(5));
try (Ticket ticket = broker.acquireBlocking(
"key", Duration.ofSeconds(5), Duration.ofSeconds(30), Duration.ofSeconds(2))) {
long token = ticket.getToken();
// In the same DB transaction: verify/update token high-water and perform the business write.
}Automatic close/drop bounded best-effort release। Result দরকার হলে explicit release API ব্যবহার করুন। Token দিয়ে একই DB transaction-এ protected write fence করা বাধ্যতামূলক।
যে আচরণগুলো জানা ভালো
- একটি request byte-ও send হয়ে থাকতে পারে এবং final response হারালে ফল Indeterminate। একই owner দিয়ে
Aauto-resend নয়; caller critical section-এ যায় না। - Send-এর আগে cancel unsent; possible-send-এর পরে session বন্ধ। একই সময় grant token parse হলে bounded compensating exact-token release।
M, প্রতিটিE, malformed/oversized/unknown response session-fatal। Unresolved possible-send acquire Indeterminate।Bনিশ্চিত capacity rejection এবং সঙ্গে সঙ্গে ফেরে। Internal retry নেই; caller application backoff-এর পর নতুন owner দিয়ে নতুন acquire করতে পারে।- Explicit/compensating release exact token call/enqueue থেকে পরম 5 সেকেন্ড পর্যন্ত retry করে।
Rsuccess,Nabsent/not current; final response না হলে error, assumed success নয়। - Positive conservative remaining time ও পর্যাপ্ত work budget থাকলেই Ticket ফেরে। 250 সেকেন্ডের বেশি work send-এর আগে unsupported।
- Token DB fencing বাধ্যতামূলক: একই transaction-এ
token <= stored_high_waterreject, high-water update ও business write, তারপর commit/rollback এবং release।
নিরাপত্তা অপশন (টোকেন · TLS)
সবগুলো অপশনই ঐচ্ছিক। token অবশ্যই সার্ভারের client_tokens-এর সাথে মিলতে হবে, আর TLS-এর চারটি মোড আছে: বন্ধ / সিস্টেম ট্রাস্ট স্টোর / নির্দিষ্ট CA / যাচাই বাদ দেওয়া (শুধু টেস্টের জন্য)।
val broker = TicketBroker.builder()
.addrs("10.0.0.1:5225", "10.0.0.2:5225", "10.0.0.3:5225")
.token("123")
.tls(TlsMode.SystemRoots)
// .tls(TlsMode.Ca("ca.crt"))
// .tls(TlsMode.InsecureSkipVerify)
.connect()Java-তে TlsMode.systemRoots() / TlsMode.ca("ca.crt") / TlsMode.insecureSkipVerify() স্ট্যাটিক ফ্যাক্টরি ব্যবহার করুন।
সার্ভার পাশের টোকেন · TLS · ক্লাস্টার কনফিগারেশন Ticketing সার্ভার ডিপ্লয়মেন্ট পেজে তৈরি করা যায়।
Spring ভার্চুয়াল থ্রেড
ভার্চুয়াল থ্রেডে Spring MVC চালালে Java ও Kotlin দুটোতেই *Blocking কল ব্যবহার করুন। নন-সাসপেন্ড কন্ট্রোলার acquire ডাকতে পারে না, তাই Kotlin-এও acquireBlocking-ই স্বাভাবিক পথ। এগুলো কোরুটিনের মধ্য দিয়ে যায় না, শুধু উত্তরের জন্য park করে, ফলে ক্যারিয়ার থ্রেড মুক্ত থাকে।
@RestController
class OrderController(private val broker: TicketBroker) {
@PostMapping("/orders/{id}")
fun place(@PathVariable id: String): String {
broker.acquireBlocking("order-$id", Duration.ofSeconds(5), Duration.ofSeconds(30)).use {
// ক্রিটিক্যাল সেকশন
}
return "ok"
}
}close() (try-with-resources / use)-এর ব্যাকগ্রাউন্ড রিলিজ ডিফল্টে ভার্চুয়াল-থ্রেড এক্সিকিউটরে চলে, তাই নির্দিষ্ট আকারের পুলের পেছনে জমে না। Spring-এর এক্সিকিউটর ব্যবহার করতে নিজেরটা পাস করুন।
TicketBroker.builder()
.addrs("127.0.0.1:5225")
.executor(applicationTaskExecutor)
.connect()WebFlux বা কোরুটিন কন্ট্রোলারে আগের মতো suspend কল ব্যবহার করুন।