Echo Support / SRE • • 1.141 kelime • 6 dk okuma
Çift Çekim Efsanesi: 'Öde' Butonuna İki Kez Basınca Ne Olur?
Ödeme yaparken sayfa donunca butona tekrar basmaktan korktunuz mu? Bankaların çift çekimi engelleyen Idempotency mimarisini ve gerçekleri keşfedin.
Kısa Özet (TL;DR — Doğrudan Yanıt): İnternetten alışveriş yaparken ödeme butonuna peş peşe iki kez basmanız, neredeyse hiçbir zaman kartınızdan iki kat para çekilmesine yol açmaz. Bankalar ve modern ödeme sistemleri, aynı işlemin tekrarlanmasını engelleyen ve teknik adı "idempotency" (aynı etkiyi koruma) olan özel bir koruma kalkanı kullanır. Sistem, butona kaç kez basarsanız basın gönderilen ilk isteğe benzersiz bir kimlik verir ve diğer tüm kopyaları anında çöpe atar.
Asansör Butonu Analojisi: 'Öde' Butonundaki Panik Anı
Bir asansör beklediğinizi hayal edin. Kat düğmesine beş kez üst üste hızlıca bastığınızda binaya beş farklı asansör çağrılmaz; asansör sistemi sizin sadece "bir kabin" istediğinizi zaten anlar.
İnternetten sipariş verirken de durum farksızdır. Ekranın ortasında o küçük çember dakikalarca dönüp durduğunda hepimizin eli "Öde" butonuna gayriihtiyari bir kez daha gider. Tam o anda içimizi bir korku kaplar: "Eyvah, kartımdan iki kez para çekerler mi?"
Bu korkuya ödeme dünyasında "çifte harcama riski" denir. İnternet bağlantısının anlık olarak yavaşlaması veya web sitesinin yoğunluktan geç yanıt vermesi, kullanıcının butona sabırsızca art arda tıklamasına yol açar. Neyse ki finansal sistemler, insan sabırsızlığını hesaba katarak tasarlanmıştır.
Arka Planda Neler Olur? Benzersiz İstek Anahtarları
Bir ödeme butonuna bastığınız anda tarayıcınız arka planda bankaya gizli bir zarf gönderir. Bu zarfın üzerinde Idempotency Key (tekil işlem anahtarı) adı verilen, rastgele üretilmiş benzersiz bir parmak izi bulunur.
İşlem anahtarını, vestiyere montunuzu teslim ederken aldığınız fiş numarası gibi düşünebilirsiniz. Fiş numaranız A-102 ise, vestiyere üç kez gidip aynı numarayı gösterseniz bile görevli size üç farklı mont vermez; elinizdeki tek bir monta bakar.
Kullanıcı (2 Kez Tıkladı)
│
▼
[Web Sunucusu] ── (Anahtar: "SIPARIS-99") ──► [Hızlı Bellek / Redis]
│ │
├─► 1. İstek: Anahtar yok ──► Bankaya Gönder ◄┘ (Kayıt Açıldı)
│
└─► 2. İstek: Anahtar VAR ──► İşlemi Durdur! ──► İlk Cevabı Dön
Banka ve ödeme kuruluşu, gelen ilk isteği bu anahtarla hafızasına kaydeder. Hemen ardından gelen ikinci istek aynı anahtarı taşıdığı için sistem bunu yeni bir ödeme olarak görmez. "Bu işlemi zaten yapıyorum ya da az önce tamamladım" diyerek ikinci isteği doğrudan yok sayar.
İstemci Kilidi ve Sunucu Kalkanı Karşılaştırması
Ödeme sistemleri çift çekimi engellemek için tek bir hatta güvenmez. Hem kullanıcının gördüğü ekranda (istemci) hem de verilerin işlendiği arka planda (sunucu) çok katmanlı bir savunma hattı kurulur.
| Savunma Yöntemi | Nasıl Çalışır? | Zayıf Noktası | Güvenilirlik Seviyesi |
|---|---|---|---|
| İstemci Kilidi (Arayüz) | Butona bir kez basılınca buton grileşir ve tıklanamaz olur. | Sayfa yenilenirse veya internet tarayıcısı takılırsa kilit kalkar. | Düşük (Sadece görsel önlem) |
| Önbellek Kilidi (Bellek) | İstek anahtarı çok hızlı bir hafızada (Redis) birkaç dakika kilitlenir. | Önbellek sunucusu yeniden başlarsa veri kaybolabilir. | Yüksek |
| Veritabanı Kısıtı (DB) | Sipariş numarası ana veritabanına tekil olarak işlenir; kopyası reddedilir. | Veritabanı üzerinde anlık yüksek sorgu yükü yaratır. | En Yüksek (Son sığınak) |
Arayüzdeki buton kilitleme tek başına asla yeterli değildir. Kötü niyetli bir kullanıcı veya bozuk bir internet bağlantısı arayüzü kolayca aşabilir. Bu yüzden asıl savaş her zaman sunucu tarafında verilir.
Pratikte Idempotency: Dağıtık Kilitler Nasıl Çalışır?
Bir alışveriş sepetini onayladığınızda tarayıcınız sunucuya bir HTTP isteği fırlatır. Bu isteğin başlık (header) kısmına Idempotency-Key: 7b29a8f... gibi sadece o siparişe özel üretilmiş bir metin eklenir.
Sunucu bu isteği alır almaz veritabanından bile daha hızlı çalışan dağıtık önbellek (genellikle Redis gibi sistemler) katmanına bakar. "Bu anahtar şu an kilitli mi?" sorusunu sorar. Eğer anahtar boşsa, anında bir kilit takılır ve bankanın sanal POS (Point of Sale - Satış Noktası) sistemine gidilir.
Arka planda dönen bu karmaşık mimariyi anlamak ve kendi projelerinizde test etmek isterseniz AI Playground üzerindeki kaynaklara göz atabilirsiniz. Sistemler arasındaki gecikmelerin nasıl felaketlere yol açabileceğini bizzat deneyimlemek için İnteraktif Simülasyon Araçları harika bir laboratuvar sunar.
Yaygın Mitler: "Param Anında Çekildi" Yalanı
Kullanıcıların en büyük yanılgısı, butona bastıkları anda paranın banka hesabından buharlaşıp satıcının cebine girdiği inancıdır. Finansal dünyada süreç iki aşamada yürür:
- Otorizasyon (Provizyon): Banka parayı satıcıya aktarmaz, sadece sizin harcama limitinizden düşerek bloke eder. "Evet, bu müşteride 500 TL var, kenara ayırdım" der.
- Tahsilat (Capture): Ürün kargoya verildiğinde veya gün sonunda para gerçekten el değiştirir.
Eğer sistem hatası nedeniyle iki provizyon görünse bile, mutabakat sistemleri gün sonunda bu iki işlemin aynı siparişe ait olduğunu fark eder. Provizyonlardan biri otomatik olarak iptal edilir ve limitiniz kartınıza geri yüklenir.
Gerçek Bir Kriz Vakası: Çöken İndirim Gecesi
Birkaç yıl önce büyük bir e-ticaret sitesi devasa bir indirim kampanyasına hazırlanıyordu. Mühendisler sisteme binen yükü hafifletmek için bazı servisleri geçici olarak sadeleştirmeye karar verdiler.
Korkunç bir hata yapıldı: Önbellek sunucusuna aşırı yük binmesin diye Idempotency kontrol katmanının süresi 5 saniyeye indirildi. Ancak banka tarafındaki yanıt süresi, yoğunluk nedeniyle 7 saniyeye fırlamıştı!
Kullanıcılar "Öde" butonuna bastı, 5 saniye doldu, önbellek kilidi düştü. Sabırsız müşteriler butona ikinci kez bastığında sistem bunu tamamen yeni bir işlem sandı. Binlerce kullanıcıdan mükerrer para çekildi. Destek hatları kilitlendi, sosyal medya ayağa kalktı. Şirket, gece boyu çalışan acil durum botlarıyla tüm fazladan çekimleri 24 saat içinde iade etmek zorunda kaldı. Birkaç satırlık mimari kural unutulduğunda finansal itibar dakikalar içinde eriyebilirdi.
Sıkça Sorulan Sorular (SSS)
Kartı temassız POS cihazına iki kere okutursam iki kez para çeker mi?
Hayır, temassız POS cihazları aynı tutardaki işlemi arka arkaya anında çekmez. Cihaz, ilk temastan sonra işlemi onaylamak için birkaç saniye kilitlenir ve kart bilgilerini hafızasında tutar. İkinci temasta "İşlem Tamamlandı" veya "Mükerrer Kart" uyarısı vererek fazladan çekimi engeller. İkinci bir çekim için kasiyerin kasadan yeni bir tutar girmesi şarttır.
Banka uygulamamda aynı tutarda iki adet bekleyen işlem görüyorum, neden?
Banka ekstrelerindeki bekleyen işlemler henüz kesinleşmemiş "provizyon" kayıtlarıdır. Butona iki kez bastığınızda veya ağ koptuğunda bankanız tutarı iki kez bloke etmiş gibi görünebilir. Ancak gün sonunda gerçekleşen mutabakat aşamasında satıcı firma bu işlemlerden yalnızca birini tahsil eder. Eşleşmeyen ikinci bloke tutar ise bankanız tarafından birkaç gün içinde otomatik olarak serbest bırakılır.
Yanlışlıkla iki kez çekilen bir para nasıl iade edilir?
Eğer sistem hatası nedeniyle kartınızdan mükerrer çekim kesinleşirse endişelenmenize gerek yoktur. Öncelikle satıcı firmanın müşteri hizmetleriyle iletişime geçip sipariş numaranızı iletmelisiniz. Firma sistem kayıtlarını inceleyip tek bir sipariş için iki tahsilat yapıldığını teyit eder ve fazla olan tutarı "ters işlem" (chargeback/iade) yoluyla kartınıza birkaç iş günü içerisinde geri gönderir.
İade süreçlerinde de idempotency mekanizması kullanılır mı?
Kesinlikle kullanılır ve hatta ödeme anından daha kritik bir öneme sahiptir. Bir müşteriye 500 TL iade edilirken ağ hatası nedeniyle iade isteği iki kez gönderilirse firma müşteriye çift iade yapma riskiyle karşılaşır. Bu nedenle iade servisleri de tıpkı ödemeler gibi her iade talebini benzersiz bir iade anahtarıyla mühürler ve mükerrer para çıkışını engeller.
Ödeme anında internetim koparsa sayfayı yenilemeli miyim?
Hayır, ödeme ekranında sayfa yüklenirken internetiniz koparsa sayfayı hemen yenilememeli veya geri butonuna basmamalısınız. Öncelikle bankacılık uygulamanızdan kart hareketlerinizi veya e-posta adresinizi kontrol edin. Eğer sipariş onayı veya harcama bildirimi gelmemişse en az 1-2 dakika bekleyip alışveriş yaptığınız sitenin "Siparişlerim" sayfasına gidin; sipariş oluşmamışsa işlemi sıfırdan güvenle tekrarlayabilirsiniz.