hosting

Randevu Sistemi Kurmak: Çakışma, Saat Dilimi ve Eşzamanlılık

Randevu sisteminde çift kayıt sorunu, veritabanı seviyesinde çözüm, saat dilimi yönetimi ve hatırlatma gönderimi. Randevu Sistemi Kurmak: Çakışma, Saat…

Randevu Sistemi Kurmak: Çakışma, Saat Dilimi ve Eşzamanlılık
İçindekiler
  1. Çakışma Nasıl Oluşur?
  2. Veritabanı Seviyesinde Çözüm
  3. Saat Dilimi Sorunu
  4. Müsaitlik Hesabı
  5. İptal ve Değişiklik
  6. Hatırlatma Gönderimi
  7. Hosting Tarafındaki Gereksinimler
  8. Sonuç
  9. Sıkça Sorulan Sorular (SSS)
  10. Aynı saate iki randevu nasıl oluşuyor?
  11. Çakışmayı nasıl önlerim?
  12. Saat dilimini nasıl yönetmeliyim?
  13. Ön süre neden gerekli?

Randevu Sistemi Kurmak: Çakışma, Saat Dilimi ve Eşzamanlılık

Randevu formunuz çalışıyor. Sonra bir gün iki müşteri aynı saate randevu aldı ve ikisi de aynı anda geldi. Form doğru çalışıyordu — sorun aynı anda tıklamalarıydı.

Bu yazı, hosting hesabınızda çalışan bir randevu sisteminin zor taraflarını ele alıyor.

Çakışma Nasıl Oluşur?

Klasik kontrol yeterli değildir:

  1. Kullanıcı A müsaitlik sorgular, saat boş görünür.
  2. Kullanıcı B aynı anda sorgular, saat boş görünür.
  3. A kaydı oluşturur.
  4. B de kaydı oluşturur.
  5. Aynı saatte iki randevu.

Sorun kontrol ile kayıt arasındaki boşluktadır: "boş mu?" sorgusu ile "kaydet" komutu arasında geçen milisaniyelerde başka biri aynı yeri alabilir — ve kod hiçbir hata vermez.

Bu, düşük trafikte yıllarca fark edilmez. Yoğun bir dönemde ise sık sık yaşanır.

Veritabanı Seviyesinde Çözüm

Doğru çözüm uygulama katmanında değildir:

Yöntem Güvenilirlik
Kodda kontrol etmek Yetersiz
Benzersiz kısıt tanımlamak Güvenilir
İşlem içinde kilitlemek Güvenilir
Kuyruk kullanmak Karmaşık ama kesin

İkinci satır en basit ve en etkili çözümdür: kaynak ve zaman dilimi üzerinde benzersiz bir kısıt tanımlarsanız, veritabanı ikinci kaydı fiziksel olarak kabul etmez ve çakışma imkânsız hâle gelir.

Bu durumda uygulamanız veritabanından gelen hatayı yakalayıp kullanıcıya "bu saat az önce doldu" mesajı gösterir.

Bu yaklaşım, sabit slotlu sistemlerde kusursuz çalışır. Değişken süreli randevularda ise kilitleme yöntemi gerekir.

Saat Dilimi Sorunu

Randevu sistemlerinin en sinsi hata kaynağı:

  • Sunucu bir saat diliminde çalışır.
  • Kullanıcı başka bir dilimde olabilir.
  • İşletme üçüncü bir dilimde olabilir.

Doğru yaklaşım tek bir kuraldır: randevu zamanını veritabanında evrensel zamanda saklayın, gösterirken ilgili kişinin yerel saatine çevirin — depolama ile gösterimi asla karıştırmayın.

Yerel saatte saklamak, yaz saati geçişlerinde belirsizlik üretir. Saatin geri alındığı gece, aynı yerel saat iki kez yaşanır ve hangi randevunun hangisi olduğu anlaşılmaz.

Uluslararası müşteri kabul ediyorsanız, kullanıcıya randevu saatini hangi dilimde gördüğünü açıkça belirtmek gerekir.

Müsaitlik Hesabı

Boş saatleri listelemek göründüğünden karmaşıktır:

  1. Çalışma saatlerini tanımlayın.
  2. Tatil günlerini çıkarın.
  3. Mevcut randevuları çıkarın.
  4. Ara sürelerini hesaba katın.
  5. Minimum ön süre uygulayın.

Beşinci madde çok atlanır ve gerçek sorun üretir: on dakika sonrasına randevu alınabilmesi, işletmenin hazırlanmasına imkân bırakmaz ve müşteri gelmeden randevu iptal edilmek zorunda kalır.

Makul bir ön süre — birkaç saat veya bir gün — bu sorunu ortadan kaldırır.

Dördüncü madde ise hizmet türüne göre değişir. Randevular arasında temizlik veya hazırlık süresi gerekiyorsa, slot hesabına dahil edilmelidir.

İkinci madde bakım gerektirir. Tatil takvimi güncellenmezse sistem kapalı günlere randevu verir.

İptal ve Değişiklik

Konu Yaklaşım
İptal bağlantısı Tahmin edilemez belirteç
İptal süresi Sınır tanımlayın
Kaydı silmek Silmeyin, iptal işaretleyin
Slot serbest bırakma Anında yapılmalı

Birinci satır bir güvenlik gereğidir: iptal bağlantısında sıralı bir randevu numarası kullanmak, sayıyı değiştiren herkesin başkalarının randevusunu iptal edebilmesi demektir.

Bu, gerçekten yaşanmış bir hata türüdür ve tahmin edilemez bir belirteçle kolayca önlenir.

Üçüncü satır ise veri kaybını önler. İptal edilen randevuların geçmişi, tekrar eden iptalleri ve devamsızlık kalıplarını görmenizi sağlar.

Hatırlatma Gönderimi

Randevu sistemlerinin en değerli özelliği:

  • Onay iletisi hemen gönderilir.
  • Hatırlatma bir gün önce gider.
  • Zamanlanmış görev gerektirir.
  • Gönderildi işareti konmalıdır.

Dördüncü madde çift gönderimi engeller: hatırlatmanın gönderildiğini kaydetmezseniz, görev iki kez çalıştığında müşteriye aynı hatırlatma iki kez gider.

Bu, görev zamanlaması üst üste bindiğinde veya elle tetiklendiğinde kolayca yaşanır.

İkinci madde ise devamsızlığı belirgin biçimde azaltır ve randevu sisteminin en somut getirisidir.

Hosting Tarafındaki Gereksinimler

  1. Zamanlanmış görev desteği.
  2. Doğru sunucu saati.
  3. Güvenilir e-posta gönderimi.
  4. Yeterli veritabanı performansı.

İkinci madde temel bir gerekliliktir: sunucu saati yanlışsa hatırlatmalar yanlış zamanda gider ve müsaitlik hesabı kayar — randevu sisteminin tamamı sunucu saatine bağlıdır.

Üçüncü madde ise güveni belirler. Onay iletisi ulaşmayan bir müşteri, randevusunun alınıp alınmadığından emin olamaz.

Zamanlanmış görev ve e-posta ayarlarınızı panelinizden kontrol edebilirsiniz; hosting çözümleri kapsamında cron görevleri ve e-posta hesapları aynı panelden yönetilir.

Sonuç

Randevu sistemlerinde çift kayıt sorununun nedeni koddaki bir hata değildir: "boş mu?" sorgusu ile "kaydet" komutu arasında geçen milisaniyelerde başka biri aynı yeri alabilir. Çözüm uygulama katmanında değil veritabanındadır — kaynak ve zaman üzerinde benzersiz kısıt tanımlayın, ikinci kayıt fiziksel olarak kabul edilmez. Zamanı evrensel saatte saklayıp gösterirken çevirin. Ve iptal bağlantısında sıralı numara kullanmayın; sayıyı değiştiren herkes başkalarının randevusunu iptal edebilir.

Sıkça Sorulan Sorular (SSS)

Aynı saate iki randevu nasıl oluşuyor?

Kontrol ile kayıt arasındaki boşluktan. "Boş mu?" sorgusu ile "kaydet" komutu arasında geçen milisaniyelerde başka biri aynı yeri alabilir ve kod hiç hata vermez. Düşük trafikte yıllarca fark edilmez, yoğun dönemde sık yaşanır.

Çakışmayı nasıl önlerim?

Veritabanı seviyesinde. Kaynak ve zaman dilimi üzerinde benzersiz bir kısıt tanımlarsanız veritabanı ikinci kaydı fiziksel olarak kabul etmez. Uygulamanız bu hatayı yakalayıp "bu saat az önce doldu" mesajı gösterir. Değişken süreli randevularda ise işlem içinde kilitleme gerekir.

Saat dilimini nasıl yönetmeliyim?

Randevu zamanını veritabanında evrensel zamanda saklayın, gösterirken ilgili kişinin yerel saatine çevirin. Yerel saatte saklamak yaz saati geçişlerinde belirsizlik üretir — saatin geri alındığı gece aynı yerel saat iki kez yaşanır ve hangi randevunun hangisi olduğu anlaşılmaz.

Ön süre neden gerekli?

On dakika sonrasına randevu alınabilmesi işletmenin hazırlanmasına imkân bırakmaz ve randevu müşteri gelmeden iptal edilmek zorunda kalır. Birkaç saat veya bir günlük makul bir ön süre bu sorunu ortadan kaldırır.