Not
Bu sayfaya erişim yetkilendirme gerektiriyor. Oturum açmayı veya dizinleri değiştirmeyi deneyebilirsiniz.
Bu sayfaya erişim yetkilendirme gerektiriyor. Dizinleri değiştirmeyi deneyebilirsiniz.
Dayanıklı İşlevler çalışma zamanı, güvenilir yürütme sağlamak için işlev parametrelerini, dönüş değerlerini ve diğer durumu otomatik olarak görev merkezine kalıcı olarak depolar. Ancak, dayanıklı depolamada kalıcı hale gelen verilerin miktarı ve sıklığı uygulama performansını ve depolama işlemi maliyetlerini etkileyebilir. Uygulamanızın depoacağı verilerin türüne bağlı olarak, veri saklama ve gizlilik ilkelerinin de dikkate alınması gerekebilir.
Bu makalede hangi verilerin kalıcı hale getirileceği, büyük yüklerin ve hassas verilerin nasıl işlendiği ve desteklenen her dil için serileştirmenin nasıl özelleştirileceği açıklanır.
Bu makalede:
- Görev hub'ı içeriği - Hangi verilerin depolandığı ve nasıl depolandığı
- Girişleri ve çıkışları küçük tutun - Yük boyutunu yönetme stratejileri
- Hassas verilerle çalışma - Sırları ve kişisel bilgileri koruma
- Görev hub'ı depolamanızın güvenliğini sağlama - Depolama arka ucunuzu yetkisiz erişime karşı koruma
- Serileştirmeyi ve seri durumdan çıkarmayı özelleştirme - Dile özgü serileştirme seçenekleri
Görev hub'ı içeriği
Görev hub'ları örneklerin geçerli durumunu ve bekleyen iletileri depolar:
- Örnek durumları , bir örneğin geçerli durumunu ve geçmişini depolar. Düzenleme örnekleri için bu durum çalışma zamanı durumunu, düzenleme geçmişini, girişleri, çıkışları ve özel durumu içerir. Varlık örnekleri için varlık durumunu içerir.
- İletiler , yönlendirme ve uçtan uca bağıntı gibi iç amaçlar için kullanılan işlev girişlerini veya çıkışlarını, olay yüklerini ve meta verileri depolar.
İletiler işlendikten sonra silinir, ancak uygulama veya işleç tarafından açıkça silinmedikleri sürece örnek durumları devam eder. Özellikle, düzenleme tamamlandıktan sonra bile bir düzenleme geçmişi depolamada kalır.
Durumların ve iletilerin bir düzenlemenin ilerleme durumunu nasıl gösterdiğine ilişkin bir örnek için görev hub'ı yürütme örneğine bakın.
Durumların ve iletilerin depolamada nerede ve nasıl temsil edildiği depolama sağlayıcısına bağlıdır. Dayanıklı İşlevler varsayılan sağlayıcısı Azure Depolama, belirttiğiniz bir Azure Depolama hesabındaki kuyruklarda, tablolarda ve bloblarda verileri kalıcı hale getirir.
Seri hale getirilmiş ve kalıcı hale getirilmiş veri türleri
Aşağıdaki listede, Dayanıklı İşlevler özellikleri kullanılırken serileştirilecek ve kalıcı hale getirilecek farklı veri türleri gösterilmektedir:
- Tüm kimlikler ve işlenmeyen özel durumlar dahil olmak üzere orchestrator, activity ve entity işlevlerinin tüm girişleri ve çıkışları
- Orchestrator, activity ve entity işlevi adları
- Dış olay adları ve yükleri
- Özel düzenleme durumu yükleri
- Orkestrasyon sonlandırma iletileri
- Dayanıklı zamanlayıcı veri yükleri
- Dayanıklı HTTP isteği ve yanıt URL'leri, başlıklar ve yükler
- Varlık çağrısı ve sinyal yükleri
- Varlık durumu yükleri
Yük boyutunu yönetme ve bu listedeki hassas öğeleri koruma yönergeleri için aşağıdaki bölümlere bakın.
Dayanıklı İşlevler girişleri ve çıkışları küçük tutun
Dayanıklı İşlevler API'lere büyük giriş ve çıkışlar sağlarsanız bellek sorunlarıyla karşılaşabilirsiniz. Girişler ve çıkışlar düzenleme geçmişinde seri hale getirilir; bu da büyük yüklerin zaman içinde ilişkisiz geçmiş büyümesine büyük katkıda bulunabileceği anlamına gelir. Bu büyüme, yeniden yürütme sırasında bellek özel durumlarına neden olma riski taşır.
Büyük girişlerin ve çıkışların etkisini azaltmak için şunları yapabilirsiniz:
- Birden çok koordine ediciye geçmiş bellek yükünü dengelemek üzere çalışmaları alt koordine edicilere delege edin ve bireysel geçmişlerin bellek kullanımını düşük tutun.
- Büyük verileri dış depolama alanında (Azure Blob Depolama gibi) depolayın ve gerektiğinde bu verileri etkinlik işlevleri içinde almanıza olanak sağlayan basit tanımlayıcılar geçirin.
Dayanıklı Görev Zamanlayıcı kullanıyorsanız büyük yük desteğini kullanarak daha büyük yükleri Azure Blob Depolama'ya boşaltabilirsiniz.
Tip
Büyük verilerle başa çıkmak için en iyi yöntem, verileri dış depolamada tutmak ve gerektiğinde yalnızca aktiviteler sırasında var etmektir.
Büyük veri yüklerinin referanslarını aktarma
Aşağıdaki örnekler Talep Kontrolü modelini uygular. Orkestratör, bir blob konteyneri ve blob adı içeren küçük bir referans alır, bu referansı bir etkinliğe verir ve etkinliğin çıktı referansını döndürür. Yalnızca etkinlik veri yükünü indirip yükler.
Bu örnekleri çalıştırmadan önce, depolama hesabınızdaki herhangi bir konteynere bir blob yükleyin. Orkestrasyonu şu gibi {"container":"large-payloads","blobName":"input/job-123.json"}bir referansla başlatın. Gerekirse etkinlik çıkış konteynerini processed-payloads oluşturur. Örnek işleme adımı, giriş baytlarını değiştirmeden kopyalar; Uygulama mantığınla değiştir.
Important
Referansa asla depolama kimlik bilgileri veya paylaşılan erişim imzası (SAS) eklemeyin. Sistem, referansı orkestrasyon geçmişinde kalıcı olarak saklar. Bu örnekler, depolama kodunu kısa tutmak için adlandırılmış PAYLOAD_STORAGE_CONNECTION_STRING bir uygulama ayarı kullanır. Üretim iş yükleri için, blob verilerine erişimi yetkilendirmek için Microsoft Entra ID kullanın.
Bu örnek, Azure.Storage.Blobs NuGet paketini gerektirir.
using System;
using System.Threading.Tasks;
using Azure.Storage.Blobs;
using Microsoft.Azure.WebJobs;
using Microsoft.Azure.WebJobs.Extensions.DurableTask;
public class BlobReference
{
public string Container { get; set; } = string.Empty;
public string BlobName { get; set; } = string.Empty;
}
public static class LargePayloadFunctions
{
[FunctionName("ProcessLargePayload")]
public static async Task<BlobReference> RunOrchestrator(
[OrchestrationTrigger] IDurableOrchestrationContext context)
{
BlobReference inputReference = context.GetInput<BlobReference>()
?? throw new InvalidOperationException("A blob reference is required.");
return await context.CallActivityAsync<BlobReference>(
"ProcessLargePayloadActivity", inputReference);
}
[FunctionName("ProcessLargePayloadActivity")]
public static async Task<BlobReference> RunActivity(
[ActivityTrigger] BlobReference inputReference)
{
string connectionString =
Environment.GetEnvironmentVariable("PAYLOAD_STORAGE_CONNECTION_STRING")
?? throw new InvalidOperationException("Payload storage is not configured.");
BlobServiceClient service = new BlobServiceClient(connectionString);
BlobClient inputBlob = service
.GetBlobContainerClient(inputReference.Container)
.GetBlobClient(inputReference.BlobName);
BinaryData inputData = (await inputBlob.DownloadContentAsync()).Value.Content;
BlobContainerClient outputContainer =
service.GetBlobContainerClient("processed-payloads");
await outputContainer.CreateIfNotExistsAsync();
string outputName = $"processed/{Guid.NewGuid():N}.json";
await outputContainer.GetBlobClient(outputName)
.UploadAsync(inputData, overwrite: true);
return new BlobReference
{
Container = outputContainer.Name,
BlobName = outputName,
};
}
}
Paralel faaliyetler birden fazla büyük sonuç üretiyorsa, bir referans listesini döndürün ve bu listeyi nihai bir toplama etkinliğine iletebilirsiniz. Toplama faaliyeti, yükleri yükleyip birleştirmeli ve ardından son bir çıktı blob'u yazmalıdır. Orkestratörde büyük sonuçları yüklemeyin veya birleştirmeyin.
Hassas verilerle çalışma
Dayanıklı İşlevler API'lerine ve API'lerinden gelen girişler ve çıkışlar (özel durumlar dahil) depolama sağlayıcınızda kalıcı olarak depolanır. Bu girişler, çıkışlar veya özel durumlar hassas veriler (gizli diziler, bağlantı dizeleri veya kişisel bilgiler gibi) içeriyorsa, depolama sağlayıcınıza ait kaynaklara okuma erişimi olan herkes bunları alabilir.
Hassas verileri güvenli bir şekilde işlemek için, etkinlik işlevlerindeki verileri Azure Key Vault veya ortam değişkenlerinden getirin ve bu verileri düzenleyicilere veya varlıklara doğrudan iletmeyin. Bu yaklaşım, hassas verilerin depolama kaynaklarınıza sızmasını önlemeye yardımcı olur.
Benzer şekilde, depolama kaynaklarına yazma erişimi sıkı bir şekilde denetlenmelidir, depolamadaki değiştirilmiş veriler düzenleme davranışını değiştirebileceğinden. Görev hub’ı depolamasının güvenliğini sağlama hakkında daha fazla bilgi için Görev hub’ı depolamanızın güvenliğini sağlayın konusuna bakın.
Tip
Bu kılavuz, istek ve yanıt yüklerini depolamada kalıcı hale getirmek için CallHttp orchestrator API'sine de uygulanır. Hedef HTTP uç noktalarınız kimlik doğrulaması gerektiriyorsa, HTTP çağrısını bir etkinlik içinde uygulayın veya kimlik bilgilerini depolamaya kaydetmeden CallHttp tarafından sunulan yerleşik yönetilen kimlik desteğini kullanın.
Uyarı
Günlüklerinize okuma erişimi olan herkes (örneğin Application Insights'ta) bu gizli dizileri edinebileceğinden gizli diziler içeren verileri günlüğe kaydetmekten kaçının.
Atıl durumdaki şifreleme
Azure Depolama sağlayıcısı kullanılırken tüm veriler bekleme sırasında otomatik olarak şifrelenir. Ancak, depolama hesabına erişimi olan herkes verileri şifrelenmemiş biçiminde okuyabilir. Hassas veriler için daha güçlü bir korumaya ihtiyacınız varsa, verilerin önceden şifrelenmiş biçimde kalıcı olması için önce verileri kendi şifreleme anahtarlarınızı kullanarak şifrelemeyi göz önünde bulundurun.
Alternatif olarak, .NET kullanıcıları otomatik şifreleme sağlayan özel serileştirme sağlayıcıları uygulama seçeneğine sahiptir. Şifreleme ile özel serileştirme örneği bu GitHub örneğinde bulunabilir.
Uyarı
Uygulama düzeyinde şifreleme uygulamaya karar verirseniz, düzenlemelerin ve varlıkların süresiz olarak var olabileceğini unutmayın. Bu, şifreleme anahtarlarınızı döndürme zamanı geldiğinde önemlidir çünkü bir düzenleme veya varlıklar anahtar döndürme ilkenizden daha uzun çalışabilir. Anahtar döndürme gerçekleşirse, verilerinizi şifrelemek için kullanılan anahtar artık düzenlemeniz veya varlığınız bir sonraki yürütmede şifresini çözmek için kullanılamayabilir. Bu nedenle özel şifreleme yalnızca orkestrasyonların ve entitelerin nispeten kısa süreli çalıştırılması beklendiğinde önerilir.
Görev merkezi depolamanızı güvence altına alın
Görev hub'ınızı barındıran depolama arka ucu kritik bir güven sınırıdır. Dayanıklı Görev Çerçevesi, orkestrasyonun yeniden oynatılması ve mesaj işleme sırasında depolama alanından okuduğu verilere güvenir. Görev hub'ı depolamasına yazma erişimi olan herkes orkestrasyon durumunu, bekleyen iletileri veya depolanan veri yüklerini kurcalayabilir. Bu, uygulama davranışını değiştirebilir, istenmeyen eylemleri tetikleyebilir veya işlev uygulamanız bağlamında uzaktan kod yürütme gerçekleştirebilir.
Important
Task hub depolama kimlik bilgilerinizi açığa çıkarmayın veya güvenilmeyen taraflara yazma erişimi vermeyin. Görev hub'ı depolamaya yazma erişimi, rastgele kod yürütmeyi tetikleme de dahil olmak üzere uygulama davranışını değiştirmek için kullanılabilir.
Paylaşılan sorumluluk
Depolama arka ucu güvenliğini sağlamak, uygulama durumunu veya kodunu depolayan tüm veritabanlarının güvenliğini sağlamakla aynı şekilde sizin sorumluluğunuzdadır. Dayanıklı Görev Çerçevesi depolanan verilerde bütünlük doğrulaması gerçekleştirmez, bu nedenle yetkisiz değişiklikleri önlemek için depolama katmanının erişim denetimlerine dayanır.
Dayanıklı Görev Zamanlayıcı'yı kullanırsanız, yönetilen kimlik doğrulaması ve rol tabanlı erişim denetimi (RBAC) kullanılarak depolama arka ucu tam olarak yönetilir ve hizmet tarafından güvenli hale gelir. Azure Depolama, MSSQL veya Netherite gibi kendi depolama arka uçlarını getirme (BYO) için, temel depolama kaynaklarının güvenliğini kendiniz sağlamalısınız.
Uyarı
Güvenilmeyen kiracılar arasında tek bir görev hub'ı paylaşmayın. Görev hub'ı kullanıcıları arasında erişim sınırlarını zorlamaz, bu nedenle görev hub'ına okuyabilen veya yazabilen tüm kiracılar içindeki tüm düzenlemeleri ve varlıkları etkileyebilir. Benzer şekilde, aynı arka uç içindeki ayrı görev hub'larına bir güvenlik sınırı olarak güvenmeyin. Dayanıklı Görev Zamanlayıcı, tek tek görev hub'ları kapsamındaki RBAC'yi desteklese de, IP izin listeleri ve özel uç noktalar gibi ağ denetimleri yalnızca zamanlayıcı düzeyinde uygulanır, bu nedenle zamanlayıcı içindeki görev hub'ları bir güvenlik yalıtımı sınırı değildir. BYO depolama sağlayıcıları için de aynı durum geçerlidir—depolama hesabına veya veritabanına erişimi olan herhangi bir kiracı, bu arka uçtaki tüm görev hub’larına erişebilir. Kiracılar arasında güvenlik yalıtımına ihtiyacınız olduğunda, her kiracı için ayrı altyapı sağlayın: BYO sağlayıcıları için ayrı depolama hesapları veya veritabanları ya da dayanıklı Görev Zamanlayıcı örneklerini ayırın.
Depolama sağlamlaştırma denetim listesi
Görev hub'ı depolamanızı korumak için aşağıdaki en iyi yöntemleri uygulayın:
- Depolama anahtarlarıyla bağlantı dizeleri yerine kimlik tabanlı bağlantılar kullanın. Yönetilen kimlikler ayrıntılı erişim denetimi sağlar ve kimlik bilgisi sızıntısı riskini ortadan kaldırır. Bkz. Dayanıklı İşlevler için yönetilen kimlik yapılandırma.
- En az ayrıcalıklı RBAC rollerini uygulayın. Yalnızca gereken en düşük izinleri verin. Gerekmeyen kullanıcılara veya hizmetlere geniş depolama hesabı erişimi vermekten kaçının.
- Özel uç noktaları veya hizmet uç noktalarını kullanarak depolama hesabınıza ağ erişimini kısıtlayın. Bu, görev hub'ı verilerine yetkisiz ağ düzeyinde erişimi engeller.
-
Depolama erişimini izleyin; bunun için depolama hesabınızda Azure İzleyici kaynak günlüklerini, özellikle
StorageWritegünlük kategorisini etkinleştirin. Bu günlükleri, Log Analytics gibi izlenen depolama hesabı dışındaki bir hedefe yönlendirin; böylece kurcalanamazlar. Bkz . Depolama günlükleri. - Bağlantı dizeleri kullanıyorsanız kimlik bilgilerini düzenli olarak yenileyin. Depolama hesabı anahtarlarını diğer yüksek ayrıcalıklı kimlik bilgileriyle aynı özenle ele alma.
- Yönetilen bir depolama altyapısını düşünün. Dayanıklı Görev Zamanlayıcı, şifreleme, kimlik doğrulaması ve ağ yalıtımı dahil olmak üzere depolama güvenliğini otomatik olarak işler.
Serileştirme ve deseriyalizasyonu özelleştirme
Serileştirme özelleştirme seçenekleri dile göre değişir. Kullanılabilir seçenekleri görmek için dil sekmenizi seçin.
Varsayılan serileştirme mantığı
İşlem içi .NET için Dayanıklı İşlevler, düzenleme ve varlık verilerini JSON'a seri hale getirmek için dahili olarak Json.NET kullanır. Kullanılan varsayılan Json.NET ayarları şunlardır:
Girişler, Çıkışlar ve Durum:
JsonSerializerSettings
{
TypeNameHandling = TypeNameHandling.None,
DateParseHandling = DateParseHandling.None,
}
İstisnalar:
JsonSerializerSettings
{
ContractResolver = new ExceptionResolver(),
TypeNameHandling = TypeNameHandling.Objects,
ReferenceLoopHandling = ReferenceLoopHandling.Ignore,
}
Daha ayrıntılı belgeleri JsonSerializerSettingsburada okuyun.
.NET öznitelikleriyle serileştirmeyi özelleştirme
Serileştirme sırasında Json.NET, verilerin JSON'dan nasıl seri hale getirildiğini ve seri durumdan çıkarıldığını denetleen sınıflar ve özellikler üzerinde çeşitli öznitelikleri arar. Dayanıklı İşlevler API'lere geçirilen veri türünün kaynak koduna sahipseniz serileştirme ve seri durumdan çıkarma özelliklerini özelleştirmek için bu öznitelikleri türüne eklemeyi göz önünde bulundurun.
Bağımlılık Ekleme ile serileştirmeyi özelleştirme
.NET'i hedefleyen ve İşlevler V3 çalışma zamanında çalışan işlev uygulamaları, verilerin ve özel durumların seri hale getirilme şeklini özelleştirmek için Bağımlılık Ekleme 'yi (DI) kullanabilir. Aşağıdaki örnek kod, IMessageSerializerSettingsFactory ve IErrorSerializerSettingsFactory hizmet arabirimlerinin özel uygulamalarını kullanarak varsayılan Json.NET serileştirme ayarlarını geçersiz kılmak için DI'nin nasıl kullanılacağını gösterir.
using Microsoft.Azure.Functions.Extensions.DependencyInjection;
using Microsoft.Azure.WebJobs.Extensions.DurableTask;
using Microsoft.Extensions.DependencyInjection;
using Newtonsoft.Json;
using System.Collections.Generic;
[assembly: FunctionsStartup(typeof(MyApplication.Startup))]
namespace MyApplication
{
public class Startup : FunctionsStartup
{
public override void Configure(IFunctionsHostBuilder builder)
{
builder.Services.AddSingleton<IMessageSerializerSettingsFactory, CustomMessageSerializerSettingsFactory>();
builder.Services.AddSingleton<IErrorSerializerSettingsFactory, CustomErrorSerializerSettingsFactory>();
}
/// <summary>
/// A factory that provides the serialization for all inputs and outputs for activities and
/// orchestrations, as well as entity state.
/// </summary>
internal class CustomMessageSerializerSettingsFactory : IMessageSerializerSettingsFactory
{
public JsonSerializerSettings CreateJsonSerializerSettings()
{
// Return your custom JsonSerializerSettings here
}
}
/// <summary>
/// A factory that provides the serialization for all exceptions thrown by activities
/// and orchestrations
/// </summary>
internal class CustomErrorSerializerSettingsFactory : IErrorSerializerSettingsFactory
{
public JsonSerializerSettings CreateJsonSerializerSettings()
{
// Return your custom JsonSerializerSettings here
}
}
}
}