İçeriğe geç

Mantıksal Saatler — Sunucuların Saati Farklıysa Hangisi Önce Oldu?

İleri 9 dk Sık karşılaşılır

Önce şunu oku: Lider Seçimi ve Split-Brain — Ağ Bölününce Kim Karar Verir?

30 saniyede özet

Farklı makinelerin saatleri birkaç milisaniye, bazen saniyeler kayar; zaman damgasına göre sıralanan bir kayıt, sonucu sebebinden önce gösterebilir. Lamport sayacı sebebi hep önce koyar, vektör saati eşzamanlı olanı da söyler.

Ayşe saat 10:05’te Bora’ya gelip gelmeyeceğini soran bir mesaj yazıyor. Bora hemen cevap veriyor, ama onun saati üç dakika geri ve mektubuna 10:02 yazıyor. Mektupları üzerlerindeki saate göre dizen biri, cevabın sorudan önce yazıldığını sanır.

  1. Bayt: Dolandırıcılık alarmı! Müşteri 800 TL çekmiş, ama hesapta henüz para yokmuş.

  2. Sen: Müşteri önce 1.000 TL yatırdığını söylüyor. Kayıtta yatırma, çekimden sonra görünüyor.

  3. Bayt: Kayıtları zaman damgasına göre sıralıyoruz. Zaman yalan söyleyemez ki?

  4. Bayt: Zaman söyleyemez. Ama mobil sunucunun saati söyleyebilir.

Saatler neden yalan söyler?

Her makinenin saati biraz hızlı ya da yavaş çalışır; NTP onları düzenli olarak düzeltir, ama aradaki farkı sıfırlayamaz. Buna saat kaymasıFarklı makinelerin saatleri arasındaki fark. NTP onu küçültür ama sıfırlamaz; yakın iki olay zaman damgasına göre ters sıralanabilir.Sözlükte gör → denir.

İki olay birbirine bu kaymadan daha yakınsa, zaman damgaları onları ters sıralayabilir. Simülatörde mobil sunucunun saati dört saniye geri: para çekimi, dayandığı yatırmadan önce görünüyor.

Kafam karıştı, daha basit anlat

Farklı makinelerin saatleri biraz farklıdır. Birbirine yakın iki olayı saatlerine göre sıralarsan ters dizebilirsin.

Hızlı kontrolOrta

Farklı sunuculardaki olayları zaman damgasına göre sıralamak neden yanıltabilir?

Cevabı biliyor musun?Önce birini seç. Tekrar zamanlaması buna göre ayarlanıyor.

NTP kullanan sunucularda saat kayması ne olur?

Cevabı biliyor musun?Önce birini seç. Tekrar zamanlaması buna göre ayarlanıyor.

Sayaç taşımak

Her sunucu bir sayaç tutuyor, her olayda bir artırıyor ve mesajla birlikte gönderiyor; alan, kendi sayacını gördüğünün bir fazlasına çıkarıyor. Yatırma (sayaç 1) mobil sunucuya bildirildi. Mobil sunucudaki çekim, yatırmadan önce sıralanabilir mi? Cevabı göster

Sıralanamaz. Mobil sunucu bildirimi alınca sayacını en az 2 yapar; çekim 3 olur. Sebep, sonucundan her zaman küçük bir sayı taşır.

Numara taşı: cevap, sorudan büyük.
Adım adım oku
  1. Ayşe yazdı: saatinde 10:05.
  2. Bora cevap verdi, saati geri: 10:02.
  3. Saate göre sırala: cevap sorudan önce.
  4. Numara taşı: cevap, sorudan büyük.

Bu, Lamport sayacıHer olayda bir artan ve mesajla taşınan sayı. Alan, kendi sayacını gördüğünün bir fazlasına çıkarır; sebep hep sonuçtan küçük kalır.Sözlükte gör →. Sebebi hep sonuçtan önce koyar, ama birbirini hiç görmemiş iki olayı da bir sıraya dizer; aslında aralarında bir sıra yoktur.

Bir vektör saatiHer sunucu için ayrı bir sayaç tutan mantıksal saat. İki olayın birbirini görüp görmediğini, yani eşzamanlı olup olmadığını da söyler.Sözlükte gör → her sunucu için ayrı bir sayaç taşır. İki olayın vektörlerinden hiçbiri öbüründen küçük değilse, o olaylar eşzamanlıdır: hiçbiri öbürünü bilmeden oldu.

Kafam karıştı, daha basit anlat

Lamport sayacı sebebi önce koyar. Vektör saati, iki olayın birbirini hiç görmediğini de söyler.

Hızlı kontrolİleri

Lamport sayacında bir sunucu mesaj aldığında ne yapar?

Cevabı biliyor musun?Önce birini seç. Tekrar zamanlaması buna göre ayarlanıyor.

Vektör saati Lamport sayacının veremediği hangi bilgiyi verir?

Cevabı biliyor musun?Önce birini seç. Tekrar zamanlaması buna göre ayarlanıyor.

Kendin gör

Denetim kaydı: olaylar hangi sırada?

Tohum 84068

Gerçek sıra: yatırma → (ücret, bakiye gösterimi) → çekim → defter kaydı

    Oynat ya da adımla: kayıt satır satır dolacak.

    Hız
    Adım 0

    Şu an ne oldu?

    Her sunucunun kendi saatine göre sırala

    S2’nin saati 4 saniye geri. Gerçekte önce para yatırıldı, sonra çekildi.

    Görevler0/3

    • Para çekimi, yatırmadan önce listelensinaçık

      İpucu

      Sunucuların kendi saatine güven.

    • Hiçbir olay sebebinden önce listelenmesinaçık

      İpucu

      Mesajlarla birlikte bir sayaç taşı.

    • Ücret kesintisinin S2’deki olaylarla eşzamanlı olduğunu gösteraçık

      İpucu

      Sunucu başına bir sayaç.

    Olay günlüğü (0)

    Henüz olay yok. Oynat veya adımla.

    1. Varsayılanla oynat. Mobil sunucunun geri saati, bakiye gösterimini ve çekimi yatırmadan önceye koydu.
    2. “Lamport sayacı” seç. Hiçbir olay sebebinden önce değil. Ama ücret kesintisi, ilgisiz olduğu hâlde bakiye gösteriminden önce sıralandı.
    3. “Vektör saati” seç. Sıra yine doğru; ücret kesintisi üç olayla eşzamanlı olarak işaretlendi.
    Hızlı kontrolOrta

    Mobil sunucunun saati 4 saniye geri. Kayıt zaman damgasına göre sıralanıyor. Ne görülür?

    Cevabı biliyor musun?Önce birini seç. Tekrar zamanlaması buna göre ayarlanıyor.

    Lamport sayısı 2 olan olay ile 5 olan olay için kesin olarak ne söylenebilir?

    Cevabı biliyor musun?Önce birini seç. Tekrar zamanlaması buna göre ayarlanıyor.

    Tuzaklar

    Mantıksal saati her yerde kullanmak. Aynı hesabın bütün olaylarını tek bir sıralayıcıdan geçirmek çoğu zaman yeter: Kafka’da hesap numarasını anahtar yap, o hesabın olayları tek bölümde ve sırayla kalır.

    Zaman damgasını sıralama için kullanmak. Zaman damgası insanlara “ne zaman” sorusunu cevaplamak içindir. Olay sırası için sayaç ya da sıralayıcı kullan.

    Lamport sayacından eşzamanlılık çıkarmak. Lamport sayacı küçük olan olay her zaman önce olmuş değildir; yalnızca sonra olmadığı kesindir.

    Kafam karıştı, daha basit anlat

    Aynı hesabı tek sıradan geçir, zaman damgasını sıralama için kullanma, Lamport sayısından eşzamanlılık çıkarma.

    Hızlı kontrolOrta

    Aynı hesabın olaylarını sırayla işlemenin en basit yolu nedir?

    Cevabı biliyor musun?Önce birini seç. Tekrar zamanlaması buna göre ayarlanıyor.
    Derinleş · Hesap olayları: sıralayıcı ve Lamport sayacı 4 dosya · ~72 satır · ilk okumada atlayabilirsin
    Proje dosyaları

    src/main/java/com/bank/audit/ LamportClock.java Sayaç: her olayda bir artar; gelen mesajda gördüğünün bir fazlasına çıkar.

    src/main/java/com/bank/audit/LamportClock.java
    @Component
    class LamportClock {
    private final AtomicLong counter = new AtomicLong();
    /** A local event or a send: one more than before. */
    long tick() {
    return counter.incrementAndGet();
    }
    /** A receive: at least one more than what the sender had seen. */
    long observe(long received) {
    return counter.updateAndGet(own -> Math.max(own, received) + 1);
    }
    }

    src/main/java/com/bank/audit/ AccountEventPublisher.java Yayıncı: olay hesap numarasıyla anahtarlanır, böylece aynı hesabın olayları tek bölümde sırayla kalır; sayaç başlıkta taşınır.

    src/main/java/com/bank/audit/AccountEventPublisher.java
    @Component
    class AccountEventPublisher {
    static final String LAMPORT_HEADER = "lamport";
    private final KafkaTemplate<String, AccountEvent> kafka;
    private final LamportClock clock;
    AccountEventPublisher(KafkaTemplate<String, AccountEvent> kafka, LamportClock clock) {
    this.kafka = kafka;
    this.clock = clock;
    }
    void publish(AccountEvent event) {
    // The account number is the key: one account, one partition, one order.
    ProducerRecord<String, AccountEvent> record = new ProducerRecord<>("account-events", event.iban(), event);
    record.headers().add(LAMPORT_HEADER, Long.toString(clock.tick()).getBytes(StandardCharsets.UTF_8));
    kafka.send(record);
    }
    }

    src/main/java/com/bank/audit/ AuditListener.java Dinleyici: gelen sayacı görür, kendi sayacını ilerletir ve denetim kaydına sayaçla yazar.

    src/main/java/com/bank/audit/AuditListener.java
    @Component
    class AuditListener {
    private final LamportClock clock;
    private final AuditLog audit;
    AuditListener(LamportClock clock, AuditLog audit) {
    this.clock = clock;
    this.audit = audit;
    }
    @KafkaListener(topics = "account-events")
    void on(AccountEvent event, @Header(AccountEventPublisher.LAMPORT_HEADER) byte[] lamport) {
    long seen = clock.observe(Long.parseLong(new String(lamport, StandardCharsets.UTF_8)));
    audit.append(event, seen); // ordered by (lamport, service), never by wall clock
    }
    }

    src/test/java/com/bank/audit/ LamportClockTest.java Test: alınan mesajdan sonraki her olay, gönderenin sayacından büyük.

    src/test/java/com/bank/audit/LamportClockTest.java
    class LamportClockTest {
    @Test
    void anEventAfterAReceiveIsAlwaysLaterThanTheSender() {
    LamportClock branch = new LamportClock();
    LamportClock mobile = new LamportClock();
    long deposit = branch.tick(); // 1
    long shown = mobile.observe(deposit); // 2
    long withdrawal = mobile.tick(); // 3
    assertThat(shown).isGreaterThan(deposit);
    assertThat(withdrawal).isGreaterThan(shown);
    }
    @Test
    void aSlowReceiverJumpsAhead() {
    LamportClock receiver = new LamportClock();
    assertThat(receiver.observe(41)).isEqualTo(42);
    }
    }

    Kendini sına

    Şimşek turu1/4

    NTP kullanan sunucuların saatleri birebir aynıdır.

    Soru 1/3İleri

    Vektör saatinde [1,2,0] ve [2,0,0] olayları için ne söylenir?

    Cevabı biliyor musun?Önce birini seç. Tekrar zamanlaması buna göre ayarlanıyor.

    Aklında kalacak üç şey

    1. 1 Farklı makinelerin saatleri olay sırasını kanıtlamaz. NTP kaymayı küçültür ama sıfırlamaz; birbirine yakın iki olay ters sıralanabilir.
    2. 2 Lamport sayacı her olayda bir artar ve her mesajla taşınır; alan, kendi sayacını gördüğünün bir fazlasına çıkarır. Böylece sebep her zaman sonuçtan önce gelir.
    3. 3 Vektör saati her sunucu için ayrı bir sayaç tutar ve iki olayın birbirini hiç görmediğini, yani eşzamanlı olduğunu da söyler. Çoğu zaman en basit çözüm, aynı hesabın olaylarını tek bir sıralayıcıdan geçirmektir.
    Sonraki kapı Bora 'Hesabım' sayfasını açtı ve başka birinin bakiyesini gördü. Kod doğruydu, veritabanı doğruydu. Sayfa nereden geldi? CDN ve Kenar Önbellek — Kampanya Sayfası Hızlansın, Hesap Sayfası Karışmasın · 9 dk

    4 kart sonraki derste seni bekliyor

    0/4 kart bu dersten toplandı