Azure İşlevleri performansını ve güvenilirliğini geliştirme
Bu makalede sunucusuz işlev uygulamalarınızın performansını ve güvenilirliğini artırmaya yönelik yönergeler sağlanmaktadır. Daha genel bir Azure İşlevleri en iyi deneyim kümesi için bkz. Azure İşlevleri en iyi uygulamalar.
Aşağıda, Azure İşlevleri kullanarak sunucusuz çözümlerinizi oluşturma ve tasarlama konusunda en iyi yöntemler yer alır.
Uzun süre çalışan işlevlerden kaçının
Büyük ve uzun süre çalışan işlevler beklenmeyen zaman aşımı sorunlarına neden olabilir. Belirli bir barındırma planının zaman aşımları hakkında daha fazla bilgi edinmek için bkz. işlev uygulaması zaman aşımı süresi.
Birçok Node.js bağımlılığı nedeniyle bir işlev büyük olabilir. Bağımlılıkların içeri aktarılması, beklenmeyen zaman aşımlarına neden olan yük sürelerinin artmasına da neden olabilir. Bağımlılıklar hem açıkça hem de örtük olarak yüklenir. Kodunuz tarafından yüklenen tek bir modül kendi ek modüllerini yükleyebilir.
Mümkün olduğunda, büyük işlevleri birlikte çalışan ve yanıtları hızlı bir şekilde döndüren daha küçük işlev kümeleri halinde yeniden düzenleme. Örneğin, bir web kancası veya HTTP tetikleyici işlevi belirli bir zaman sınırı içinde bir onay yanıtı gerektirebilir; Web kancalarının anında yanıt gerektirmesi yaygındır. HTTP tetikleyici yükünü bir kuyruk tetikleyici işlevi tarafından işlenecek kuyruğa geçirebilirsiniz. Bu yaklaşım, fiili çalışmayı ertelemenize ve anında yanıt döndürmenize olanak tanır.
Arka plan görevlerinin tamamlandığından emin olun
İşleviniz herhangi bir görev, geri çağırma, iş parçacığı, işlem başlattığında, işlev kodunuz dönmeden önce bunların tamamlanması gerekir. İşlevler bu arka plan iş parçacıklarını izlemediğinden, arka plan iş parçacığı durumundan bağımsız olarak site kapatma işlemi gerçekleşebilir ve bu da işlevlerinizde istenmeyen davranışlara neden olabilir.
Örneğin, bir işlev bir arka plan görevi başlatır ve görev tamamlanmadan önce başarılı bir yanıt döndürürse, İşlevler çalışma zamanı arka plan görevinin sonucundan bağımsız olarak yürütmenin başarıyla tamamlandığını kabul eder. Bu arka plan görevi temel işleri gerçekleştiriyorsa, site kapatma işlemiyle etkisiz hale getirilebilir ve bu çalışma bilinmeyen bir durumda bırakılır.
İşlevler arası iletişim
Dayanıklı İşlevler ve Azure Logic Apps, durum geçişlerini ve birden çok işlev arasındaki iletişimi yönetmek için oluşturulur.
Birden çok işlevle tümleştirmek için Dayanıklı İşlevler veya Logic Apps kullanmıyorsanız, işlevler arası iletişim için depolama kuyruklarını kullanmak en iyisidir. Bunun temel nedeni, depolama kuyruklarının diğer depolama seçeneklerine göre daha ucuz ve sağlanması çok daha kolay olmasıdır.
Depolama kuyruğundaki tek tek iletilerin boyutu 64 KB ile sınırlıdır. İşlevler arasında daha büyük iletiler geçirmeniz gerekiyorsa, Standart katmanda 256 KB'a ve Premium katmanında 100 MB'a kadar ileti boyutlarını desteklemek için bir Azure Service Bus kuyruğu kullanılabilir.
İşlemeden önce ileti filtrelemeye ihtiyacınız varsa Service Bus konuları yararlıdır.
Olay hub'ları, yüksek hacimli iletişimleri desteklemek için kullanışlıdır.
Durum bilgisi olmayan işlevler yazma
İşlevler durum bilgisi olmayan ve mümkünse bir kez etkili olmalıdır. Gerekli durum bilgilerini verilerinizle ilişkilendirin. Örneğin, işlenen bir siparişin büyük olasılıkla ilişkili state
bir üyesi olabilir. İşlevin kendisi durum bilgisi olmayan durumdayken işlev bu duruma göre bir sıra işleyebilirsiniz.
Bir kez etkili işlevler özellikle zamanlayıcı tetikleyicileri ile önerilir. Örneğin, kesinlikle günde bir kez çalıştırılması gereken bir öğeniz varsa, aynı sonuçlarla gün içinde istediğiniz zaman çalışabilmesi için bunu yazın. Belirli bir gün için çalışma olmadığında işlevden çıkılabilir. Ayrıca önceki bir çalıştırma tamamlanamadıysa, sonraki çalıştırmanın kaldığı yerden devam etmesi gerekir. Bu, hata durumunda yeniden deneyen ileti tabanlı bağlamalar için özellikle önemlidir. Daha fazla bilgi için bkz. Aynı giriş için Azure İşlevleri tasarlama.
Savunma işlevleri yazma
İşlevinizin herhangi bir zamanda bir özel durumla karşılaşabileceğini varsayalım. İşlevlerinizi bir sonraki yürütme sırasında önceki bir hata noktasından devam etme özelliğiyle tasarlayın. Aşağıdaki eylemleri gerektiren bir senaryo düşünün:
- Veritabanındaki 10.000 satırı sorgula.
- Bu satırların her biri için satırın aşağısına doğru işlenmek üzere bir kuyruk iletisi oluşturun.
Sisteminizin ne kadar karmaşık olduğuna bağlı olarak, aşağı akış hizmetlerinin kötü şekilde davranmasına, ağ kesintilerine veya kota sınırlarına ulaşılması vb. dahil olmuş olabilirsiniz. Bunların tümü istediğiniz zaman işlevinizi etkileyebilir. İşlevlerinizi buna hazırlıklı olacak şekilde tasarlamanız gerekir.
Bu öğelerin 5.000'i işlenmek üzere kuyruğa eklendikten sonra bir hata oluşursa kodunuz nasıl tepki gösteriyor? Tamamladığınız bir kümedeki öğeleri izleyin. Aksi takdirde, bunları bir dahaki sefere yeniden ekleyebilirsiniz. Bu çift eklemenin iş akışınızı ciddi bir şekilde etkileyebileceğinden işlevlerinizi bir kez etkili hale getirin.
Bir kuyruk öğesi zaten işlendiyse işlevinizin işlem yapılmamasına izin verin.
Azure İşlevleri platformunda kullandığınız bileşenler için önceden sağlanan savunma önlemlerinden yararlanın. Örneğin, Azure Depolama Kuyruğu tetikleyicileri ve bağlamaları belgelerinde zehirli kuyruk iletilerini işleme bölümüne bakın.
HTTP tabanlı işlevler için Azure API Management ile API sürüm oluşturma stratejilerini göz önünde bulundurun. Örneğin, HTTP tabanlı işlev uygulamanızı güncelleştirmeniz gerekiyorsa, yeni güncelleştirmeyi ayrı bir işlev uygulamasına dağıtın ve istemcileri yeni sürüme veya düzeltmeye yönlendirmek için API Management düzeltmeleri veya sürümleri kullanın. Tüm istemciler sürümü veya düzeltmeyi kullandığında ve önceki işlev uygulamasında artık yürütme kalmadıktan sonra, önceki işlev uygulamasının sağlamasını kaldırabilirsiniz.
İşlev kuruluşu için en iyi yöntemler
Çözümünüzün bir parçası olarak birden çok işlev geliştirebilir ve yayımlayabilirsiniz. Bu işlevler genellikle tek bir işlev uygulamasında birleştirilir, ancak ayrı işlev uygulamalarında da çalıştırılabilir. Premium ve ayrılmış (App Service) barındırma planlarında, birden çok işlev uygulaması aynı planda çalıştırarak aynı kaynakları paylaşabilir. İşlevlerinizi ve işlev uygulamalarınızı gruplandırma şekliniz genel çözümünüzün performansını, ölçeklendirmesini, yapılandırmasını, dağıtımını ve güvenliğini etkileyebilir. Her senaryo için geçerli kural yoktur, bu nedenle işlevlerinizi planlarken ve geliştirirken bu bölümdeki bilgileri göz önünde bulundurun.
Performans ve ölçeklendirme için işlevleri düzenleme
Oluşturduğunuz her işlevin bir bellek ayak izi vardır. Bu ayak izi genellikle küçük olsa da, bir işlev uygulamasında çok fazla işlev olması uygulamanızın yeni örneklerde daha yavaş başlatılmasına neden olabilir. Ayrıca işlev uygulamanızın genel bellek kullanımının daha yüksek olabileceği anlamına da gelir. Tek bir uygulamada kaç işlevin olması gerektiğini söylemek zordur ve bu da iş yükünüze bağlıdır. Ancak, işleviniz bellekte çok fazla veri depolarsa, tek bir uygulamada daha az işlev olmasını göz önünde bulundurun.
Tek bir Premium planında veya ayrılmış (App Service) planda birden çok işlev uygulaması çalıştırıyorsanız, bu uygulamaların tümü plana ayrılan kaynakları paylaşır. Bellek gereksinimi diğerlerinden çok daha yüksek olan bir işlev uygulamanız varsa, uygulamanın dağıtıldığı her örnekte orantısız miktarda bellek kaynağı kullanır. Bu, her örnekteki diğer uygulamalar için daha az kullanılabilir bellek bırakabileceğinden, bunun gibi yüksek bellek kullanan bir işlev uygulamasını kendi ayrı barındırma planında çalıştırmak isteyebilirsiniz.
Not
Tüketim planını kullanırken, uygulamalar yine de bağımsız olarak ölçeklendirildiğinden her uygulamayı her zaman kendi planına yerleştirmenizi öneririz. Daha fazla bilgi için bkz . Aynı planda birden çok uygulama.
İşlevleri farklı yük profilleriyle gruplandırmak isteyip istemediğinizi göz önünde bulundurun. Örneğin, binlerce kuyruk iletisini işleyen bir işleviniz ve yalnızca ara sıra çağrılan ancak yüksek bellek gereksinimleri olan bir işleviniz varsa, kendi kaynak kümelerini almaları ve birbirinden bağımsız olarak ölçeklendirmeleri için bunları ayrı işlev uygulamalarına dağıtmak isteyebilirsiniz.
Yapılandırma ve dağıtım için işlevleri düzenleme
İşlev uygulamaları, işlev tetikleyicilerinin ve Azure İşlevleri çalışma zamanının gelişmiş davranışını yapılandırmak için kullanılan bir host.json
dosyaya sahiptir. Dosyada yapılan host.json
değişiklikler uygulamadaki tüm işlevlere uygulanır. Özel yapılandırmalar gerektiren bazı işlevleriniz varsa, bunları kendi işlev uygulamalarına taşımayı göz önünde bulundurun.
Yerel projenizdeki tüm işlevler, Azure'daki işlev uygulamanıza bir dizi dosya olarak birlikte dağıtılır. Tek tek işlevleri ayrı dağıtmanız veya bazıları için değil bazı işlevler için dağıtım yuvaları gibi özellikleri kullanmanız gerekebilir. Böyle durumlarda, bu işlevleri (ayrı kod projelerinde) farklı işlev uygulamalarına dağıtmanız gerekir.
İşlevleri ayrıcalığına göre düzenleme
Uygulama ayarlarında depolanan bağlantı dizeleri ve diğer kimlik bilgileri, işlev uygulamasındaki tüm işlevlere ilişkili kaynakta aynı izin kümesini verir. Bu kimlik bilgilerini kullanmayan işlevleri ayrı bir işlev uygulamasına taşıyarak belirli kimlik bilgilerine erişimi olan işlevlerin sayısını en aza indirmeyi göz önünde bulundurun. Farklı işlev uygulamalarındaki işlevler arasında veri geçirmek için her zaman işlev zinciri gibi teknikleri kullanabilirsiniz.
Ölçeklenebilirlik için en iyi yöntemler
İşlev uygulamanızın örneklerinin ölçeklendirilmesini etkileyen birçok faktör vardır. Ayrıntılar , işlev ölçeklendirme belgelerinde verilmiştir. Aşağıda, bir işlev uygulamasının en iyi ölçeklenebilirliğini sağlamaya yönelik en iyi uygulamalardan bazıları yer alır.
Bağlantıları paylaşma ve yönetme
Mümkün olduğunca dış kaynaklara bağlantıları yeniden kullanın. Azure İşlevleri'da bağlantıların nasıl yönetileceğini görün.
Depolama hesaplarını paylaşmaktan kaçının
bir işlev uygulaması oluşturduğunuzda, bunu bir depolama hesabıyla ilişkilendirmeniz gerekir. Depolama hesabı bağlantısı AzureWebJobsStorage uygulama ayarında korunur.
Performansı en üst düzeye çıkarmak için her işlev uygulaması için ayrı bir depolama hesabı kullanın. Her ikisi de yüksek hacimli depolama işlemleri oluşturan Dayanıklı İşlevler veya Olay Hub'ı ile tetiklenen işlevleriniz olduğunda bu özellikle önemlidir. Uygulama mantığınız Azure Depolama ile doğrudan (Depolama SDK'sını kullanarak) veya depolama bağlamalarından biri aracılığıyla etkileşime geçtiğinde, ayrılmış bir depolama hesabı kullanmanız gerekir. Örneğin, blob depolamaya veri yazan Olay Hub'ı ile tetiklenen bir işleviniz varsa biri işlev uygulaması, diğeri de işlev tarafından depolanan bloblar için olmak üzere iki depolama hesabı kullanın.
Test ve üretim kodunu aynı işlev uygulamasında karıştırmayın
İşlev uygulaması içindeki işlevler kaynakları paylaşır. Örneğin, bellek paylaşılır. Üretimde bir işlev uygulaması kullanıyorsanız, buna testle ilgili işlevler ve kaynaklar eklemeyin. Üretim kodu yürütme sırasında beklenmeyen ek yüke neden olabilir.
Üretim işlevi uygulamalarınıza yüklerken dikkatli olun. Bellek, uygulamadaki her işlev için ortalama olarak alınır.
Birden çok .NET işlevinde başvurulan bir paylaşılan derlemeniz varsa, bunu ortak bir paylaşılan klasöre yerleştirin. Aksi takdirde, işlevler arasında farklı davranan aynı ikili dosyanın birden çok sürümünü yanlışlıkla dağıtabilirsiniz.
Performansı olumsuz etkileyen üretim kodunda ayrıntılı günlük kullanmayın.
Zaman uyumsuz kod kullanın ancak çağrıları engellemekten kaçının
Zaman uyumsuz programlama, özellikle engelleme G/Ç işlemleri söz konusu olduğunda önerilen en iyi uygulamadır.
C# dilinde her zaman bir örnekte özelliğine veya çağırma Wait
yöntemine Result
Task
başvurmaktan kaçının. Bu yaklaşım iş parçacığı tükenmesine yol açabilir.
İpucu
HTTP veya Web Kancası bağlamalarını kullanmayı planlıyorsanız, yanlış örnek oluşturmanın neden olabileceği bağlantı noktası tükenmesini önlemeyi planlayın HttpClient
. Daha fazla bilgi için bkz. Azure İşlevleri'da bağlantıları yönetme.
Birden çok çalışan işlemi kullanma
Varsayılan olarak, İşlevler için herhangi bir konak örneği tek bir çalışan işlemi kullanır. Özellikle Python gibi tek iş parçacıklı çalışma zamanlarında performansı artırmak için FUNCTIONS_WORKER_PROCESS_COUNT kullanarak konak başına çalışan işlemlerinin sayısını artırın (10'a kadar). Azure İşlevleri daha sonra eş zamanlı işlev çağrılarını bu çalışanlara eşit olarak dağıtmaya çalışır.
FUNCTIONS_WORKER_PROCESS_COUNT, talebi karşılamak için uygulamanızın ölçeği genişletilirken İşlevler tarafından oluşturulan her konağa uygulanır.
Mümkün olduğunda iletileri toplu olarak alma
Event Hub gibi bazı tetikleyiciler, tek bir çağrıda toplu ileti almaya olanak tanır. İletileri toplu işleme çok daha iyi performansa sahiptir.
Host.json başvuru belgelerindehost.json
ayrıntılı olarak açıklandığı gibi dosyadaki en büyük toplu iş boyutunu yapılandırabilirsiniz
C# işlevleri için türü kesin olarak belirlenmiş bir dizi olarak değiştirebilirsiniz. Örneğin, yöntem imzası yerine EventData sensorEvent
olabilir EventData[] sensorEvent
. Diğer diller için, burada gösterildiği gibi toplu işlemi etkinleştirmek için many
kardinalite function.json
özelliğini açıkça olarak olarak ayarlamanız gerekir.
Eşzamanlılığı daha iyi işlemek için konak davranışlarını yapılandırma
host.json
İşlev uygulamasındaki dosya konak çalışma zamanının ve tetikleyici davranışlarının yapılandırılmasına olanak tanır. Toplu işleme davranışlarına ek olarak, bir dizi tetikleyici için eşzamanlılığı yönetebilirsiniz. Bu seçeneklerdeki değerlerin ayarlanması genellikle her örneğin çağrılan işlevlerin talepleri için uygun şekilde ölçeklendirilmesine yardımcı olabilir.
host.json dosyasındaki ayarlar, işlevin tek bir örneği içinde uygulama içindeki tüm işlevlere uygulanır. Örneğin, iki HTTP işlevine ve maxConcurrentRequests
25'e ayarlanmış isteklere sahip bir işlev uygulamanız varsa, HTTP tetikleyicilerinden herhangi biri için yapılan istek paylaşılan 25 eşzamanlı isteğe doğru sayılır. Bu işlev uygulaması 10 örneğe ölçeklendirildiğinde, on işlev etkin bir şekilde 250 eşzamanlı isteğe (örnek başına 10 örnek * 25 eşzamanlı istek) izin verir.
Diğer konak yapılandırma seçenekleri host.json yapılandırma makalesinde bulunur.
Sonraki adımlar
Daha fazla bilgi için aşağıdaki kaynaklara bakın: