Dağıtılmış Derlemeler

Büyük bir kod tabanına sahip olduğunuzda, bağımlılık zincirleri çok derin hale gelebilir. Basit ikili programlar bile çoğu zaman on binlerce derleme hedefine bağlı olabilir. Bu ölçekte, bir derlemeyi tek bir makinede makul bir sürede tamamlamak imkansızdır: Hiçbir yapı sistemi, bir makinenin donanımına uygulanan temel fiziğin yasalarının dışına çıkamaz. Bu işi yapmanın tek yolu, dağıtılmış derlemeleri destekleyen bir derleme sistemi kullanmaktır. Bu sistemde, sistem tarafından yapılan iş birimleri rastgele ve ölçeklenebilir sayıda makineye dağıtılır. Sistemin çalışmasını yeterince küçük birimlere ayırdığımızı varsayarsak (bu konuya daha sonra değineceğiz), bu sayede her boyuttan derlemeyi ödemek istediğimiz kadar hızlı bir şekilde tamamlayabiliriz. 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 Şekil 1'de gösterilen uzaktan önbelleğe alma'den yararlanan yapıdır.

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 gerçekleştiren her sistem, ortak bir uzak önbellek hizmetine referans verir. Bu hizmet, Redis gibi hızlı ve yerel bir kısa süreli 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 bu yapının orada zaten olup olmadığını kontrol eder. Bu durumda yapıyı oluşturmak yerine indirebilir. Aksi takdirde, sistem çalışmayı oluşturur ve sonucu önbelleğe geri yükler. Bu, çok sık değişmeyen alt düzey 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 yapı sıfırdan derlemek yerine önbellekten sunulur. Bu sayede derleme sistemimizi çalıştırma maliyeti önemli ölçüde azalır.

Uzaktan bir önbelleğe alma sisteminin çalışabilmesi için derleme sisteminin, derlemelerin tamamen yeniden oluşturulabilir olmasını garanti etmesi gerekir. Yani herhangi bir derleme hedefi için, aynı giriş kümesinin tüm makinelerde tam olarak aynı çıktıyı üretmesi için söz konusu hedefe yönelik giriş grubunun belirlenmesi mümkün olmalıdır. Bu, bir yapı indirmenin sonuçlarının onu kendi yapımının sonuçlarıyla aynı olmasını sağlamanın tek yoludur. Bunun, önbellekteki her bir yapının hem hedefine hem de girişlerinin bir karma değerine ayarlanmasını gerektirdiğini unutmayın. Bu şekilde, farklı mühendisler aynı hedef üzerinde aynı anda farklı değişiklikler yapabilir ve uzak önbellek, ortaya çıkan tüm yapıları depolar ve bunları çakışma olmadan uygun şekilde sunar.

Elbette uzak önbelleğin herhangi bir faydası olması için bir yapıyı indirmenin, derlemekten 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ın hızlı bir şekilde paylaşılabilmesi 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 alt düzey bir değişiklik yaparsanız derlemenin tamamını yine de makinenizde yerel olarak gerçekleştirmeniz gerekir. Asıl hedef, derlemeyi yapmak için yapılan asıl işin istenilen sayıda çalışan arasında dağıtılabileceği uzaktan yürütmeyi desteklemektir. Şekil 2'de 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ühendisi ya da otomatik derleme sistemi olduğu durumlarda) istekleri merkezi bir derleme ana sistemine gönderir. Derleme yöneticisi, istekleri bileşen işlemlerine ayırır ve bu işlemlerin ölçeklenebilir bir çalışan havuzu üzerinde yürütülmesini planlar. Her çalışan, kullanıcı tarafından belirtilen girişlerle kendisinden istenen işlemleri gerçekleştirir ve ortaya çıkan yapıları yazar. Bu yapılar, nihai çıkış üretilip 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. Çalışanlar, diğer çalışanlar tarafından üretilen ara yapılara 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 bağımlılıklarını önbellekten okumasını sağlayarak daha önce açıklanan dağıtılmış önbelleğin üzerine inşa edebiliriz. Ana makine, çalışanların bağlı oldukları her şey bitene kadar ilerlemelerini engeller. Bu durumda, girdilerini önbellekten okuyabilirler. Nihai ürün de önbelleğe alınır. Böylece yerel makine onu indirebilir. Kullanıcıların kaynak ağacındaki yerel değişiklikleri dışa aktarmak için ayrı bir yönteme ihtiyaç duyduğumuzu 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. Derleme ortamları tamamen kendimizi tanımlıyor olmalıdır. Böylece, çalışanlarımızın insan müdahalesi olmadan çalışmaya devam etmesini sağlayabiliriz. 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 çıkışlar tamamen belirleyici olmalıdır. Bu tür garantiler, görev tabanlı bir sistemin sağlaması için son derece zordur. Bu nedenle, tek bir sistem üzerine güvenilir bir uzaktan yürütme sistemi oluşturmak neredeyse imkansızdır.

Google'da dağıtılmış derlemeler

Google, 2008'den beri hem uzaktan önbelleğe alma hem de uzaktan yürütmeyi kullanan dağıtılmış bir derleme sistemi kullanmaktadır. Ş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ılmış bir şekilde Bigtable'da depolayan bir arka ucun yanı sıra her geliştiricinin makinesinde çalışan objfsd adlı bir ö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 sunmak 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'dır. Distribütör adı verilen Blaze'deki Forge (Bazel'in dahili eşdeğeri) istemcisi, her işleme ilişkin istekleri Veri Merkezlerimizde çalışan Scheduler adlı işe gönderir. Scheduler, işlem sonuçlarının önbelleğini tutar ve işlem, sistemin başka bir kullanıcısı tarafından zaten oluşturulmuşsa hemen yanıt döndürmesine olanak tanır. Aksi takdirde işlem bir sıraya alınır. Büyük bir Yürütücü işi havuzu, 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, yürütücüler tarafından gelecekteki işlemler için kullanılabilir veya objfsd aracılığıyla son kullanıcı tarafından indirilebilir.

Sonuç olarak, 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 gerçekten çok büyük: Google, her gün milyonlarca test durumunu yürüten ve petabaytlarca kaynak kodu satırından petabaytlarca derleme çıktısı üreten milyonlarca derleme çalıştırır. Böyle bir sistem, mühendislerimizin hızlı bir şekilde karmaşık kod tabanları oluşturmasını sağlamakla kalmaz, aynı zamanda derlememize dayanan çok sayıda otomatik araç ve sistemi uygulamamıza da olanak tanır.