Canonical Offer, Order ve Booking State Model

Travel sistemlerinde Offer, Order ve Booking kavramlarını ayıran canonical state modelini ve booking state machine tasarımını kurun.

Editoryal bilgi
Advertisement

Travel entegrasyonlarında en sık yapılan modelleme hatalarından biri, provider'daki tek bir status alanını doğrudan internal booking state yapmak. Canonical model bunun yerine Offer, Order/Intent ve Booking'i ayrı lifecycle'lar olarak ele almalıdır.

Kavramsal ayrım

KavramNe ifade eder?Mutable mı?
OfferBelirli koşullarda satın alınabilir travel ürünü snapshot'ıYeni version üretilir
Order / BookingIntentKullanıcının seçilen offer'ı satın alma isteğiKontrollü state transitions
BookingSupplier tarafında yaratılan rezervasyon sonucuLifecycle boyunca değişir

Provider terminolojisi farklı olabilir. Bazı API'ler "order", bazıları "reservation", "booking", "itinerary" veya "PNR" kullanabilir. Canonical model provider kelimesini değil davranışı normalize eder.

Offer state

Önerilen state'ler:

Canonical offer state machineCanonical offer state machine

Mermaid source (.mmd)

Offer state booking state değildir. Expired offer, daha önce yaratılmış booking'i iptal etmez.

Canonical Order / BookingIntent state

text
CREATED
 -> VALIDATING
 -> READY
 -> SUBMITTING
 -> SUBMITTED
 -> COMPLETED | FAILED | UNKNOWN

BookingIntent kullanıcının niyetini ve idempotency sınırını temsil eder. Aynı intent için ikinci bir supplier create çağrısı ancak önceki attempt'in authoritative olarak başarısız olduğu kanıtlanırsa yapılmalıdır.

Booking state machine

Canonical booking state machineCanonical booking state machine

Mermaid source (.mmd)

UNKNOWN neden first-class state?

Timeout şu anlama gelmez:

text
request timed out == booking failed

Doğru ifade:

text
request timed out == local system outcome'u bilmiyor

Provider booking'i yaratmış ama response kaybolmuş olabilir. Bu yüzden UNKNOWN retry değil reconciliation tetiklemelidir.

FAILED için kanıt seviyesi

FAILED state yalnız authoritative evidence ile verilmelidir:

  • provider explicit rejection,
  • valid lookup ile booking'in oluşmadığının doğrulanması,
  • deterministic validation failure before provider submission.

Transport error tek başına FAILED değildir.

Provider mapping tablosu kullanın

Provider-specific state mapping configuration veya adapter içinde explicit tutulmalıdır.

text
provider status -> canonical state -> confidence/evidence

Örnek:

Provider responseCanonical stateEvidence
confirmed + referenceCONFIRMEDAPI response
validation_errorFAILEDauthoritative rejection
HTTP timeoutUNKNOWNtransport ambiguity
webhook cancelledCANCELLEDasync provider event

String karşılaştırmalarını business layer'a yaymayın.

State ve event'i ayırın

Current state hızlı okumak için materialize edilebilir; fakat evidence ayrı event log'da kalmalıdır.

json
{
  "bookingId": "bk_42",
  "state": "CONFIRMED",
  "version": 7,
  "lastEvidence": {
    "type": "PROVIDER_CONFIRMED",
    "source": "webhook",
    "providerReference": "ABC123"
  }
}

Current state mutable olabilir; event history immutable olmalıdır.

Transition guard'ları

Her transition için şu sorular cevaplanmalı:

  • hangi source bu transition'ı yapabilir?
  • hangi previous state'lerden izin verilir?
  • aynı event tekrar gelirse ne olur?
  • event eskiyse ne olur?
  • provider reference yoksa transition yapılabilir mi?
  • payment state bu transition için prerequisite mi?

Modification ayrı attempt'tir

Booking modification'ı booking row'unu overwrite eden CRUD update gibi düşünmeyin.

text
Booking
 -> ModificationAttempt
 -> provider modify
 -> CONFIRMED / FAILED / UNKNOWN
 -> reconciliation

Aynı model cancellation için de geçerlidir.

Concurrency

Aynı booking'e API response, webhook ve reconciliation aynı anda gelebilir. Optimistic concurrency/version kontrolü kullanın:

text
UPDATE booking
SET state = ?, version = version + 1
WHERE id = ? AND version = ?

Update başarısızsa state tekrar okunup event yeniden evaluate edilmelidir.

Invariant'lar

Canonical modelde faydalı invariant'lar:

  • CONFIRMED booking provider reference'sız olmamalı,
  • CANCELLED ancak confirmed booking lifecycle'ından gelmeli,
  • FAILED sonrası aynı intent otomatik yeniden submit edilmemeli; retry policy explicit olmalı,
  • UNKNOWN booking terminal state değildir,
  • payment CAPTURED olması booking CONFIRMED zorunluluğu yaratmaz,
  • booking CONFIRMED olması payment CAPTURED zorunluluğu yaratmaz.

Failure modes

  • provider status'un canonical state'e yanlış map edilmesi,
  • UNKNOWN outcome'un erken FAILED yapılması,
  • stale/out-of-order event'in daha yeni state'i geri alması,
  • aynı BookingIntent için paralel create attempt,
  • payment state ile booking state'in birbirine karıştırılması,
  • modification/cancellation sırasında version race.

Observability

Takip edin:

  • state transition count,
  • invalid transition count,
  • UNKNOWN count ve age,
  • duplicate event count,
  • out-of-order event count,
  • reconciliation resolution rate,
  • state başına median duration,
  • modification/cancellation UNKNOWN oranı.

Production checklist

  • Offer / BookingIntent / Booking state'lerini ayrı tutun,
  • terminal ve non-terminal state'leri explicit tanımlayın,
  • UNKNOWN için reconciliation yolu sağlayın,
  • provider mapping tablosunu adapter sınırında tutun,
  • optimistic concurrency/version kontrolü kullanın,
  • immutable event history saklayın,
  • invalid transition ve duplicate event metriklerini izleyin.

İlişkili model

Bu state machine event-level audit için mevcut Booking Lifecycle Event Model ile birlikte kullanılmalıdır. State model "şu an neredeyiz?" sorusunu; event model "buraya nasıl geldik?" sorusunu cevaplar.

Teknik danışmanlık

Mimarinizi birlikte review edelim.

Travel distribution ve metasearch mimarinizi ölçeklenebilirlik, hata senaryoları ve operasyon açısından değerlendirebiliriz.

Projenizi konuşalım →

İlgili içerikler

architecture

Travel Search → Offer → Reprice → Booking Reference Architecture

Travel metasearch ve booking sistemlerinde search, canonical offer, reprice, payment ve booking akışını uçtan uca reference architecture olarak tasarlayın.

travelsearchoffer
İncele →
architecture

Idempotency ve Duplicate Booking Prevention

Travel booking create, payment, cancellation ve refund operasyonlarında idempotency sınırlarını ve duplicate booking önleme desenlerini tasarlayın.

idempotencyduplicate-bookingretry
İncele →
flight

Duffel Flights API Entegrasyon Rehberi

Duffel Flights API'yi Offer Request, Offer, Order, baggage/ancillary, payment ve airline source-of-truth modeliyle uygulayın.

duffelflight-apioffer
İncele →
distribution-api

Hotelbeds API Suite: Bedbank Dağıtım Profili

developer.hotelbeds.com

B2B konaklama dağıtımı için booking, content ve cache API'lerini kapsayan HBX Group Hotelbeds API Suite teknik profili.

hotelbedshbxbedbank
İncele →
distribution

OTA vs Metasearch vs Travel Marketplace: Farklar

OTA, metasearch ve travel marketplace modellerini transaction ownership, supplier relationship, monetization, handoff ve teknik architecture açısından karşılaştırın.

otametasearchtravel-marketplace
İncele →
distribution

Package Holiday vs Hotel Metasearch: Mimari Farklar

Paket tatil dağıtımı ile hotel metasearch modelini offer identity, pricing, supplier topology, booking ownership ve cancellation açısından karşılaştırın.

package-holidayhotel-metasearchtour-operator
İncele →