Price Observation ve Event Model
Travel fiyatlarını mutable current state yerine zaman damgalı observation/event kayıtlarıyla izleyen veri modelini tasarlayın.
Price observation model, “şu anki fiyat kaç?” sorusunun yanında bu fiyat ne zaman, hangi context'te, hangi source'tan gözlendi? sorusunu da cevaplayabilmek için tasarlanır.
Production senaryosu
Aynı offer gün içinde 180, 195 ve 182 EUR olarak gözleniyor. Sistem yalnız current_price alanını overwrite ederse volatility, stale detection ve incident RCA için tarihsel kanıt kaybolur.
Mimari akış
Provider Response
-> Normalize Offer Identity
-> Normalize Price Components
-> Create PriceObservation
-> Persist Append-Only Event
-> Update Current Snapshot
-> Emit Change Event
-> Analytics / Alert / Cache InvalidationData model
PriceObservation
- observationId
- offerFingerprint
- provider
- searchContextHash
- observedAt
- sourceUpdatedAt?
- baseAmount
- taxes
- fees
- totalAmount
- currency
- availability
- rawReferenceCurrentPriceSnapshot ayrı materialized state olabilir.
Event ne zaman üretilmeli?
Her response için observation yazabilirsiniz; change event ise business-significant değişiklikte üretilmelidir.
Örnek:
- total price changed,
- availability changed,
- room/rate identity changed,
- tax/fee composition changed.
Trade-off
Her observation'ı sonsuza kadar saklamak storage maliyeti yaratır. Sadece current snapshot tutmak ise analytics ve RCA kabiliyetini kaybettirir.
Hot/cold retention uygulanabilir:
- kısa dönem detaylı observation,
- uzun dönem aggregate/min-max/percentile.
Deduplication
Aynı provider response bir retry nedeniyle iki kez işlenebilir. observationId veya event key deterministik/idempotent tasarlanmalıdır.
Freshness
observedAt, receivedAt ve sourceUpdatedAt aynı kavram değildir. Bunları ayırmak stale-price analizi için kritiktir.
Failure modes
- duplicate event,
- out-of-order observation,
- timezone hatası,
- FX-converted price'ı original price sanma,
- tax component kaybı,
- current snapshot'ın eski event ile geriye alınması.
Concurrency
Current snapshot update ederken event version veya observedAt ordering kullanılmalıdır. Geç gelen eski event daha yeni state'i overwrite etmemelidir.
Observability
- observations/sec,
- duplicate rate,
- out-of-order rate,
- price-change frequency,
- freshness lag,
- snapshot/event divergence,
- alert volume.
Alternatifler
Düşük hacimli sistemde append-only tablo + current view yeterli olabilir. Yüksek hacimde stream + compacted topic + analytical storage tercih edilebilir.
Production checklist
- immutable observation
- separate current snapshot
- explicit timestamps
- idempotency key
- ordering/version rule
- price component preservation
- retention policy
- change-event semantics
Benzer bir entegrasyon mu planlıyorsunuz?
Gereksinim, feed/API tasarımı ve production yaklaşımını birlikte değerlendirebiliriz.