Bu sayfada
AI Engineer tarafından 3 Ekim 2026’da yayımlanan bir konuşmada, Crusoe’dan bir geliştirici savunucusu (developer advocate) iki A100 düğümünde bir PyTorch eğitim işi başlattı. Ardından demonun kendi izleme sistemine bir GPU’nun XID 79 hatası verdiğini bildirdi. Düğüm devre dışı olarak işaretlendi ve iş iptal edildi. Süreç bir SIGTERM aldı ve “kontrol noktalarınızı kaydetmek ya da loglarınızı boşaltmak için bu SIGTERM’i işlemeye iki dakikaya kadar” süresi oldu. Yedek bir düğüm devreye girdi ve “slurm işi yeniden başlayacak. Kontrol noktasını yükleyecek ve eğitime kaldığı yerden devam edecek”. Baştan sona on beş dakikanın biraz altında. Kimse çağrılmadı.
Bir senkronizasyon, bir eğitim çalıştırmasından çok daha küçük bir hayvandır. Soru ise aynıdır. Worker’ı öldürmenin duplikasyonlara değil yalnızca birkaç dakikaya mal olması için bir çalıştırmanın neye ihtiyacı vardır?
Bu, Tajo’nun kendi senkronizasyon çalıştırıcısı için yanıttır ve bir broşürden değil, koddan okunmuştur. Reverse ETL işin biçimini anlatır. Bu yazı ise iş öldüğünde ne olduğunu anlatır.
Tek bir kişiyi izleyin
Bir çalıştırma kaynağı kaydedilmiş bir imleçten başlayarak sayfa sayfa okur. Sayfa imlecine c3 diyelim, kişimiz de o sayfadaki 212. kayıt olsun. Herhangi bir şey yazılmadan önce bu kişi hakkında üç şey doğrudur.
Birincisi, bir teslim anahtarı vardır. Anahtar; senkronizasyonun kimliğinin, kaynağın, sayfa imlecinin, sayfadaki konumun ve kaydın kendisinin bir hash değeridir. İmleç ve kayıt hash’e girer ama anahtarın içine asla gömülmez; bu yüzden anahtar hiçbir e-posta adresi taşımaz.
İkincisi, yazma doğrudan hedefe değil, bir defterden geçer. Hedef çağrılmadan önce anahtar beklemede olarak talep edilir. Yazma başarılı olduğunda satır tamamlandı olarak işaretlenir ve yedi gün saklanır.
Üçüncüsü, imleç ilerlememiştir. Yalnızca bir toplu işlemin sonunda, yalnızca o toplu işlemdeki her kayıt yerine ulaştıysa ve yalnızca çalıştırma senkronizasyonun hâlâ kendisinde olduğunu kanıtladıktan sonra ilerler.
Şimdi worker’ı yazma ile kontrol noktası arasında öldürün.
Bir SIGTERM geldiğinde her kuyruk worker’ı ortak tek bir on beş saniyelik süre sınırı içinde boşaltılır ve süreç, hâlâ çalışan ne olursa olsun yirmi beş saniye sonra kapanır; systemd ise öldürmeden önce ona kırk beş saniye tanır. Bu pencere içinde bitmeyen bir çalıştırma hâlâ sürüyor olarak işaretli kalır ve sonraki worker onu kuyruğun takılmış iş kurtarması aracılığıyla devralır. Sert bir sonlandırmada ise hiç boşaltma olmaz. Her iki durumda da aynı iki gerçek geçerlidir. Hedefte kişimiz vardır. İmlecimiz hâlâ c3 der.
Yeniden oynatma
Sonraki çalıştırma c3’ten başlar, aynı sayfayı okur, 212. kayıt için aynı anahtarı türetir ve deftere sorar. Defter tamamlandı der. Hedef çağrılmaz; saklanan sonuç yeniden oynatılır ve çalıştırma devam eder. Brevo’nun içe aktarma uç noktasının tüm sayfayı tek çağrıda aldığı toplu yolda da aynı kontrol, istek oluşturulmadan önce her anahtar için çalışır. Tüm anahtarları zaten tamamlanmış bir sayfa hiçbir şey göndermez.
Bütün hile budur ve neden işe yaradığını söylemeye değer. Anahtar, o sırada yürütülmekte olan çalıştırmadan değil, toplu işlemin başındaki sayfa imlecinden türetilir. Bir çökme, altmış saniye sonraki bir yeniden deneme ve yarın zamanlanmış bir çalıştırma aynı kayıt için aynı anahtarı türetir. Defter, hangisinin sorduğuyla ilgilenmez.
Şimdi bedeli. Defter yedi gün sonra unutur. Kodun kendi yorumu, yedi günün gecikmiş bir yeniden denemeyi ve kısa bir kesintiyi kapsadığını söyler; iddia ettiği de yalnızca budur. Bundan daha eski bir imleçten yapılan yeniden oynatma tekrar yazar. Sert biçimde kesintiye uğrayan bir çalıştırma da bekleyebilir. Ölü çalıştırmanın kiralaması on beş dakikaya kadar sürer ve zamanlanmış bir senkronizasyonda kiralaması boşta olan bir çalıştırma ancak bir saatten uzun süre önce başlamışsa süpürülüp yeniden zamanlanır. Crusoe’nun demosu on beş dakikanın altında geri döner. Bizimki her zaman değil.
Senkronizasyon yeniden başlarken kimin elinde
Bir senkronizasyon aynı anda tek bir çalıştırmaya aittir. Çalıştırma, Redis’te kendi belirteciyle, on beş dakikalık ömrü olan ve beş dakikada bir yenilenen bir kiralama alır. Her kontrol noktasından önce bu kiralamayı hâlâ elinde tuttuğunu doğrular. Tutmuyorsa durur. Çalıştırma, kişinin okuyacağı sade cümleyle kaydedilir: “The run lost its slot part-way through and stopped to avoid writing twice.” (Çalıştırma yarı yolda yerini kaybetti ve iki kez yazmamak için durdu.) Canlı bir sahiple çakışan ikinci bir çalıştırma yeniden denenmez. “Another run of this sync was already in progress” (Bu senkronizasyonun başka bir çalıştırması zaten sürüyordu) mesajıyla sona erer ve sonraki zamanlanmış çalıştırma normal biçimde başlar.
Düzeltmenin kimde olduğu da yazılıdır. Her hata kodu, ne olduğunu anlatan bir cümleye, bundan sonra ne yapılacağını anlatan bir cümleye ve bir sahibe karşılık gelir: siz ya da Tajo. Eşleme yanlış olduğu için her kaydı reddeden bir hedef sizin sorumluluğunuzdadır. Kaybedilen bir kiralama bizimdir. Çalıştırmanın sayfası bir sonraki adımı gösterir; senkronizasyon kurtarma rehberi hangisi olduğunu listeler.
Buraya kadarı işin kolay yarısıdır. Bir çökme tek bir yeniden oynatmaya mal olur ve hiçbir şey iki kez yazılmaz. Diğer yarısını iki olay öğretti.
Başarısızlık üstüne başarısızlık
Bir senkronizasyon tekrar tekrar başarısız oldu. Sıkı bir döngüde değil: zamanlayıcı aralığı başına bir kez, çalıştırma üstüne çalıştırma, her seferinde aynı mesajla, yani özel bir kimliğin iki nokta üst üste içeremeyeceği mesajıyla. Çalıştırma hedefe hiç ulaşmadı. Kuyruğa alınırken, hiçbir çalıştırıcı onu görmeden öldü; bu yüzden çalıştırıcıya bağlı bir alarmın bağlanabileceği hiçbir şey olmadı.
Bu seriyi izleyen hiçbir şey yoktu. Bulgunun tamamı budur.
Çözüm bir devre kesicidir. Kaydedilen her başarısızlıktan sonra, senkronizasyonun son değiştirilmesinden bu yana biten son beş çalıştırmasını okur. Beşi de hataysa senkronizasyonu duraklatır, circuit_breaker_tripped nedeniyle tek bir denetim satırı yazar ve tek bir kritik alarm tetikler. Seri, worker’daki bir sayaçtan değil, saklanan çalıştırmalardan türetilir. Olaya neden olan kuyruğa alma hatası dahil, herhangi bir yoldan kaydedilen başarısızlık sayılır. Kodun yorumu, bu olayı beşinci çalıştırmada durduracağını söyler. Tek bir başarı seriyi sıfırlar. Duraklatmayı kaldırmak, devre kesiciyi eski satırlar yüzünden yeniden tetiklemek yerine onu yeniden kurar. Shopify bağlayıcı kılavuzu aynı şeyi tek satırda söyler: art arda beş başarısız çalıştırmadan sonra senkronizasyon kendini duraklatır ve sayfası son hatayı gösterir.
Devre kesicinin yapmadığı şey, herhangi bir şeyi düzeltmektir. Crusoe düğümü değiştirir ve işi sormadan yeniden başlatır. Tajo durur ve sorar: duraklatılmış bir senkronizasyon, bir kişi nedeni düzeltip onu yeniden yayımlayana kadar duraklatılmış kalır. Bu temkinli varsayılan bilinçlidir: müşteri kayıtlarına yazan bir senkronizasyonun otomatik olarak yeniden denenmesi, kendisi de bir yazmadır.
Kimsenin görmediği sessizlik
İtiraz yerindedir ve şöyle gider: “Beş başarısızlıktan sonra duraklatan bir devre kesici ikinci olayı da yakalardı. Neden ikinci bir gözcü kurulsun?” Çünkü ikinci olay başarısızlık gibi görünmüyordu. Uzun bir süre boyunca bir çalışma alanında etkin bir senkronizasyon, giderek büyüyen bir hata satırı yığını ve hiç, tek bir başarı bile yoktu; hiçbir şey de alarm vermedi. Var olan her sinyal bir etkinliğe bağlıydı: bir çalıştırma başarısız oldu, bir webhook geldi, bir bütçe aşıldı. Sıfır başarı bir olay değildir. Bir olayın yokluğudur ve bir devre kesici yalnızca bir başarısızlık kaydedildiğinde çalışır. Ölmüş bir zamanlayıcı, kilitlenmiş bir kuyruk, hiç açılmayan bir worker: bunlar hiçbir şey kaydetmez ve bir devre kesici asla uyanmaz.
Bir lokomotifin ölü adam kolu tam tersi çalışır. Makinist onu basılı tutmaya devam etmek zorundadır ve sessizlik treni durdurur. Senkronizasyon sürümü saatte bir, saati on üç geçe çalışır. Etkin senkronizasyonu olan her çalışma alanına tek bir soru sorar: son yirmi dört saatte herhangi bir çalıştırma başarılı oldu mu? En eski etkin senkronizasyonu bir günden kısa süre önce etkinleştirilmiş bir çalışma alanına dokunulmaz; henüz başarılı olmak için bir günü olmamıştır. Daha eski ve sessiz olan bir çalışma alanı tek bir kritik alarm alır. Alarm hangi sessizlik olduğunu söyler: çalıştırmalar kaydedilmiş ama hiçbiri başarılı değil ya da hiç çalıştırma kaydedilmemiş. Her olayda bir kez tetiklenir. Redis’teki bir işaretçi onu ilk başarılı çalıştırmaya kadar kapalı tutar, sonra temizlenir; böylece sonraki olay yeniden alarm verir.
İki gözcü de olaydan sonra tek bir commit ile geldi. Devre kesicinin yorumu, ilk olayı beşinci çalıştırmada durduracağını söyler. Ölü adam kontrolünün yorumu, uzun zaman önce etkinleştirilmiş ve sıfır çalıştırması olan bir senkronizasyonun alarm vermesi gerektiğini söyler. İkisi de ihtiyaç duyulduğunda yoktu. Onları sonradan yazdık; kimse nedenini unutmasın diye iki olay da dosya başlığına kaydedildi.
Ne kuruldu, ne kurulmadı
Bu yazının yazıldığı tarih itibarıyla kurulu olanlar:
- İmleç her temiz toplu işlemin sonunda ve bir çökmede yeniden kaydedilir.
- Her kaydın teslim anahtarı sayfa imlecinden ve konumundan türetilir ve hedefe yapılan her çağrıdan önce yedi günlük bir deftere karşı kontrol edilir.
- Senkronizasyon başına on beş dakikalık ömrü olan tek bir kiralama.
- Çalıştırma başına altmış saniyeden başlayarak geri çekilen beş deneme.
- Art arda beş başarısızlıktan sonra senkronizasyonu duraklatan ve nedenini kaydeden bir devre kesici.
- Başarı olmadan geçen yirmi dört saat için saatlik bir alarm.
Kurulmayanlar ve buna güvenmeden önce bilmeye değer olanlar:
- Ölü adam kontrolü senkronizasyonu değil, çalışma alanını izler. Sağlıklı tek bir senkronizasyon, aynı çalışma alanındaki sessiz bir kardeşini gizler.
- Alarmı Tajo’nun operatörlerine ulaşır: her zaman bir log satırı, yapılandırıldığı yerde ise Sentry, bir webhook ya da bir e-posta. Senkronizasyonun sayfasında görünmez. Devre kesicinin duraklatması ise görünür.
- Duraklatılmış bir senkronizasyonu hiçbir şey yeniden başlatmaz. Bunu bir kişi yapar.
- Sert bir sonlandırmadan sonra kurtarma hızlı değildir. Kiralama on beş dakika sürebilir ve süpürme bir saat bekler.
- İki eşik de, yani beş başarısızlık ve yirmi dört saat, dağıtım ayarlarıdır. Bunları senkronizasyon başına ayarlayamazsınız.
Neredeyse kusursuz adımlardan oluşan uzun bir zincir yine de başarısız olur; çıkış yolu son durumu tanımlamak ve onu kontrol etmektir. Bu yazı bunun operasyonel yarısıdır. Ölü bir çalıştırmanın geride ne bıraktığını tanımlayın ve sessizliğin geride bıraktığı hiçliği kontrol edin.
Crusoe’nun kapanış cümlesi “başarısızlıklar kaçınılmazdır” oldu. Bizimki bir adım ötede. Çökme kolay yarıydı, çünkü geride satırlar bıraktı. Sessizlik ise aramaya çıkmamız gereken yarıydı.
Sık Sorulan Sorular
Worker bir toplu işlemin ortasında öldüğünde çalışan senkronizasyona ne olur?
İmleç hâlâ yarıda kalan toplu işlemin başını gösterir, çünkü Tajo onu yalnızca bir toplu işlem temiz biçimde tamamlandıktan sonra ilerletir. Sonraki çalıştırma aynı sayfayı yeniden okur. Her kayıt, sayfa imlecinden ve kaydın konumundan türetilen bir teslim anahtarı taşır; bir defter de tamamlanan her yazmayı yedi gün saklar. Böylece zaten yazılmış kayıtlar hedefe ikinci kez gönderilmez, sonuçları defterden yeniden oynatılır.
Yeniden oynatılan bir senkronizasyon aynı kişiyi neden iki kez yazmaz?
Çalıştırma, hedefe yapılan her çağrıdan önce kaydın teslim anahtarını bir deftere karşı kontrol eder. Anahtar; senkronizasyonun, kaynağın, sayfa imlecinin, sayfadaki konumun ve kaydın kendisinin bir hash değeridir. Bu yüzden bir çökme, bir dakika sonraki yeniden deneme ve ertesi günkü zamanlanmış çalıştırma aynı kayıt için aynı anahtarı türetir. Yedi günlük pencere içinde tamamlandı olarak işaretlenmiş bir anahtar yeniden gönderilmez.
Bir senkronizasyon için ölü adam alarmı nedir?
Başarısızlık üzerine değil, yokluk üzerine tetiklenen bir kontroldür. Tajo saatte bir, etkin senkronizasyonu olan her çalışma alanına bakar ve son yirmi dört saatte hiçbir çalıştırma başarılı olmadıysa alarm verir; hiç çalıştırma kaydedilmemiş olması da buna dahildir. Her olayda bir kez tetiklenir ve ilk başarılı çalıştırmadan sonra yeniden kurulur. Var olmasının nedeni, bir hata alarmının yalnızca kaydedilmiş hataları görebilmesidir.