Azure SDK nesneleri için iş parçacığı güvenliği ve istemci ömrü yönetimi
Bu makale, Azure SDK'sını kullanırken iş parçacığı güvenliği sorunlarını anlamanıza yardımcı olur. Ayrıca SDK tasarımının istemci yaşam süresi yönetimini nasıl etkilediğini de açıklar. Azure SDK istemci nesnelerini atmanın neden gereksiz olduğunu öğreneceksiniz.
İş parçacığı güvenliği
Tüm Azure SDK istemci nesneleri iş parçacığı açısından güvenlidir ve birbirinden bağımsızdır. Bu tasarım, istemci örneklerini yeniden kullanma işleminin iş parçacıkları arasında bile her zaman güvenli olmasını sağlar. Örneğin, aşağıdaki kod birden çok görev başlatır ancak iş parçacığı güvenlidir:
var client = new SecretClient(
new Uri("<secrets_endpoint>"), new DefaultAzureCredential());
foreach (var secretName in secretNames)
{
// Using clients from parallel threads
Task.Run(() => Console.WriteLine(client.GetSecret(secretName).Value));
}
Girdi veya çıkış modelleri gibi SDK istemcileri tarafından kullanılan model nesneleri varsayılan olarak iş parçacığı açısından güvenli değildir. Model nesneleriyle ilgili kullanım örneklerinin çoğu yalnızca tek bir iş parçacığı kullanır. Bu nedenle, eşitlemeyi varsayılan bir davranış olarak uygulama maliyeti bu nesneler için çok yüksektir. Aşağıdaki kod, bir modele birden çok iş parçacığından erişmenin tanımlanmamış bir davranışa neden olabileceği bir hatayı gösterir:
KeyVaultSecret newSecret = client.SetSecret("secret", "value");
foreach (var tag in tags)
{
// Don't use model type from parallel threads
Task.Run(() => newSecret.Properties.Tags[tag] = CalculateTagValue(tag));
}
client.UpdateSecretProperties(newSecret.Properties);
Modele farklı iş parçacıklarından erişmek için kendi eşitleme kodunuzu uygulamanız gerekir. Örneğin:
KeyVaultSecret newSecret = client.SetSecret("secret", "value");
// Code omitted for brevity
foreach (var tag in tags)
{
Task.Run(() =>
{
lock (newSecret)
{
newSecret.Properties.Tags[tag] = CalculateTagValue(tag);
}
);
}
client.UpdateSecretProperties(newSecret.Properties);
İstemci ömrü
Azure SDK istemcileri iş parçacığı açısından güvenli olduğundan, belirli bir oluşturucu parametreleri kümesi için birden çok SDK istemci nesnesi oluşturmak için bir neden yoktur. Azure SDK istemci nesnelerini bir kez oluşturulan tekil nesneler olarak değerlendirin. Bu öneri genellikle Azure SDK istemci nesnelerini uygulamanın Denetim Ters Çevirme (IoC) kapsayıcısında tekil olarak kaydederek uygulanır. Bağımlılık ekleme (DI), SDK istemci nesnesine başvuru almak için kullanılır. Aşağıdaki örnekte tekil istemci nesne kaydı gösterilmektedir:
var builder = Host.CreateApplicationBuilder(args);
var endpoint = builder.Configuration["SecretsEndpoint"];
var blobServiceClient = new BlobServiceClient(
new Uri(endpoint), new DefaultAzureCredential());
builder.Services.AddSingleton(blobServiceClient);
Azure SDK ile DI uygulama hakkında daha fazla bilgi için bkz . .NET için Azure SDK ile bağımlılık ekleme.
Alternatif olarak, bir SDK istemci örneği oluşturabilir ve bunu istemci gerektiren yöntemlere sağlayabilirsiniz. Amaç, aynı SDK istemci nesnesinin aynı parametrelerle gereksiz örneklemelerini önlemektir. Hem gereksiz hem de gereksiz.
İstemciler atılabilir değildir
Sık sık sorulan son iki soru şunlardır:
- Azure SDK istemci nesnelerini kullanmayı bitirdiğimde atmam gerekiyor mu?
- HTTP tabanlı Azure SDK istemci nesneleri neden atılabilir değildir?
Dahili olarak, tüm Azure SDK istemcileri tek bir paylaşılan HttpClient
örnek kullanır. İstemciler, etkin bir şekilde serbest olması gereken başka kaynak oluşturmaz. Paylaşılan HttpClient
örnek tüm uygulama ömrü boyunca devam eder.
// Both clients reuse the shared HttpClient and don't need to be disposed
var blobClient = new BlobClient(new Uri(sasUri));
var blobClient2 = new BlobClient(new Uri(sasUri2));
Azure SDK istemci nesnesine özel örneği HttpClient
sağlamak mümkündür. Bu durumda, yaşam süresini yönetmek HttpClient
ve doğru zamanda düzgün bir şekilde yok etme sorumluluğunuz olur.
var httpClient = new HttpClient();
var clientOptions = new BlobClientOptions()
{
Transport = new HttpClientTransport(httpClient)
};
// Both clients would use the HttpClient instance provided in clientOptions
var blobClient = new BlobClient(new Uri(sasUri), clientOptions);
var blobClient2 = new BlobClient(new Uri(sasUri2), clientOptions);
// Code omitted for brevity
// You're responsible for properly disposing httpClient some time later
httpClient.Dispose();
Örneklerin düzgün bir şekilde yönetilmesine ve kaldırılmasına HttpClient
yönelik diğer yönergelere belgelerden HttpClient ulaşabilirsiniz.