Ölçeklenebilirlik elde etmek için koordinasyonu en aza indirme
Çoğu bulut uygulaması web ön uçları, veritabanları, iş süreçleri, raporlama ve analiz gibi birden çok uygulama hizmetlerinden oluşur. Ölçeklenebilirlik ve güvenilirlik elde etmek için bu hizmetlerin her birini birden çok örnek üzerinde çalıştırmanız gerekir.
Makineler arasında ileti geçirmeye gerek kalmadan çalışmanın bağımsız olarak işlenebildiği, koordinasyonsuz sistemlerin ölçeklendirilmesi genellikle daha kolaydır. Koordinasyon genellikle ikili bir durum değil, bir spektrumdur. Koordinasyon, veri veya işlem gibi farklı katmanlarda gerçekleşir.
İki örnek, paylaşılan bir durumu etkileyen eşzamanlı işlemler gerçekleştirmeye çalıştığında ne olur? Bazı durumlarda, örneğin, ACID garantilerini korumak için düğümlerde koordinasyon olmalıdır. Bu diyagramda Node2
, Node1
düğümünün bir veritabanı kilidini açmasını bekliyor:
Koordinasyon, yatay ölçek avantajlarını sınırlar ve performans sorunları oluşturur. Bu örnekte, siz uygulamanın ölçeğini genişletip daha fazla örnek ekledikçe artan bir kilit çakışması görüyorsunuz. En kötü durumda; ön uç örnekleri, zamanlarının çoğunu kilitler için bekleyerek geçirir.
"Kesinlikle bir kerelik" semantik, koordinasyonun sık kullanılan diğer bir kaynağıdır. Örneğin, bir siparişin kesinlikle bir kerelik işlenmesi gerekir. İki çalışan, yeni siparişleri dinliyor. Worker1
, işleme için bir sipariş seçer. Uygulama, işin Worker2
tarafından çoğaltılmamasını ancak aynı zamanda, Worker1
kilitlenirse siparişin düşmemesini de sağlaması gerekir.
Çalışanlar arasında koordinasyon sağlamak için Zamanlayıcı Aracısı Gözetmeni gibi bir düzeni kullanabilirsiniz, ancak bu durumda işin bölümlenmesi daha iyi bir yaklaşım olabilir. Her çalışana belirli bir kapsama (örneğin, fatura bölgesi) göre siparişler atanır. Bir çalışanın kilitlenmesi durumunda, önceki örneğin kaldığı yerden yeni bir örnek devam eder ancak birden fazla örnek çakışmaz.
Öneriler
Zaman uyumsuz iletişim kuran ayrılmış bileşenleri kullanın. Bileşenler birbiriyle iletişim kurmak için ideal olarak olayları kullanmalıdır.
Nihai tutarlılık yaklaşımını benimseyin. Veriler dağıtıldığında güçlü tutarlılık garantilerinin uygulanması için koordinasyon gerekir. Örneğin, bir işlemin, iki veritabanını güncelleştirdiğini varsayalım. Bunu tek bir işlem kapsamına almak yerine sistemin bir hatadan sonra işlemi mantıksal olarak geri almak için Telafi İşlemi düzenini kullanarak nihai tutarlılığa olanak tanıyabilmesi daha uygundur.
Durumu eşitlemek için etki alanı olaylarını kullanın. Etki alanı olayı, etki alanı içinde önemli bir durum ortaya çıktığında bunu kaydeden bir olaydır. İlgili hizmetler, birden çok hizmet arasında koordinasyon sağlamak için genel bir işlem kullanmak yerine söz konusu olayı dinleyebilir. Bu yaklaşımın kullanılması durumunda sistemin nihai tutarlılığa tolerans göstermesi gerekir (bir önceki öğeye bakın).
CQRS ve olay kaynağını belirleme gibi düzenleri deneyin. Bu iki düzen, okuma iş yükleri ile yazma iş yükleri arasındaki çakışmanın azaltılmasına yardımcı olabilir.
CQRS düzeni, okuma işlemlerini yazma işlemlerinden ayırır. Bazı uygulamalarda okuma verileri, yazma verilerinden fiziksel olarak ayrılır.
Olay Kaynağını Belirleme düzeninde durum değişiklikleri yalnızca ekleme yapılabilen bir veri deposuna bir dizi olay olarak kaydedilir. Akışa olay eklemek otomatik bir işlemdir ve mümkün olduğunca az kilitleme gerektirir.
Bu iki düzen birbirini tamamlar. CQRS deki yalnızca yazılabilen depo, olay kaynağı belirleme düzenini kullanıyorsa salt okunur depo aynı olayları kullanarak geçerli durumun sorgular için en iyi duruma getirilmiş okunabilir bir ekran görüntüsünü oluşturabilir. Ancak CQRS veya olay kaynağını belirleme düzenini kullanmadan önce bu yaklaşımın zorluklarını dikkate alın.
Verileri ve durumu bölümleme. Tüm verilerinizi birden çok uygulama hizmetinde paylaşılan bir veri şemasına eklemekten kaçının. Mikro hizmetler mimarisi her hizmeti kendi veri deposundan sorumlu hale getirerek bu ilkeyi zorlar. Bir parçaya yazan bir hizmet, farklı bir parçaya yazan bir hizmeti etkilemediğinden, tek bir veritabanı içinde verilerin parçalara ayrılması eşzamanlılığı artırabilir. Bölümleme biraz koordinasyon eklese de, daha iyi ölçeklenebilirlik için paralelliği artırmak için bölümleme kullanabilirsiniz. Verilerin bağımsız olarak yönetilebilmesi için monolitik durumu daha küçük öbeklere bölün.
Bir kere etkili olan işlemler tasarlayın. Mümkünse, işlemleri bir kere etkili olacak şekilde tasarlayın. Böylece bunlar, en az bir kez semantik kullanılarak işlenebilir. Örneğin, iş öğelerini bir kuyruğa koyabilirsiniz. Bir çalışanın, işlemin ortasında kilitlenmesi durumunda iş öğesini başka bir çalışanın seçmesi yeterlidir. Çalışanın verileri güncelleştirmesi ve mantığının bir parçası olarak diğer iletileri yayması gerekiyorsa, bir kez etkili ileti işleme düzeni kullanılmalıdır.
Mümkün olduğunca iyimser eşzamanlılığı kullanın. Kötümser eşzamanlılık denetimi, çakışmaları önlemek için veritabanı kilitlerini kullanır. Bu, yetersiz bir performans düzeyine neden olabilir ve kullanılabilirliği azaltabilir. İyimser eşzamanlılık denetimi ile her işlem, verilerin bir kopyasını veya anlık görüntüsünü değiştirir. İşlem tamamlandığında veritabanı altyapısı, işlemi doğrular ve veritabanı tutarlılığını etkileyecek tüm işlemleri reddeder.
Azure SQL Veritabanı ve SQL Server desteği için anlık görüntü yalıtımı ile iyimser eşzamanlılık. Bazı Azure depolama hizmetleri, Azure Cosmos DB ve Azure Depolama da dahil olmak üzere ETag’ler kullanılarak iyimser eşzamanlama sağlanmasını destekler.
MapReduce’u veya diğer paralel, dağıtılmış algoritmaları deneyin. Verilere ve gerçekleştirilecek işin türüne göre; işi, paralel olarak çalışan birden fazla düğümün gerçekleştirebileceği bağımsız görevlere bölebilirsiniz. Bkz. Büyük işlem mimarisi stili.
Koordinasyon için öncü seçimi kullanın. İşlemleri koordine etmeniz gerektiği durumlarda koordinatörün uygulamadaki tek hata noktası haline gelmediğinden emin olun. Öncü Seçimi düzeni kullanıldığında her zaman tek bir örnek öncüdür ve koordinatör işlevi görür. Öncü başarısız olursa öncü olacak yeni bir örnek seçilir.