Dağıtılmış Derlemeler

Geniş bir kod tabanına sahip olduğunuzda, bağımlılık zincirleri çok derin hale gelebilir. Basit ikili programlar bile on binlerce derleme hedefine dayanabilir. Bu ölçekte, bir derlemeyi tek bir makinede makul bir sürede tamamlamak imkansızdır: Hiçbir derleme sistemi, makine donanımlarına uygulanan fizik kurallarından kaçınamaz. Bu işi yapmanın tek yolu, sistem tarafından yapılan iş birimlerinin rastgele ve ölçeklenebilir sayıda makineye yayıldığı, dağıtılmış derlemeleri destekleyen bir derleme sistemidir. Sistemin çalışmasını yeterince küçük birimlere ayırdığımızı varsayarsak (ileride bununla ilgili daha fazla bilgi verilecektir) bu, her boyuttan yapıyı ödeme gücümüz olan en kısa sürede tamamlamamıza olanak tanır. Bu ölçeklenebilirlik, yapı tabanlı bir derleme sistemi tanımlayarak ulaşmak istediğimiz kutsal hedeftir.

Uzaktan önbelleğe alma

Dağıtılmış derlemenin en basit türü, yalnızca uzaktan önbelleğe alma özelliğinden yararlanan ve Şekil 1'de gösterilmiştir.

Uzaktan önbelleğe alma ile dağıtılmış derleme

Şekil 1. Uzaktan önbelleğe almayı gösteren dağıtılmış bir derleme

Geliştirici iş istasyonları ve sürekli entegrasyon sistemleri dahil olmak üzere, derleme yapan her sistem, ortak bir uzak önbellek hizmetine referans verir. Bu hizmet, Redis gibi hızlı ve yerel bir kısa vadeli depolama sistemi veya Google Cloud Storage gibi bir bulut hizmeti olabilir. Bir kullanıcının doğrudan veya bağımlılık olarak bir yapı derlemesi gerektiğinde, sistem önce uzak önbelleği kontrol ederek söz konusu yapının orada zaten olup olmadığını kontrol eder. Bu durumda yapıyı derlemek yerine indirebilir. Aksi halde, sistem yapıyı oluşturur ve sonucu önbelleğe geri yükler. Bu, çok sık değişmeyen düşük seviyeli bağımlılıkların, her kullanıcı tarafından yeniden oluşturulmak zorunda kalmadan bir kez oluşturulup kullanıcılar arasında paylaşılabileceği anlamına gelir. Google'da birçok eser sıfırdan derlemek yerine bir önbellekten sunulur. Bu da derleme sistemimizin çalışma maliyetini büyük ölçüde azaltır.

Uzaktan önbelleğe alma sisteminin çalışabilmesi için derleme sisteminin, derlemelerin tamamen yeniden oluşturulabilir olduğunu garanti etmesi gerekir. Yani, herhangi bir derleme hedefi için söz konusu hedefe yönelik giriş grubunun belirlenebilmesi gerekir. Böylece, aynı giriş grubu tüm makinelerde tam olarak aynı çıktıyı üretmelidir. Bir yapıyı indirmenin sonuçlarının, kendisinin oluşturma sonuçlarıyla aynı olmasını sağlamanın tek yolu budur. Bu işlem, önbellekteki her bir yapının hem hedefine hem de girişlerinin bir karmasına bağlanmasını gerektirir. Bu şekilde, farklı mühendisler aynı hedef üzerinde aynı anda farklı değişiklikler yapabilir ve uzak önbellek, ortaya çıkan tüm yapıları depolayarak bunları çakışma olmadan uygun şekilde sunar.

Elbette uzak bir önbellekten fayda sağlayabilmek için bir eserin indirilmesinin onu oluşturmaktan daha hızlı olması gerekir. Bu her zaman geçerli değildir, özellikle de önbellek sunucusu derlemeyi yapan makineden uzaktaysa. Google'ın ağı ve derleme sistemi, derleme sonuçlarını hızlı bir şekilde paylaşabilmek için dikkatli bir şekilde ayarlanmıştır.

Uzaktan yürütme

Uzaktan önbelleğe alma, gerçek dağıtılmış bir derleme değildir. Önbellek kaybolursa veya her şeyin yeniden oluşturulmasını gerektiren düşük düzeyde bir değişiklik yaparsanız derlemenin tamamını yine de makinenizde yerel olarak gerçekleştirmeniz gerekir. Asıl hedef, uzaktan yürütmeyi desteklemektir. Bu durumda, derlemeyi yaparken yapılan asıl iş istenilen sayıda çalışana yayılabilir. Şekil 2'de bir uzaktan yürütme sistemi gösterilmektedir.

Uzaktan yürütme sistemi

2. Şekil. Uzaktan yürütme sistemi

Her kullanıcının makinesinde çalışan derleme aracı (kullanıcıların insan mühendisler veya otomatik derleme sistemleri olduğu durumlarda) istekleri merkezi bir derleme ana sistemine gönderir. Derleme ana makinesi, istekleri bileşen işlemlerine ayırır ve bu işlemlerin yürütülmesini ölçeklenebilir bir çalışan havuzunda planlar. Her çalışan, kullanıcı tarafından belirtilen girişlerle istenen işlemleri gerçekleştirir ve ortaya çıkan yapıları yazar. Bu yapılar, nihai çıkış oluşturulup kullanıcıya gönderilene kadar bunları gerektiren işlemler yürüten diğer makineler arasında paylaşılır.

Böyle bir sistemi uygulamanın en zor kısmı çalışanlar, ana makine ve kullanıcının yerel makinesi arasındaki iletişimi yönetmektir. İşçiler diğer çalışanlar tarafından üretilen ara eserlere bağlı olabilir ve nihai çıktının kullanıcının yerel makinesine geri gönderilmesi gerekir. Bunu yapmak için, her çalışanın sonuçlarını yazmasını ve önbellekten bağımlılıklarını okumasını sağlayarak daha önce açıklanan dağıtılmış önbelleğin üzerine inşa edebiliriz. Ana makine, çalışanların bağımlı oldukları her şey bitene kadar ilerlemelerini engeller. Bu durumda, girdilerini önbellekten okuyabilirler. Nihai ürün de önbelleğe alınır ve yerel makine tarafından indirilebilir. Kullanıcıların kaynak ağacındaki yerel değişiklikleri dışa aktarmak için ayrı bir yönteme ihtiyacımız olduğunu unutmayın. Böylece çalışanlar değişiklikleri derlemeden önce uygulayabilir.

Bunun işe yaraması için daha önce açıklanan yapı tabanlı derleme sistemlerinin tüm parçalarının bir araya getirilmesi gerekir. İnsan müdahalesi olmadan çalışanları işe alabilmemiz için oluşturma ortamının tamamen kendimizi tanımlaması gerekir. Her adım farklı bir makinede yürütülebileceği için derleme süreçleri tamamen bağımsız olmalıdır. Her çalışanın diğer çalışanlardan aldığı sonuçlara güvenebilmesi için çıktılar tamamen deterministik olmalıdır. Bu tür garantileri, göreve dayalı bir sistemin sağlaması son derece zordur. Bu da, tek bir sistem üzerine güvenilir bir uzaktan yürütme sistemi oluşturmayı neredeyse imkansız hale getirir.

Google'da dağıtılan derlemeler

Google, 2008'den beri hem uzaktan önbelleğe alma hem de uzaktan yürütmenin kullanıldığı dağıtılmış bir derleme sistemi kullanmaktadır. Bu sistem, Şekil 3'te gösterilmiştir.

Üst seviye derleme sistemi

3. Şekil. Google'ın dağıtılmış derleme sistemi

Google’ın uzak önbelleğine ObjFS denir. Derleme çıktılarını üretim makineleri filomuza dağıtılan Bigtable'larda depolayan bir arka uçtan ve her geliştiricinin makinesinde çalışan objfsd adlı ön uç FUSE arka plan programından oluşur. FUSE arka plan programı, mühendislerin derleme çıkışlarına iş istasyonunda depolanan normal dosyalarmış gibi göz atmasına olanak tanır. Ancak, dosya içeriği yalnızca kullanıcı tarafından doğrudan istenen birkaç dosya için isteğe bağlı olarak indirilir. Dosya içeriklerini isteğe bağlı olarak yayınlamak hem ağ hem de disk kullanımını büyük ölçüde azaltır. Ayrıca sistem, tüm derleme çıktılarını geliştiricinin yerel diskinde depoladığımız zamana kıyasla iki kat daha hızlı derleme yapabiliyor.

Google'ın uzaktan yürütme sisteminin adı Forge. Distribütör adı verilen Blaze'deki Forge istemcisi (Bazel'in dahili eş değeri), her işlem için Scheduler adlı veri merkezlerimizde çalışan bir işe istek gönderir. Scheduler, işlem sonuçlarının önbelleğini saklar ve bu işlem, sistemin başka bir kullanıcısı tarafından oluşturulmuşsa hemen bir yanıt döndürmesine olanak tanır. Aksi takdirde işlem bir sıraya alınır. Yürütücü işlerinden oluşan büyük bir havuz, bu sıradaki işlemleri sürekli olarak okur, yürütür ve sonuçları doğrudan ObjFS Bigtable'larında depolar. Bu sonuçlar, sonraki işlemler için yürütücüler tarafından kullanılabilir veya son kullanıcı tarafından objfsd aracılığıyla indirilebilir.

Bunun sonucunda, Google'da gerçekleştirilen tüm derlemeleri etkili bir şekilde destekleyecek şekilde ölçeklendirilen bir sistem elde edilir. Google'ın derlemelerinin ölçeği de büyüktür: Google, her gün milyonlarca test durumunu yürüten ve petabaytlarca derleme çıktısı üreten milyonlarca derleme çalıştırır. Böyle bir sistem, mühendislerimizin karmaşık kod tabanlarını hızlıca derlemesine olanak tanımakla kalmaz, aynı zamanda derlememize bağlı olan çok sayıda otomatik araç ve sistemi uygulamamıza da olanak tanır.