Physical Address
304 North Cardinal St.
Dorchester Center, MA 02124
Physical Address
304 North Cardinal St.
Dorchester Center, MA 02124

Bu yazıda bir “ticket booking” (bilet satın alma) sisteminin nasıl tasarlandığını adım adım öğreneceksin. Ama sadece ne yapıldığını değil, neden öyle yapıldığını da anlayacaksın. Özellikle sistem design mülakatlarında nasıl düşünmen gerektiğini net şekilde kafanda oturtacaksın.
Bu yazıda bir “ticket booking” (bilet satın alma) sisteminin nasıl tasarlandığını adım adım öğreneceksin. Ama sadece ne yapıldığını değil, neden öyle yapıldığını da anlayacaksın. Özellikle sistem design mülakatlarında nasıl düşünmen gerektiğini net şekilde kafanda oturtacaksın.
Şimdi şöyle bir düşün… Sana “Ticketmaster benzeri bir sistem tasarla” deniyor. Çoğu kişi direkt teknik çözüm üretmeye atlar. Ama bu yanlış.
Doğru yaklaşım şu sırayı takip etmek:
Bu aslında bir framework.
Yani şöyle düşün:
Evi yapmadan önce plan çizmek gibi. Direkt duvar örmeye başlarsan, ortasında pencereyi nereye koyacağını düşünmek zorunda kalırsın.
Bir sistemin ne yapacağını tanımlamakla başlıyoruz.
Ticket sistemi için en kritik 3 şey var:
Aslında bu bir kullanıcı akışı:
Search → Event Page → Ticket Booking
Bunu şöyle hayal edebilirsin:
Google’da konser arıyorsun → etkinliğe giriyorsun → koltuk seçip satın alıyorsun.
Burada çoğu kişi hata yapıyor.
“Scalability”, “availability” yazıp geçmek yetmez. Önemli olan bu sistemde neden önemli oldukları.
Bu sistemde en kritik karar:
Yani şöyle düşün:
Bir konser koltuğunu iki kişiye satarsan sistem çöker. Ama bir etkinliği 2 saniye geç görmek sorun değil.
Bu sistemde:
Bunu şöyle hayal edebilirsin:
100 kişi etkinliğe bakar, belki 1 kişi satın alır.
Normalde sistem sakin çalışır ama:
bir anda milyonlarca kullanıcı getirir.
Yani şöyle düşün:
Site normalde boş bir AVM gibi. Ama indirim günü herkes kapıya yığılır.
Sistemde hangi veriler var?
En kritik olan: Ticket
Çünkü:
Sistemle kullanıcı nasıl konuşuyor?
GET /events/{eventId}
Event + koltuk bilgileri döner.
GET /search?term=&location=&date=
Kısa bilgiler döner.
Bu 2 aşamalı:
POST /reserve
POST /confirm
Bunu şöyle hayal edebilirsin:
Koltuk seçiyorsun → 10 dakika sana ayrılıyor → ödeme yapıyorsun.
Temel yapı şöyle:
Client → API Gateway → Microservices → Database
Yani şöyle düşün:
AVM girişindeki güvenlik görevlisi gibi.
Her biri farklı iş yapar.
Genelde SQL tercih edilir (örneğin PostgreSQL)
Sebep:
Şimdi önemli bir problem:
Kullanıcı koltuğu seçti ama ödeme yapmadı.
Ne olacak?
Sorun:
Kullanıcı çıkarsa koltuk sonsuza kadar kilitli kalır.
Belirli aralıklarla:
Ama sorun:
Ticket rezervlerini DB yerine cache’te tutarız.
ticketId → locked (TTL: 10 dakika)
Yani şöyle düşün:
Koltuk üstüne “rezerve” etiketi koyuyorsun ama 10 dakika sonra otomatik düşüyor.
Avantaj:
SQL ile arama:
Çözüm: Elasticsearch
Metni parçalar ve index oluşturur.
Bunu şöyle hayal edebilirsin:
Kitabın sonunda kelime indeksi var ya, aynısı.
Milyon kişi aynı anda gelirse?
Çözüm: Virtual Queue
Users → Queue → Sisteme giriş
Yani şöyle düşün:
Konser bileti için sıraya giriyorsun.
Avantaj:
Koltuklar hızlı değişir.
Çözüm:
Bunu şöyle hayal edebilirsin:
Sayfayı yenilemeden koltuklar anlık güncelleniyor.
Aslında bu sistemin özü çok net:
Önce neyi çözdüğünü anlaman gerekiyor. Kullanıcı ne yapıyor, nerede zorlanır, sistem nerede kırılır… Bunları doğru analiz ettiğinde teknik çözüm zaten doğal olarak geliyor.
Ticket sistemi özelinde en kritik noktalar şunlar:
Biletin iki kişiye satılmaması için güçlü bir tutarlılık sağlamak, milyonlarca kullanıcının aynı anda sisteme yüklenmesini yönetmek ve kullanıcıya gerçek zamanlı, doğru bilgi göstermek. Bunun için de basit ama doğru araçlar kullanılıyor: cache, queue, search engine ve distributed lock gibi.
Yani olay aslında teknoloji değil, doğru yerde doğru problemi çözmek.
Bu yazı Designing a Ticket Booking Service (System Design Interview) videosundan ilham alınarak yazılmıştır.