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ı iş akışlarınızdaki düzenleme örneklerini başlatmak, sorgulamak, sonlandırmak, askıya almak, sürdürmek ve temizlemek için yerleşik örnek yönetimi API'lerini kullanın.
Durable Functions'da orchestration istemci bağlaması bu API'leri kullanıma sunar.
Dayanıklı Görev SDK'larında aynı işlemler sınıfı aracılığıyla DurableTaskClient kullanılabilir. Bu makalede, her iki platform için kod örnekleriyle her örnek yönetimi işleminin nasıl gerçekleştirebileceğiniz gösterilmektedir.
Tip
Azure Dayanıklı Görev Zamanlayıcı hem Durable Functions hem de Dayanıklı Görev SDK'ları için önerilen arka uç olup dayanıklı iş akışlarını büyük ölçekte çalıştırmak için tam olarak yönetilen, sunucusuz bir deneyim sağlar.
Başlangıç örnekleri
Düzenleme istemcisinde start-new (veya schedule-new) yöntemi yeni bir düzenleme örneği başlatır. Dahili olarak, bu yöntem yapılandırılan arka uçtan (Dayanıklı Görev Zamanlayıcı veya Azure Storage gibi) bir ileti yazar ve sonra döndürür. Bu ileti, belirtilen adla bir düzenlemenin başlatılmasını zaman uyumsuz olarak tetikler.
Yeni bir düzenleme örneği başlatmaya yönelik parametreler şunlardır:
- Ad: Planlanacak düzenleyici işlevin adı.
- Giriş: Orchestrator işlevine giriş olarak geçirilmesi gereken JSON serileştirilebilir veriler.
- InstanceId: (İsteğe bağlı) Örneğin benzersiz kimliği. Bu parametreyi belirtmezseniz, yöntem rastgele bir kimlik kullanır.
Tip
Mümkün olduğunda örnek kimliği için rastgele bir tanımlayıcı kullanın. Rastgele örnek kimlikleri, düzenleyici işlevlerini birden çok VM arasında ölçeklendirirken eşit yük dağılımı sağlamaya yardımcı olur. Rastgele olmayan örnek kimliklerini kullanmak için uygun zaman, kimliğin bir dış kaynaktan geldiği veya tekil düzenleyici desenini uyguladığınız zamandır.
- Ad: Programlanması gereken orkestrasyonun adı.
- Giriş: Düzenlemeye giriş olarak geçirilmesi gereken JSON serileştirilebilir veriler.
- InstanceId: (İsteğe bağlı) Örneğin benzersiz kimliği. Bu parametreyi belirtmezseniz, yöntem rastgele bir kimlik kullanır.
Tip
Mümkün olduğunda örnek kimliği için rastgele bir tanımlayıcı kullanın. Rastgele örnek kimlikleri, düzenlemeleri birden çok VM arasında ölçeklendirirken eşit yük dağılımı sağlamaya yardımcı olur. Rastgele olmayan örnek kimliklerini kullanmak için uygun zaman, kimliğin bir dış kaynaktan geldiği veya tekil düzenleyici desenini uyguladığınız zamandır.
Aşağıdaki örnek işlev yeni bir düzenleme örneği başlatır:
[FunctionName("HelloWorldQueueTrigger")]
public static async Task Run(
[QueueTrigger("start-queue")] string input,
[DurableClient] IDurableOrchestrationClient starter,
ILogger log)
{
string instanceId = await starter.StartNewAsync("HelloWorld", input);
log.LogInformation($"Started orchestration with ID = '{instanceId}'.");
}
Uyarı
Önceki C# kodu, yeni sürümlerde kullanımdan kaldırılan IDurableOrchestrationClient in-process modeli kullanmaktadır ki bu, Durable Functions eklentisinin daha yeni sürümlerinde eski olarak işaretlenmiştir. Yeni .NET projeleri için ile DurableTaskClient kullanmayı göz önünde bulundurun. Daha fazla bilgi için Dayanıklı İşlevler sürümleri makalesine bakın.
Önemli
Şu anda PowerShell Dayanıklı Görev SDK'sı kullanılamıyor.
Aşağıdaki kod, Dayanıklı Görev SDK'larını kullanarak yeni bir düzenleme örneğinin nasıl başlatıldığını gösterir:
using Microsoft.DurableTask.Client;
// Schedule a new orchestration instance
string instanceId = await client.ScheduleNewOrchestrationInstanceAsync("HelloWorld", input);
Console.WriteLine($"Started orchestration with ID = '{instanceId}'.");
// Optionally, wait for the orchestration to start
OrchestrationMetadata metadata = await client.WaitForInstanceStartAsync(instanceId, timeout: TimeSpan.FromSeconds(30));
Sorgu örnekleri
Yeni düzenleme örneklerini başlattıktan sonra büyük olasılıkla çalışma zamanı durumlarını sorgulayarak bunların çalışıp çalışmadığını, tamamlanıp tamamlanmadığını veya başarısız olduğunu öğrenmeniz gerekir.
Düzenleme istemcisinde get-status yöntemi bir düzenleme örneğinin durumunu döndürür.
Parametre olarak bir instanceId (gerekli), showHistory (isteğe bağlı), showHistoryOutput (isteğe bağlı) ve showInput (isteğe bağlı) alır.
-
showHistory: olaraktrueayarlanırsa, yanıt yürütme geçmişini içerir. -
showHistoryOutput: olaraktrueayarlanırsa, yürütme geçmişi etkinlik çıkışlarını içerir. -
showInput: olarakfalseayarlanırsa, yanıt işlevin girişini içermez. Varsayılan değertruedeğeridir.
yöntemi aşağıdaki özelliklere sahip bir nesne döndürür:
- İsim: Orchestrator fonksiyonunun adı.
-
InstanceId: Koordine işleminin örnek ID'si (girişle
instanceIdaynı olmalıdır). - CreatedTime: Orchestrator işlevinin çalışmaya başladığı saat.
- LastUpdatedTime: Düzenlemenin son denetim noktalarının bulunduğu saat.
-
Giriş: İşlevin JSON değeri olarak girişi. Eğer
showInputfalseise, bu alan doldurulmaz. - CustomStatus: JSON biçiminde özel düzenleme durumu.
- Çıkış: İşlevin JSON değeri olarak çıkışı (işlev tamamlanırsa). Orchestrator işlevi başarısız olursa, bu özellik hata ayrıntılarını içerir. Orchestrator işlevi askıya alınırsa veya sonlandırılırsa, bu özellik askıya alma veya sonlandırma nedenini (varsa) içerir.
-
RuntimeStatus: Aşağıdaki değerlerden biri:
- Beklemede: Örnek zamanlanmış ancak henüz çalışmaya başlamamış.
- Çalışıyor: Örnek çalışıyor.
- Tamamlandı: Örnek normal şekilde tamamlandı.
- ContinuedAsNew: Örnek yeni bir geçmişle yeniden başlatıldı. Bu durum geçici bir durumdur.
- Başarısız: Örnek bir hatayla başarısız oldu.
- Sonlandırıldı: Örnek aniden durdu.
- Askıya alındı: Örnek durduruldu ve daha sonra devam edilebilir.
-
Geçmiş: Orkestrasyonun yürütme geçmişi. Bu alan yalnızca
showHistorytrueolarak ayarlandıysa doldurulur.
-
showHistory: olaraktrueayarlanırsa, yanıt yürütme geçmişini içerir. -
showHistoryOutput: olaraktrueayarlanırsa, yürütme geçmişi etkinlik çıkışlarını içerir. -
showInput:falseolarak ayarlandığında, yanıt orchestrasyonun girişini içermez. Varsayılan değertruedeğeridir.
yöntemi aşağıdaki özelliklere sahip bir nesne döndürür:
- Ad: Orkestrasyonun adı.
-
InstanceId: Koordine işleminin örnek ID'si (girişle
instanceIdaynı olmalıdır). - CreatedTime: Orkestrasyonun çalışmaya başladığı zaman.
- LastUpdatedTime: Düzenlemenin son denetim noktalarının bulunduğu saat.
-
Giriş: Orkestrasyonun girdisi bir JSON değeri olarak. Eğer
showInputfalseise, bu alan doldurulmaz. - CustomStatus: JSON biçiminde özel düzenleme durumu.
- Çıkış: Düzenlemenin JSON değeri olarak çıkışı (düzenleme tamamlanırsa). Düzenleme başarısız olursa, bu özellik hata ayrıntılarını içerir. Orkestrasyon askıya alınmışsa veya sonlandırılmışsa, bu özellik askıya alma veya sonlandırma nedenini (mevcutsa) içerir.
-
RuntimeStatus: Aşağıdaki değerlerden biri:
- Beklemede: Örnek zamanlanmış ancak henüz çalışmaya başlamamış.
- Çalışıyor: Örnek çalışıyor.
- Tamamlandı: Örnek normal şekilde tamamlandı.
- ContinuedAsNew: Örnek yeni bir geçmişle yeniden başlatıldı. Bu durum geçici bir durumdur.
- Başarısız: Örnek bir hatayla başarısız oldu.
- Sonlandırıldı: Örnek aniden durdu.
- Askıya alındı: Örnek durduruldu ve daha sonra devam edilebilir.
-
Geçmiş: Orkestrasyonun yürütme geçmişi. Bu alan yalnızca
showHistorytrueolarak ayarlandıysa doldurulur.
Uyarı
Zamanlanmış tüm görevleri bitene Completed düzenleyici dönene kadar düzenleyici olarak işaretlenmez. Başka bir deyişle, bir düzenleyicinin return olarak işaretlenmesi için Completed ifadesine ulaşması yeterli değildir. Bu, özellikle WhenAny'ün kullanıldığı durumlar için geçerlidir; bu düzenleyiciler genellikle zamanlanan tüm görevler yürütülmeden önce return çalışır.
Bu yöntem null (.NET ve Java), undefined (JavaScript) veya örnek yoksa None (Python) döndürür.
[FunctionName("GetStatus")]
public static async Task Run(
[DurableClient] IDurableOrchestrationClient client,
[QueueTrigger("check-status-queue")] string instanceId)
{
DurableOrchestrationStatus status = await client.GetStatusAsync(instanceId);
// do something based on the current status.
}
Uyarı
Önceki C# kodu, yeni sürümlerde kullanımdan kaldırılan IDurableOrchestrationClient in-process modeli kullanmaktadır ki bu, Durable Functions eklentisinin daha yeni sürümlerinde eski olarak işaretlenmiştir. Yeni .NET projeleri için ile DurableTaskClient kullanmayı göz önünde bulundurun. Daha fazla bilgi için Dayanıklı İşlevler sürümleri makalesine bakın.
using Microsoft.DurableTask.Client;
// Get the status of an orchestration instance
OrchestrationMetadata? metadata = await client.GetInstanceAsync(instanceId, getInputsAndOutputs: true);
if (metadata != null)
{
OrchestrationRuntimeStatus status = metadata.RuntimeStatus;
// do something based on the current status
}
Tüm düzenleme örneklerini sorgulama
Görev hub'ınızdaki tüm düzenleme örneklerinin durumlarını sorgulamak için dil SDK'nızdaki API'leri kullanabilirsiniz. Bu "list-instances" veya "get-status" API'si, sorgu parametreleriyle eşleşen düzenleme örneklerini temsil eden nesnelerin listesini döndürür.
[FunctionName("GetAllStatus")]
public static async Task Run(
[HttpTrigger(AuthorizationLevel.Anonymous, "get", "post")] HttpRequestMessage req,
[DurableClient] IDurableOrchestrationClient client,
ILogger log)
{
var noFilter = new OrchestrationStatusQueryCondition();
OrchestrationStatusQueryResult result = await client.ListInstancesAsync(
noFilter,
CancellationToken.None);
foreach (DurableOrchestrationStatus instance in result.DurableOrchestrationState)
{
log.LogInformation(JsonConvert.SerializeObject(instance));
}
// Note: ListInstancesAsync only returns the first page of results.
// To request additional pages provide the result.ContinuationToken
// to the OrchestrationStatusQueryCondition's ContinuationToken property.
}
Uyarı
Önceki C# kodu, yeni sürümlerde kullanımdan kaldırılan IDurableOrchestrationClient in-process modeli kullanmaktadır ki bu, Durable Functions eklentisinin daha yeni sürümlerinde eski olarak işaretlenmiştir. Yeni .NET projeleri için ile DurableTaskClient kullanmayı göz önünde bulundurun. Daha fazla bilgi için Dayanıklı İşlevler sürümleri makalesine bakın.
using Microsoft.DurableTask.Client;
// Query all orchestration instances
AsyncPageable<OrchestrationMetadata> instances = client.GetAllInstancesAsync(new OrchestrationQuery());
await foreach (OrchestrationMetadata instance in instances)
{
Console.WriteLine(instance.InstanceId);
}
Filtrelerle sorgu düzenleme örnekleri
Standart örnek sorgusunun sağladığı tüm bilgilere ihtiyacınız yoksa ne olur? Örneğin, yalnızca düzenleme oluşturma zamanını veya düzenleme çalışma zamanı durumunu arıyorsanız ne olur? Filtre uygulayarak sorgunuzu daraltma.
[FunctionName("QueryStatus")]
public static async Task Run(
[HttpTrigger(AuthorizationLevel.Anonymous, "get", "post")] HttpRequestMessage req,
[DurableClient] IDurableOrchestrationClient client,
ILogger log)
{
// Get the first 100 running or pending instances that were created between 7 and 1 days ago
var queryFilter = new OrchestrationStatusQueryCondition
{
RuntimeStatus = new[]
{
OrchestrationRuntimeStatus.Pending,
OrchestrationRuntimeStatus.Running,
},
CreatedTimeFrom = DateTime.UtcNow.Subtract(TimeSpan.FromDays(7)),
CreatedTimeTo = DateTime.UtcNow.Subtract(TimeSpan.FromDays(1)),
PageSize = 100,
};
OrchestrationStatusQueryResult result = await client.ListInstancesAsync(
queryFilter,
CancellationToken.None);
foreach (DurableOrchestrationStatus instance in result.DurableOrchestrationState)
{
log.LogInformation(JsonConvert.SerializeObject(instance));
}
}
Uyarı
Önceki C# kodu, yeni sürümlerde kullanımdan kaldırılan IDurableOrchestrationClient in-process modeli kullanmaktadır ki bu, Durable Functions eklentisinin daha yeni sürümlerinde eski olarak işaretlenmiştir. Yeni .NET projeleri için ile DurableTaskClient kullanmayı göz önünde bulundurun. Daha fazla bilgi için Dayanıklı İşlevler sürümleri makalesine bakın.
using Microsoft.DurableTask.Client;
// Get running or pending instances created in the last 7 days
var query = new OrchestrationQuery
{
Statuses = new[] { OrchestrationRuntimeStatus.Running, OrchestrationRuntimeStatus.Pending },
CreatedFrom = DateTime.UtcNow.AddDays(-7),
CreatedTo = DateTime.UtcNow.AddDays(-1),
PageSize = 100
};
AsyncPageable<OrchestrationMetadata> instances = client.GetAllInstancesAsync(query);
await foreach (OrchestrationMetadata instance in instances)
{
Console.WriteLine($"{instance.InstanceId}: {instance.RuntimeStatus}");
}
Orkestrasyon örneklerini sonlandırma
Çalışması çok uzun süren bir düzenleme örneğiniz varsa veya herhangi bir nedenle tamamlanmadan önce durdurmanız gerekiyorsa, sonlandırabilirsiniz.
Sonlandırma API'si için iki parametre, günlüklere ve örnek durumuna yazan bir örnek kimliği ve neden dizesidir.
[FunctionName("TerminateInstance")]
public static Task Run(
[DurableClient] IDurableOrchestrationClient client,
[QueueTrigger("terminate-queue")] string instanceId)
{
string reason = "Found a bug";
return client.TerminateAsync(instanceId, reason);
}
Uyarı
Önceki C# kodu, yeni sürümlerde kullanımdan kaldırılan IDurableOrchestrationClient in-process modeli kullanmaktadır ki bu, Durable Functions eklentisinin daha yeni sürümlerinde eski olarak işaretlenmiştir. Yeni .NET projeleri için ile DurableTaskClient kullanmayı göz önünde bulundurun. Daha fazla bilgi için Dayanıklı İşlevler sürümleri makalesine bakın.
using Microsoft.DurableTask.Client;
string reason = "Found a bug";
await client.TerminateInstanceAsync(instanceId, reason);
Sonlandırılan bir örnek sonunda Terminated durumuna geçer. Ancak bu geçiş hemen gerçekleşmez. Bunun yerine, sonlandırma işlemi görev hub'ında bu örnek için diğer işlemlerle birlikte kuyruğa alınır. Sonlandırılan bir örneğin gerçekten "sonlandırılmış" durumuna ne zaman ulaştığını öğrenmek için örnek sorgu API'lerini Terminated kullanabilirsiniz.
Uyarı
Örnek sonlandırma halen yayılmaz. Etkinlik işlevleri ve alt orkestrasyonlar, bunları çağıran düzenleme örneğini sonlandırmanıza bakılmaksızın tamamlanana kadar çalışır.
Oryestrasyon örneklerini askıya almak ve devam ettirmek
Düzenlemeyi askıya almak, çalışan bir düzenlemeyi durdurmanıza olanak tanır. Orkestrasyonu sonlandırmanın aksine, askıya alınmış bir orkestratörü daha sonra sürdürebilirsiniz.
Askıya alma API'si için iki parametre, örnek ID'si ve neden dizesidir; bunlar günlüklere ve örnek durumuna yazılır.
[FunctionName("SuspendResumeInstance")]
public static async Task Run(
[DurableClient] IDurableOrchestrationClient client,
[QueueTrigger("suspend-resume-queue")] string instanceId)
{
// To suspend an orchestration
string suspendReason = "Need to pause workflow";
await client.SuspendAsync(instanceId, suspendReason);
// To resume an orchestration
string resumeReason = "Continue workflow";
await client.ResumeAsync(instanceId, resumeReason);
}
using Microsoft.DurableTask.Client;
// To suspend an orchestration
string suspendReason = "Need to pause workflow";
await client.SuspendInstanceAsync(instanceId, suspendReason);
// To resume an orchestration
string resumeReason = "Continue workflow";
await client.ResumeInstanceAsync(instanceId, resumeReason);
Askıya alınan bir örnek sonunda Suspended durumuna geçer. Ancak bu geçiş hemen gerçekleşmez. Bunun yerine, askıya alma işlemi, bu örneğe ait diğer işlemlerle birlikte görev hub'ında kuyruğa alınır. Bir çalışan örneğin gerçekten Suspended durumuna ne zaman ulaştığını öğrenmek için örnek API sorgularını kullanın.
Askıya alınan bir orkestratör devam ettirildiğinde, durumu Running olarak geri döner.
Olayları örneklere gönderme
Bazı senaryolarda düzenleyici işlevlerinin beklemesi ve dış olayları dinlemesi gerekir. Bu yaklaşımın yararlı olduğu örnekler arasında izleme ve insan etkileşimi senaryoları yer alır.
Bazı senaryolarda, düzenlemelerin beklemesi ve dış olayları dinlemesi gerekir. Bu yaklaşımın yararlı olduğu örnekler arasında izleme ve insan etkileşimi senaryoları yer alır.
Orchestration istemcisinin raise event API'sini kullanarak çalışan örneklere olay bildirimleri gönderebilirsiniz. Orkestrasyonlar, dış olay bekleme düzenleyici API'sini kullanarak bu olayları dinleyebilir ve yanıtlayabilir.
Raise olayının parametreleri şunlardır:
- Örnek Kimliği: Örneğin benzersiz kimliği.
- Olay adı: Gönderilecek olayın adı.
- Olay verileri: Örneğe gönderilecek JSON ile serileştirilebilen yük.
[FunctionName("RaiseEvent")]
public static Task Run(
[DurableClient] IDurableOrchestrationClient client,
[QueueTrigger("event-queue")] string instanceId)
{
int[] eventData = new int[] { 1, 2, 3 };
return client.RaiseEventAsync(instanceId, "MyEvent", eventData);
}
Uyarı
Önceki C# kodu, yeni sürümlerde kullanımdan kaldırılan IDurableOrchestrationClient in-process modeli kullanmaktadır ki bu, Durable Functions eklentisinin daha yeni sürümlerinde eski olarak işaretlenmiştir. Yeni .NET projeleri için ile DurableTaskClient kullanmayı göz önünde bulundurun. Daha fazla bilgi için Dayanıklı İşlevler sürümleri makalesine bakın.
using Microsoft.DurableTask.Client;
int[] eventData = new int[] { 1, 2, 3 };
await client.RaiseEventAsync(instanceId, "MyEvent", eventData);
Uyarı
Belirtilen örnek kimliğine sahip bir orkestrasyon örneği yoksa, etkinlik mesajı atılır. Bir örnek varsa ancak henüz olayı beklemiyorsa, olay alınmaya ve işlenmeye hazır olana kadar örnek durumunda depolanır.
Düzenlemenin tamamlanmasını bekleyin
Uzun süre çalışan orkestrasyonlarda beklemek ve bir orkestrasyonun sonuçlarını almak isteyebilirsiniz. Bu gibi durumlarda, düzenlemede bir zaman aşımı süresi tanımlamak da yararlıdır. Zaman aşımı aşılırsa, sonuçlar yerine orkestrasyonun durumu döndürülür.
Orkestrasyon örneğinden gerçek çıktıyı senkron bir şekilde almak için "tamamlanmasını bekleyin veya durum kontrolü yanıtı oluşturun" API'sini kullanın. Varsayılan olarak, bu yöntem on saniyelik bir zaman aşımına ve bir saniyelik yoklama aralığına sahiptir.
Bu API'nin nasıl kullanılacağını gösteren örnek bir HTTP tetikleyici işlevi aşağıda verilmiştir:
// Copyright (c) .NET Foundation. All rights reserved.
// Licensed under the MIT License. See LICENSE in the project root for license information.
using System;
using System.Net.Http;
using System.Threading.Tasks;
using Microsoft.Azure.WebJobs;
using Microsoft.Azure.WebJobs.Extensions.DurableTask;
using Microsoft.Azure.WebJobs.Extensions.Http;
using Microsoft.Extensions.Logging;
namespace VSSample
{
public static class HttpSyncStart
{
private const string Timeout = "timeout";
private const string RetryInterval = "retryInterval";
[FunctionName("HttpSyncStart")]
public static async Task<HttpResponseMessage> Run(
[HttpTrigger(AuthorizationLevel.Function, methods: "post", Route = "orchestrators/{functionName}/wait")]
HttpRequestMessage req,
[DurableClient] IDurableOrchestrationClient starter,
string functionName,
ILogger log)
{
// Function input comes from the request content.
object eventData = await req.Content.ReadAsAsync<object>();
string instanceId = await starter.StartNewAsync(functionName, eventData);
log.LogInformation($"Started orchestration with ID = '{instanceId}'.");
TimeSpan timeout = GetTimeSpan(req, Timeout) ?? TimeSpan.FromSeconds(30);
TimeSpan retryInterval = GetTimeSpan(req, RetryInterval) ?? TimeSpan.FromSeconds(1);
return await starter.WaitForCompletionOrCreateCheckStatusResponseAsync(
req,
instanceId,
timeout,
retryInterval);
}
private static TimeSpan? GetTimeSpan(HttpRequestMessage request, string queryParameterName)
{
string queryParameterStringValue = request.RequestUri.ParseQueryString()[queryParameterName];
if (string.IsNullOrEmpty(queryParameterStringValue))
{
return null;
}
return TimeSpan.FromSeconds(double.Parse(queryParameterStringValue));
}
}
}
Dayanıklı Görev SDK'ları, düzenlemenin zaman uyumlu bir şekilde bitmesini beklemek için bir yöntem sağlar.
using Microsoft.DurableTask.Client;
// Wait for orchestration to complete with a timeout
OrchestrationMetadata metadata = await client.WaitForInstanceCompletionAsync(
instanceId,
timeout: TimeSpan.FromSeconds(30),
getInputsAndOutputs: true);
if (metadata.RuntimeStatus == OrchestrationRuntimeStatus.Completed)
{
Console.WriteLine($"Output: {metadata.SerializedOutput}");
}
İşlevi aşağıdaki satırla çağırın. Zaman aşımı için iki saniye ve yeniden deneme aralığı için 0,5 saniye kullanın:
curl -X POST "http://localhost:7071/orchestrators/E1_HelloSequence/wait?timeout=2&retryInterval=0.5"
Uyarı
Yukarıdaki cURL komutu, projenizde adlı E1_HelloSequence bir orchestrator işlevine sahip olduğunuzu varsayar. HTTP tetikleyici işlevinin nasıl yazıldığından, bunu projenizdeki herhangi bir düzenleyici işlevinin adıyla değiştirebilirsiniz.
Düzenleme örneğinden yanıt almak için gereken süreye bağlı olarak iki durum vardır:
- Düzenleme örnekleri tanımlanan zaman aşımı süresi içinde (bu örnekte iki saniye) tamamlanır ve yanıt, zaman uyumlu olarak teslim edilen gerçek düzenleme örneği çıkışıdır:
HTTP/1.1 200 OK
Content-Type: application/json; charset=utf-8
Date: Thu, 14 Dec 2021 06:14:29 GMT
Transfer-Encoding: chunked
[
"Hello Tokyo!",
"Hello Seattle!",
"Hello London!"
]
- Düzenleme örnekleri tanımlanan zaman aşımı içinde tamamlanamıyor ve yanıt , HTTP API URL'si bulma bölümünde açıklanan varsayılan değerdir:
HTTP/1.1 202 Accepted
Content-Type: application/json; charset=utf-8
Date: Thu, 14 Dec 2021 06:13:51 GMT
Location: http://localhost:7071/runtime/webhooks/durabletask/instances/d3b72dddefce4e758d92f4d411567177?taskHub={taskHub}&connection={connection}&code={systemKey}
Retry-After: 10
Transfer-Encoding: chunked
{
"id": "d3b72dddefce4e758d92f4d411567177",
"sendEventPostUri": "http://localhost:7071/runtime/webhooks/durabletask/instances/d3b72dddefce4e758d92f4d411567177/raiseEvent/{eventName}?taskHub={taskHub}&connection={connection}&code={systemKey}",
"statusQueryGetUri": "http://localhost:7071/runtime/webhooks/durabletask/instances/d3b72dddefce4e758d92f4d411567177?taskHub={taskHub}&connection={connection}&code={systemKey}",
"terminatePostUri": "http://localhost:7071/runtime/webhooks/durabletask/instances/d3b72dddefce4e758d92f4d411567177/terminate?reason={text}&taskHub={taskHub}&connection={connection}&code={systemKey}",
"suspendPostUri": "http://localhost:7071/runtime/webhooks/durabletask/instances/d3b72dddefce4e758d92f4d411567177/suspend?reason={text}&taskHub={taskHub}&connection={connection}&code={systemKey}",
"resumePostUri": "http://localhost:7071/runtime/webhooks/durabletask/instances/d3b72dddefce4e758d92f4d411567177/resume?reason={text}&taskHub={taskHub}&connection={connection}&code={systemKey}"
}
Uyarı
Web kancası URL'lerinin biçimi, çalıştırdığınız Azure Functions konağın sürümüne bağlı olarak farklılık gösterebilir. Yukarıdaki örnek, Azure İşlevleri 3.0 konağı içindir.
Orkestrasyon örnekleri için HTTP yönetim web kancası URL'lerini elde etme
Olayları izlemek veya bir orkestrasyona olayları yükseltmek için bir dış sistem kullanın. Dış sistemler, HTTP API URL bulma bölümünde açıklanan varsayılan yanıtın parçası olan web kancası URL'leri aracılığıyla Durable Functions ile iletişim kurar. Web kancası URL'leri, alternatif olarak orkestrasyon istemci bağlaması kullanılarak programatik olarak erişilebilir. Özellikle, create HTTP yönetim yükü API'si, bu webhook URL'lerini içeren serileştirilebilir bir nesne alır.
HTTP yönetimi yük oluşturma API'sinin bir parametresi vardır:
- Örnek Kimliği: Örneğin benzersiz kimliği.
Yöntemler, aşağıdaki dize özelliklerine sahip bir nesne döndürür:
-
Kimlik: Orkestrasyonun örnek kimliği (girişle
InstanceIdaynı olmalıdır). - StatusQueryGetUri: Düzenleme örneğinin durum URL'si.
- SendEventPostUri: Düzenleme örneğinin "etkinlik oluşturma" URL'si.
- TerminatePostUri: Orkestrasyon örneğinin "terminate" URL'si.
- PurgeHistoryDeleteUri: Orkestrasyon örneğinin "temizleme geçmişi" URL'si.
- SuspendPostUri: Düzenleme örneğinin "askıya alma" URL'si.
- ResumePostUri: Orkestrasyon örneğinin "devam et" URL'si.
İşlevler, aşağıdaki örneklerde gösterildiği gibi ilgili düzenlemelerde olayları izlemek veya tetiklamak için bu nesnelerin örneklerini dış sistemlere gönderir.
[FunctionName("SendInstanceInfo")]
public static void SendInstanceInfo(
[ActivityTrigger] IDurableActivityContext ctx,
[DurableClient] IDurableOrchestrationClient client,
[CosmosDB(
databaseName: "MonitorDB",
containerName: "HttpManagementPayloads",
Connection = "CosmosDBConnectionSetting")]out dynamic document)
{
HttpManagementPayload payload = client.CreateHttpManagementPayload(ctx.InstanceId);
// send the payload to Azure Cosmos DB
document = new { Payload = payload, id = ctx.InstanceId };
}
Uyarı
Önceki C# kodu, IDurableOrchestrationClient ve IDurableActivityContext ile işlem içi modeli kullanır ve bunlar, Dayanıklı İşlevler uzantısının daha yeni sürümlerinde eski olarak işaretlenmiştir. Yeni .NET projeleri için ile DurableTaskClient kullanmayı göz önünde bulundurun. Daha fazla bilgi için Dayanıklı İşlevler sürümleri makalesine bakın.
Orkestrasyon örneklerini geri alma
Beklenmeyen bir nedenle düzenleme hatanız varsa, bu amaçla oluşturulmuş bir API kullanarak örneği daha önce iyi durumda bir duruma geri sarabilirsiniz .
Uyarı
Bu API'nin düzgün hata işleme ve yeniden deneme ilkelerinin yerini alması amaçlanmamıştır. Bunun yerine, yalnızca düzenleme örneklerinin beklenmeyen nedenlerle başarısız olduğu durumlarda kullanılması amaçlanmıştır.
Failed dışındaki durumlarda orkestrasyonlar (örneğin, Running, Pending, Terminated veya Completed) "geri alınamaz". Hata işleme ve yeniden deneme ilkeleri hakkında daha fazla bilgi için Hata işleme makalesine bakın.
Düzenlemeyi RewindAsync durumuna geri getirmek için rewind (.NET) veya (JavaScript) yöntemini kullanın. Bu yöntem ayrıca düzenleme hatasına neden olan etkinlik veya alt yönetim yürütme hatalarını da yeniden çalıştırır.
Örneğin, bir dizi insan onayı içeren bir iş akışınız olduğunu varsayalım. Varsayalım ki bir dizi aktivite fonksiyonu bir kişiye bildirimde bulunarak onayının gerektiğini bildiriyor ve gerçek zamanlı yanıtın beklenmesini sağlıyor. Tüm onay etkinlikleri yanıt aldıktan veya zaman aşımına uğradıktan sonra, geçersiz bir veritabanı bağlantı dizesi gibi bir uygulamanın yanlış yapılandırılması yüzünden başka bir etkinliğin başarısız olduğunu varsayalım. Sonuç, iş akışının derinliklerinde bir orkestrasyon hatasıdır.
RewindAsync (.NET) veya rewind (JavaScript) API'siyle uygulama yöneticisi yapılandırma hatasını düzeltebilir ve başarısız düzenlemeyi hatadan hemen önce duruma geri döndürebilir. İnsan etkileşimi adımlarının hiçbirinin yeniden onaylanması gerekmez ve düzenleme artık başarıyla tamamlanabilir.
Uyarı
Geri sarma özelliği, dayanıklı zamanlayıcılar kullanan düzenleme örneklerini geri sarmayı desteklemez.
[FunctionName("RewindInstance")]
public static Task Run(
[DurableClient] IDurableOrchestrationClient client,
[QueueTrigger("rewind-queue")] string instanceId)
{
string reason = "Orchestrator failed and needs to be revived.";
return client.RewindAsync(instanceId, reason);
}
Uyarı
Önceki C# kodu, yeni sürümlerde kullanımdan kaldırılan IDurableOrchestrationClient in-process modeli kullanmaktadır ki bu, Durable Functions eklentisinin daha yeni sürümlerinde eski olarak işaretlenmiştir. Yeni .NET projeleri için ile DurableTaskClient kullanmayı göz önünde bulundurun. Daha fazla bilgi için Dayanıklı İşlevler sürümleri makalesine bakın.
using Microsoft.DurableTask.Client;
string reason = "Orchestrator failed and needs to be revived.";
await client.RewindInstanceAsync(instanceId, reason);
Orkestrasyon örneklerini yeniden başlatma
Düzenlemeyi yeniden başlatmak, daha önce çalışan bir örneğin geçmişini kullanarak yeni bir örnek oluşturur. Bu özellik, aynı giriş ve örnek kimliği ile bir orkestrasyonu yeniden çalıştırmak istediğinizde kullanışlıdır ve orijinalini temel alarak yeni bir çalıştırma oluşturur.
[FunctionName("RestartInstance")]
public static Task Run(
[DurableClient] IDurableOrchestrationClient client,
[QueueTrigger("restart-queue")] string instanceId)
{
return client.RestartAsync(instanceId, restartWithNewInstanceId: true);
}
Uyarı
Önceki C# kodu, yeni sürümlerde kullanımdan kaldırılan IDurableOrchestrationClient in-process modeli kullanmaktadır ki bu, Durable Functions eklentisinin daha yeni sürümlerinde eski olarak işaretlenmiştir. Yeni .NET projeleri için ile DurableTaskClient kullanmayı göz önünde bulundurun. Daha fazla bilgi için Dayanıklı İşlevler sürümleri makalesine bakın.
using Microsoft.DurableTask.Client;
// Restart an orchestration with a new instance ID
string newInstanceId = await client.RestartInstanceAsync(instanceId, restartWithNewInstanceId: true);
Console.WriteLine($"Restarted as new instance: {newInstanceId}");
// Restart an orchestration keeping the same instance ID
await client.RestartInstanceAsync(instanceId, restartWithNewInstanceId: false);
Orkestrasyon örneği geçmişini temizleme
Orkestrasyonla ilişkili tüm verileri kaldırmak için örnek geçmişini temizleyin. Örneğin, tamamlanmış bir örnekle ilişkili tüm depolama kaynaklarını silin. Düzenleme istemcisi tarafından tanımlanan temizleme örneği API'sini kullanın.
Aşağıdaki örnekte tek bir orkestrasyon örneğinin nasıl temizleneceği açıklanmaktadır.
[FunctionName("PurgeInstanceHistory")]
public static Task Run(
[DurableClient] IDurableOrchestrationClient client,
[QueueTrigger("purge-queue")] string instanceId)
{
return client.PurgeInstanceHistoryAsync(instanceId);
}
using Microsoft.DurableTask.Client;
// Purge a single orchestration instance
PurgeResult result = await client.PurgeInstanceAsync(instanceId);
Console.WriteLine($"Purged {result.PurgedInstanceCount} instance(s).");
Aşağıdaki örnekte, belirtilen zaman aralığından sonra tamamlanan tüm düzenleme örneklerinin geçmişini temizleyen zamanlayıcı ile tetiklenen bir işlev gösterilmektedir. Bu durumda, 30 veya daha fazla gün önce tamamlanan tüm örneklerin verilerini kaldırır. Bu örnek işlev günde bir kez, saat 23:00 UTC'de çalışacak şekilde zamanlanmıştır:
[FunctionName("PurgeInstanceHistory")]
public static Task Run(
[DurableClient] IDurableOrchestrationClient client,
[TimerTrigger("0 0 12 * * *")] TimerInfo myTimer)
{
return client.PurgeInstanceHistoryAsync(
DateTime.MinValue,
DateTime.UtcNow.AddDays(-30),
new List<OrchestrationStatus>
{
OrchestrationStatus.Completed
});
}
Uyarı
Önceki C# kodu, yeni sürümlerde kullanımdan kaldırılan IDurableOrchestrationClient in-process modeli kullanmaktadır ki bu, Durable Functions eklentisinin daha yeni sürümlerinde eski olarak işaretlenmiştir. Yeni .NET projeleri için ile DurableTaskClient kullanmayı göz önünde bulundurun. Daha fazla bilgi için Dayanıklı İşlevler sürümleri makalesine bakın.
using Microsoft.DurableTask.Client;
// Purge completed instances older than 30 days
var filter = new PurgeInstancesFilter(
CreatedFrom: DateTime.MinValue,
CreatedTo: DateTime.UtcNow.AddDays(-30),
Statuses: new[] { OrchestrationRuntimeStatus.Completed });
PurgeResult result = await client.PurgeAllInstancesAsync(filter);
Console.WriteLine($"Purged {result.PurgedInstanceCount} instance(s).");
Uyarı
Temizleme geçmişi işleminin başarılı olması için hedef örneğin çalışma zamanı durumu Tamamlandı, Sonlandırıldı veya Başarısız olmalıdır.