Dağıtılmış Derlemeler

Sorun bildirin Kaynağı göster

Büyük bir kod tabanınız olduğunda bağımlılık zincirleri çok derin hale gelebilir. Basit ikili programlar bile on binlerce derleme hedefine bağlı olabilir. Bu ölçekte, bir makineyi tek bir makinede makul bir sürede tamamlamak imkansızdır: Hiçbir yapı sistemi, bir makinenin donanımına yerleştirilen temel fizik kurallarını aşamaz. Bunu yapmanın tek yolu, dağıtılmış derlemeleri destekleyen bir derleme sistemidir. Bu sistemde sistem tarafından yapılan çalışmalar, rastgele ve ölçeklenebilir sayıda makineye yayılır. Sistemin çalışmasını yeterince küçük birimlere ayırdığımızı (daha sonra bu konuyla ilgili daha fazla bilgi paylaşacağımız) varsayıldığında, her boyutta yapı kurulumunu, ödeme yapmak istediğimiz kadar hızlı bir şekilde tamamlayabiliriz. Bu ölçeklenebilirlik, yapı tabanlı bir derleme sistemi tanımlayarak üzerinde çalıştığımız kutsal yoldur.

Uzaktan önbelleğe alma

Dağıtılan derlemenin en basit türü yalnızca Şekil 1'de gösterilen uzaktan önbelleğe alma yönteminden yararlanır.

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

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

Hem geliştirici iş istasyonları hem de sürekli entegrasyon sistemleri dahil olmak üzere derleme yapan her sistem, ortak bir uzak önbellek hizmetine referans paylaşır. Bu hizmet, Redis gibi hızlı ve yerel bir kısa süreli depolama sistemi ya da Google Cloud Storage gibi bir bulut hizmeti olabilir. Kullanıcının doğrudan veya bağımlı olarak bir yapı oluşturması gerektiğinde sistem, söz konusu yapının zaten mevcut olup olmadığını kontrol etmek için uzak önbellekle kontrol eder. Öyleyse yapıyı oluşturmak yerine indirebilir. Aksi takdirde sistem, yapıyı oluşturur ve sonucu önbelleğe geri yükler. Bu, çok sık değişmeyen düşük düzeyli bağımlılıkların her kullanıcı tarafından yeniden oluşturulması yerine tek seferde oluşturulabileceği ve kullanıcılar arasında paylaşılabileceği anlamına gelir. Google'da, birçok yapı sıfırdan oluşturulmak yerine bir önbellekten sunulur. Böylece, derleme sistemimizi çalıştırmanın maliyeti büyük ölçüde azalır.

Uzak bir önbelleğe alma sisteminin çalışması için derleme sistemi, derlemelerin tamamıyla yeniden üretilebileceğini garanti etmelidir. Yani herhangi bir derleme hedefi için bu hedefe yönelik giriş kümesinin, aynı giriş grubunun herhangi bir makinede tam olarak aynı çıkışı üreteceği şekilde belirlenmesi mümkün olmalıdır. Bu yöntem, bir yapıyı indirmenin sonuçlarının kendi başına derleme sonuçlarıyla aynı olmasını sağlamanın tek yoludur. Bu durumda, önbellekteki her yapının hem hedefinde hem de girişlerinin karmasında anahtarlanması gerekir. Bu şekilde, farklı mühendisler aynı anda aynı hedef üzerinde farklı değişiklikler yapabilir ve uzak önbellek ortaya çıkan tüm yapıları depolar ve herhangi bir çakışma olmadan bunları uygun bir şekilde yayınlar.

Uzak bir önbellekten yararlanmak için bir yapı indirmekten daha hızlı olmak elbette mümkündür. Özellikle önbellek sunucusu derlemeyi yapan makineden uzaktaysa bu durum geçerli olmayabilir. Google'ın ağ ve derleme sistemi, derleme sonuçlarını hızlı bir şekilde paylaşabilmek için dikkatlice ayarlanır.

Uzaktan yürütme

Uzaktan önbelleğe alma, gerçek bir dağıtılmış derleme değildir. Önbellek kaybolursa veya her şeyin yeniden oluşturulmasını gerektiren düşük düzeyde bir değişiklik yaparsanız yine de derlemenin tamamını makinenizde yerel olarak gerçekleştirmeniz gerekir. Gerçek hedef, uzaktan yürütmeyi desteklemektir. Bu yapıyı geliştirirken asıl çalışma, istediğiniz 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 gerçek mühendisler veya otomatik derleme sistemleri olduğu durumlarda) istekleri merkezi bir ana ustaya gönderir. Derleme ana makinesi, istekleri bileşen işlemlerine böler ve bu işlemlerin yürütülmesini ölçeklenebilir bir çalışan havuzu üzerinde planlar. Her çalışan, kullanıcının belirttiği girişlerle istenen işlemleri gerçekleştirir ve ortaya çıkan yapıları yazar. Bu yapılar, nihai çıkışın üretilip kullanıcıya gönderilinceye kadar yürütmeyi gerektiren 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 oluşturulan ara yapılara bağımlı olabilir ve nihai çıkışın kullanıcının yerel makinesine geri gönderilmesi gerekir. Bunun için daha önce açıklanan dağıtılmış önbelleği, üzerine her çalışanın sonuçlarını yazmasını ve önbelleklerinden okumasını sağlayarak geliştirebiliriz. Ana örnek, çalışanların ihtiyaç duydukları her şey tamamlanana kadar ilerlemelerini engeller. Bu durumda ise girişlerini önbellekten okuyabilirler. Nihai ürün de önbelleğe alınır. Böylece yerel makine, ürünü indirebilir. Ayrıca, kullanıcıların kaynak ağaçtaki yerel değişiklikleri dışa aktarmak için ayrı bir yönteme ihtiyacımız olduğunu unutmayın. Böylece çalışanlarınız, değişiklikleri oluşturmadan önce uygulayabilir.

Bunun çalışması için daha önce açıklanan yapı tabanlı derleme sistemlerinin tüm parçalarının bir arada bulunması gerekir. Çalışan ortamlarını insan müdahalesi olmadan kullanabilmemiz için derleme ortamlarının tamamen kendi kendini tanımlayan yapısı olmalıdır. Her adım farklı bir makinede yürütülebileceğinden, derleme işlemlerinin kendileri 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 garantilerin, görev tabanlı bir sistemin sağlanması son derece zordur. Bu da güvenilir bir uzaktan yürütme sistemi oluşturmayı son derece imkansız hale getirir.

Google'da dağıtılan derlemeler

Google, 2008 yılından beri Şekil 3'te gösterilen hem uzaktan önbelleğe alma hem de uzaktan yürütme özelliklerini kullanan dağıtılmış bir derleme sistemi kullanmaktadır.

Üst düzey derleme sistemi

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

Google'ın uzak önbelleği ObjFS olarak adlandırılır. Üretim makineleri filonuzda dağıtılan Bigtable'larda çıktıları ve her geliştiricinin makinesinde çalışan objfsd adlı ön uç FUSE arka plan programını depolayan bir arka uçtan oluşur. FUSE arka plan programı, mühendislerin iş çıkışlarında normal dosyalarmış gibi derleme çıkışlarına göz atmaları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 indirildi. İsteğe bağlı dosya içeriklerinin sunulması hem ağ hem de disk kullanımını önemli ölçüde azaltır. Sistem ise tüm derleme çıkışlarını, geliştiricinin yerel diskinde depoladığımız alandan iki kat daha hızlı oluşturabilir.

Google'ın uzaktan yürütme sistemi, Forge olarak adlandırılır. Blaze'deki (Bazel'in dahili eşdeğeri) bir Forge istemcisi, her bir işlem için veri planlayıcısı adı verilen veri merkezlerimizde çalışan bir işe istek gönderir. Zamanlayıcı, işlem sonuçlarının önbelleğini saklar. Böylece sistem, sistemin başka bir kullanıcısı tarafından oluşturulmuşsa hemen yanıt döndürür. Aksi takdirde, işlemi sıraya alır. Büyük bir Yürütme İşleri havuzu bu sıradaki işlemleri sürekli olarak okur, yürütür ve sonuçları doğrudan ObjFS Bigtable'larda depolar. Bu sonuçlar, gelecekteki işlemler için veya son kullanıcı tarafından objfsd üzerinden indirilecek şekilde yöneticiler tarafından kullanılabilir.

Sonuçta, Google'da gerçekleştirilen tüm derlemeleri etkili bir şekilde desteklemek için ölçeklenen bir sistem elde edersiniz. Google'ın derlemelerinin ölçeği gerçekten çok büyük: Google her gün milyonlarca test durumu yürüten ve milyarlarca satır koddan petabaytlarca çıktı üreterek milyonlarca derleme çalıştırıyor. Böyle bir sistem, mühendislerimizin hızlı bir şekilde karmaşık kod tabanları oluşturmasına olanak tanımakla kalmaz, aynı zamanda derlememize dayanan çok sayıda otomatik araç ve sistem uygulamamıza da olanak tanır.