Koordinasyon gereksinimini olabildiğince azaltma

Azure Storage
Azure SQL Database
Azure Cosmos DB

Ölçeklenebilirlik elde etmek için uygulama hizmetleri arasında koordinasyon gereksinimini olabildiğince azaltın

Ç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.

İ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:

Database lock diagram

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.

Coordination diagram

Ç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

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 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.

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.