Ölçümleme pipeline'ınız tepe trafikte olay kaybediyor ve atıf sayıları bidder loglarıyla bir türlü uyuşmuyor. Bunlar tek bir belirtinin arkasındaki iki arızadır: kimsenin saymadığı bir ek yerinde hiç ulaşmayan olaylar ve ulaşıp farklı bir kurala göre sayılan olaylar. Ek yerlerinin, anahtarların, geç varış penceresinin ve mutabakat köprüsünün nasıl kurulduğu aşağıda.
Tepe trafikte olay kaybeden ve bidder loglarıyla hiç mutabakata gelmeyen bir olay pipeline'ı, tek bir belirtinin arkasında iki arıza olabilir. Biri taşımadır: oluşturulan ama hiç ulaşmayan olaylar, kimsenin saymadığı bir ek yerinde. Diğeri tanımsaldır: ulaşan ama açık artırma kaydından farklı bir kurala göre sayılan olaylar.
Alışılmış çerçeve - pipeline olay düşürüyor, öyleyse pipeline'ı yeniden kuralım - bu ikisinden en fazla birini çözer. Aşağıdakiler ikisini birbirinden ayırır ve bir mutabakatın ne ürettiğini söyler; ürettiği şey eşitlik değildir. Aşağıda alıntılanan varsayılanlar taşıma tarafında Kafka'ya, depolama tarafında ClickHouse'a aittir.
Kısa yanıt yapısaldır: uçtan uca taşınan, açık artırma başına tek bir kimlik, her hop'un iki yanında birer sayaç ve çoktan kapanmış bir pencere üzerinde bir mutabakat. amBrain'in kamuya kanıtlayabildikleri AdTech işidir: DSP geliştirme, real-time bidding platformları ve ad exchange mühendisliği. Herhangi bir RTB yığınında teklif, kazanım ve gösterim kayıtları bu taraftan gelir. Aşağıdaki pipeline, bizim bir vakamızdan değil, sorunun mekaniğinden yola çıkarak anlatılıyor.
İlk arıza kayıptır: olay oluşturuldu ve belirli bir hop'ta, belirli bir nedenle hiç ulaşmadı. Sayfadan hiç çıkmayan bir beacon, deploy ortasında yeniden başlatılan bir edge, dolan bir producer buffer'ı, işlemeden önce offset'ini commit eden bir consumer.
İkincisi hiç arıza değildir. Ölçüm tarafı istemcinin başlattığı bir olayı sayar; bidder ise sunucu tarafındaki bir açık artırma sonucunu kaydeder. Biri bir tahsis, diğeri o tahsise ne olduğunun gözlemidir. MRC ölçümleme rehberi pre-fetch, pre-render ve otomatik yenilemeyi tespit edilip açıklanması gereken ayrı şeyler olarak ele alır: bir taşıma arızası değil, bir sayma kuralı. İkisini birbirinden ayırmanın bedeli tek bir sorgu ve biraz sabırdır.
O eğri var olana kadar tartışmanın iki tarafı da görüşten ibarettir. Sonrasında eğrinin şekli, bu yazının hangi yarısının geçerli olduğuna karar verir ve iki yarı birbirini dışlamaz.
Bir reklam olayının oluşturulup sonra sessizce var olmayı bıraktığı yedi yer var, üstüne garanti gibi görünen ama garanti olmayan bir ayar.
Kural bir raporlama kuralıdır, mühendislik kuralı değil: bir kayıp ya adı konmuş bir ek yerine yazılır ya da hiç yazılmaz. İki alarm sessiz ek yerlerini görünür tutar - saklama süresine karşı zaman cinsinden ölçülen consumer lag ve atlamak yerine hata veren bir reset politikası.
Tekilleştirme anahtarı, hedefte seçilen kullanışlı bir birincil anahtar değildir. Her yeniden denemenin yukarısında, açık artırma anında ya da olay oluşturulurken atanır; alıcı taraf asla kendisi bir anahtar uydurmaz. Varış zaman damgaları dışarıda kalır: yeniden deneme yeni bir varış zamanı ve yeni bir anahtar taşır.
Anahtarın her denemede birebir aynı olması gerekir; bu da parçalarını belirler: exchange ya da seat, açık artırma kimliği, gösterim kimliği ve olay türü. Topic'i bu anahtara göre partition'layın; böylece yeniden denemeler birlikte düşer ve anahtar başına sıralama korunur. Bu talimat yalnızca taşıma katmanı içindir: aynı kelime sütun tabanlı depoya uygulandığında olay başına bir partition çıkar ve insert, blok başına sınırda ölür. Depolamayı zamana göre partition'layın, anahtara göre sıralayın.
Yani çalışan biçim, idempotent anahtarlarla at-least-once taşımadır. Yazma anındaki tekilleştirme depolama faturasını makul tutar; sayıyı doğru yapan ise okuma anındaki tekilleştirmedir. Merge'ler farklı partition'lardaki part'ları asla birleştirmez; bu yüzden bir sonraki partition'a düşen bir mükerrer, ancak bir sorgu sorduğunda çözülür.
Aşırı yük altında bir sistemin üç seçeneği vardır: producer'ı yavaşlatmak, sayaçla yük atmak ya da sessizce kaybetmek. Yalnızca üçüncüsü kabul edilemez ve bu, kendisine bu soru hiç sorulmamış kodun varsayılan davranışıdır. Tepe yükteki kayıp, bellek tükenene kadar büyüyen bir kuyruk ya da kalıcılıktan önce verilmiş bir onaydır.
Etiketli sayacı olan bir düşürme, sonradan mutabakata getirilebilen bilinen bir büyüklüktür. Sayacı olmayan bir düşürme kayıp veri değil, kayıp sayıdır.
OpenRTB uygulama rehberi bunu doğrudan söyler: reklam isteğinden açık artırmaya, oradan render ve faturalamaya uzanan zincir temelde işlemsel değildir. İki sayımın arasında fazla sayıda taraf oturuyor.
Gecikme istisna değil, beklenen durumdur. Bid request bir gösterim sona erme süresi taşıyabilir, teklif ise bidder'ın tolere ettiği gecikmeyi; aynı rehber, web için dakika mertebesinden önbelleğe alınmış uygulama içi formatlar ve stitched video için çok daha uzun sürelere uzanan pratik kurallar verir.
İki alan da bir sözleşme değildir. Rehber açıkça şunu söyler: bidder'ın bildirdiği sona erme süresinden daha geç gelen bir faturalama bildirimi yine de faturalanabilir olabilir - bu, protokolün dayattığı bir şey değil, bidder ile exchange arasında bir politika tartışmasıdır.
Pencere kapandıktan sonra gelen bir olay, pipeline'daki bir kusur değil, mecranın bir özelliğidir. Tek gerçek seçim, sayının pencere açıkken herkesin gözü önünde mi yoksa kapandıktan sonra sessizce mi hareket edeceğidir.
Exchange'in bildirim ve takip URL'lerine yerleştirdiği kimlikler şunlardır: bid request'teki açık artırma kimliği, gösterim kimliği ve bidder bir tane ürettiyse teklif kimliği. Üçünün hiçbiri tek başına anahtar değildir.
Spesifikasyon açık artırma kimliğini küresel olarak benzersiz değil, exchange içinde benzersiz olarak tanımlar: iki exchange aynı gün size aynı dizgiyi verebilir. Gösterim kimliği yalnızca kendi bid request'inin içinde benzersizdir ve çoğu zaman düpedüz 1'dir. Teklif kimliği isteğe bağlıdır.
Tutan anahtar bileşik olandır: işlemi yaptığınız exchange ya da seat, artı açık artırma kimliği, artı gösterim kimliği. Bunu bidder tarafında, açık artırma anında üretin ve daha kısa olan her şeye anahtar değil önek muamelesi yapın.
Bu makrolar beacon'larda yoksa olay düzeyinde mutabakat imkânsızdır; geriye zaman, yerleşim ve kreatif üzerinden eşleştirme kalır. Bunun yerine kurabileceğiniz şey, her biri bir üst adımdan neden farklılaştığını söyleyen altı sayımdan oluşan bir köprüdür.
Amaç, adımlar arasında istikrarlı bir orandır; alarm ise açıklanamayan bir kaymadır. Tek bir sistemin içinde hop oranları bir olmalıdır ve her sapma sinyaldir. Açık artırma ile ölçüm arasındaki sınırda ise şüpheli okuma birdir.
Aynı sayaçlar oran olarak okunduğunda soru aritmetiğe dönüşür: kabul edilenin gönderilene, üretilenin kabul edilene, tüketilenin üretilene, eklenenin tüketilene oranı. Tek bir grafikteki dört oran, kimse log açmadan olayların nereye gittiğini söyler. Kaynak ve partition başına producer tarafında bir sıra numarası ekleyin; böylece bir boşluk şüphe değil kanıt olur.
Köprünün yanıtlamadığı, bir sözleşmenin ise yanıtladığı tek bir soru var: bu sayıların hangisi üzerinden ödeme yapıyorsunuz. Satıcı geliri kendi faturalanabilir olayına göre yazar, alıcı kendi olayına göre hızını ayarlar ve rehber, kalıcı bir farkı taraflar arasında bir destek görüşmesi olarak ele alır.
Harcama için hangi sayımın esas kayıt olduğuna ve hangi fark seviyesinde bir rapor notunun exchange'e açılan bir talebe dönüşeceğine önceden karar verin. Yukarıdaki iş size kaybın nereye yazılacağını, dürüst mükerrerleri ve satır satır açıklanmış bir mutabakatı kazandırır. Şunları kazandırmaz.
Bu açıklama sorularını yanıtlayabilen bir pipeline'ın bütünlük anlatısı vardır. Yanıtlayamayanın elinde yalnızca bir görüş vardır ve çeyrek sonunda tartışılan şey görüştür.
Tasarımda karşı önlem almaya değer arıza, soruşturma başlatan eksik saat değildir. Sessiz olanıdır: sayaç tutmadan yük atan bir ek yeri, kalıcı olmadan onaylanmış bir insert ve hâlâ açık bir pencere üzerinde yapılan bir mutabakat.
amBrain'in kamuya kanıtlayabildikleri: amBrain, Erivan (Ermenistan) merkezli bir yazılım mühendisliği şirketidir; Rust ile low latency trading platformları, matching engine'ler ve real-time bidding sistemleri geliştirir. amBrain 2019'dan beri yazılım geliştiriyor. Bir ölçümleme pipeline'ını yeniden kurmak burada anlatılan iş değildir. Sayılar bidder ve exchange tarafında - teklif, kazanım ve gösterim kayıtlarının kendisinde - mutabakata gelmeyi bırakıyorsa, konuşmaya değer konu budur ve bu konuşma yeniden kurmakla değil, oturma eğrisiyle başlar.
Mevcut mimarinizi ve sizi endişelendiren hata senaryosunu getirin; yarım saatte birlikte üzerinden geçelim.