Tüm yazılar

Neden yalnızca kayıttan sonra yanıt veriyoruz

Sunucu her an kapatılabiliyorsa "emriniz onaylandı" ne anlama gelmeli.

Yörüngeden fotoğraflanmış, bir bulut katmanının üzerinde doğan güneş.
Fotoğraf: NASA

Spacestocks’u bilerek acımasızca test ediyoruz. Kullanıcılar emir verirken sunucu işlemi kill -9 ile, rastgele anlarda, defalarca öldürülüyor. Uyarı yok, toparlanma şansı yok. Her yeniden başlatmadan sonra borsanın onayladığı her emir yerinde olmalı ve defterler son hisseye kadar tutmalı.

Bu, rahat tasarımların çoğunu baştan eliyor. Bizi bundan geçiren tek kural şu.

Kural

Onayı yalnızca veritabanı değişikliği kalıcı olarak kaydettikten sonra göndeririz.

Bir emir vermek aynı anda birçok şeye dokunur: emrin kendisi, yaptığı işlemler, işleme katılan herkesin nakdi ve hisseleri, ayrılan tutarlar. Bunların hepsi tek bir veritabanı işlemine (transaction) girer. Borsa bu işlemin kaydını bekler, sonra bellekteki emir defterini günceller ve ancak ondan sonra kullanıcıya yanıt verir.

Bir çökme artık ne yapabilir

Bir çökmenin denk gelebileceği yalnızca üç an var ve her biri güvenli.

Kayıttan önce. İşlem tamamlanmadı, veritabanı hepsini çöpe atar. Borsa açısından emir hiç gelmedi. Kullanıcı da onay almadı, yani kimse olmayan bir şeyin olduğuna inanmıyor.

Kayıttan sonra, yanıttan önce. Emir veritabanında ama kullanıcı yanıt alamadı. Borsa yeniden başlarken tüm açık emirleri veritabanından yükler ve kullanıcı emrini sorgulayabilir. Emir vardır ve bulunabilir.

Yanıttan sonra. Kullanıcıya söylenen her şey zaten diskte.

Kullanıcıya “tamam” denip işin kaybolduğu dördüncü bir durum yok. Bütün mesele bu.

Neden önce yanıt verip sonra kaydetmiyoruz

Önce yanıt vermek daha hızlı gelir ve gerçekten birkaç milisaniye daha hızlıdır. Ama o birkaç milisaniye boyunca borsa tutamayacağı bir söz vermiş olur. Kötü zamanlanmış tek bir çökme, onaylanmış bir emri yok edebilir ya da daha kötüsü, bir işlemi yarım kaydedebilir: alıcının hisseleri kaydedilmiş, satıcının nakdi kaydedilmemiş.

Bir borsa için biraz daha yavaş bir onay ucuzdur. Tutulmayan bir söz değildir.

Bellekteki kopya

Bellekteki emir defteri eşleşmeyi hızlandırır ama hiçbir zaman asıl kaynak değildir; asıl kaynak veritabanıdır. İkisi arasında bir şey ters giderse, örneğin bağlantı kaydın ortasında kopar ve kaydın gerçekleşip gerçekleşmediğini bilemezsek, borsa o varlığın bellekteki defterini atar ve ona yeniden dokunmadan önce veritabanından yükler.

Bedeli

Her emir bir kaydı beklediği için işlem hızı, PostgreSQL’in veriyi ne kadar hızlı kalıcı hale getirebildiğiyle sınırlıdır. Yüzlerce kullanıcıya hizmet veren bir borsa için bu sınır çok uzakta. Bir gün yaklaşırsak bilinen sonraki adım, birkaç emri tek bir işlemde kaydetmek. Ama yine de kayıttan önce asla yanıt vermeyiz.

Görünüm

Tema
Yazı boyutu
Satır aralığı
Okuma
Görme
Hareket ve gezinme
Sayfa yapısı

Başlıklar

    Bölgeler

      Yalnızca bu tarayıcıda saklanır.