Azure'da Dayanıklı İşlevler örneklerini yönetme

Dayanıklı İşlevler düzenlemeleri, yerleşik yönetim API'leri kullanılarak başlatılabilen, sorgulanabilen, askıya alınabilen, sürdürülebilen ve sonlandırılabilen uzun süre çalışan durum bilgisi olan işlevlerdir. Dış olayları örneklere gönderme, örnek geçmişini temizleme gibi Dayanıklı İşlevler düzenleme istemci bağlaması tarafından diğer birkaç örnek yönetimi API'si de kullanıma sunulur. Bu makalede desteklenen tüm örnek yönetimi işlemlerinin ayrıntılarına yer verilmiştir.

Başlangıç örnekleri

Düzenleme istemci bağlamasıüzerindeki start-new (veya schedule-new) yöntemi yeni bir düzenleme örneği başlatır. Dahili olarak, bu yöntem Dayanıklı İşlevler depolama sağlayıcısı aracılığıyla bir ileti yazar ve sonra döndürür. Bu ileti, belirtilen adla bir düzenleme işlevinin başlatılmasını zaman uyumsuz olarak tetikler.

Yeni bir düzenleme örneği başlatma parametreleri aşağıdaki gibidir:

  • Ad: Zamanlamak için orchestrator işlevinin 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.

İpucu

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çeklerken eşit yük dağılımı sağlamaya yardımcı olur. Rastgele olmayan örnek kimliklerini kullanmak için doğru zaman, kimliğin bir dış kaynaktan gelmesi gerektiği veya tekdüzen düzenleyici düzenini uyguladığınız zamandır.

Aşağıdaki kod, yeni bir düzenleme örneği başlatan örnek bir işlevdir:

[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}'.");
}

Not

Önceki C# kodu Dayanıklı İşlevler 2.x içindir. Dayanıklı İşlevler 1.x için özniteliği OrchestrationClient yerine DurableClient özniteliğini ve yerine IDurableOrchestrationClientparametre türünü kullanmanız DurableOrchestrationClient gerekir. Sürümler arasındaki farklar hakkında daha fazla bilgi için Dayanıklı İşlevler sürümleri makalesine bakın.

Azure Functions Core Tools

Aşağıdaki parametreleri alan Çekirdek Araçları'ndaki komutunu kullanarak func durable start-new da örneği doğrudan başlatabilirsiniz:

  • function-name (gerekli): Başlatacak işlevin adı.
  • input (isteğe bağlı): İşleve satır içi veya JSON dosyası aracılığıyla giriş. Dosyalar için, dosyasının @@path/to/file.jsonyoluna gibi bir ön ek ekleyin.
  • id (isteğe bağlı): Düzenleme örneğinin kimliği. Bu parametreyi belirtmezseniz, komut rastgele bir GUID kullanır.
  • connection-string-setting(isteğe bağlı): Kullanılacak depolama bağlantı dizesi içeren uygulama ayarının adı. Varsayılan değer AzureWebJobs Depolama'dır.
  • task-hub-name(isteğe bağlı): Kullanılacak Dayanıklı İşlevler görev hub'ının adı. Varsayılan değer DurableFunctionsHub'dır. Bunu host.json'de durableTask:HubName kullanarak da ayarlayabilirsiniz.

Not

Temel Araçlar komutları, bunları bir işlev uygulamasının kök dizininden çalıştırdığınızı varsayar. ve task-hub-name parametrelerini açıkça sağlarsanızconnection-string-setting, komutları herhangi bir dizinden çalıştırabilirsiniz. Bu komutları bir işlev uygulaması konağı çalıştırmadan çalıştırabilirsiniz ancak konak çalışmadığı sürece bazı etkileri gözlemleyemeyebilirsiniz. Örneğin, start-new komut bir başlangıç iletisini hedef görev hub'ına sıralar, ancak iletiyi işleyebilen bir işlev uygulaması konak işlemi çalıştırılmadığı sürece düzenleme aslında çalışmaz.

Not

Çekirdek Araçlar komutları şu anda yalnızca çalışma zamanı durumunu kalıcı hale getiren varsayılan Azure Depolama sağlayıcısı kullanılırken desteklenir.

Aşağıdaki komut HelloWorld adlı işlevi başlatır ve dosyanın counter-data.json içeriğini bu işleve geçirir:

func durable start-new --function-name HelloWorld --input @counter-data.json --task-hub-name TestTaskHub

Sorgu örnekleri

Yeni düzenleme örneklerini başlattıktan sonra çalıştırma, tamamlama veya başarısız olma durumlarını öğrenmek için büyük olasılıkla çalışma zamanı durumlarını sorgulamanız gerekir.

Düzenleme istemci bağlaması üzerindeki get-status yöntemi, bir düzenleme örneğinin durumunu sorgular.

Parametre olarak bir instanceId (gerekli), showHistory (isteğe bağlı), showHistoryOutput (isteğe bağlı) ve showInput (isteğe bağlı) alır.

  • showHistory: olarak trueayarlanırsa, yanıt yürütme geçmişini içerir.
  • showHistoryOutput: olarak trueayarlanırsa, yürütme geçmişi etkinlik çıkışlarını içerir.
  • showInput: olarak falseayarlanırsa, yanıt işlevin girişini içermez. Varsayılan değer şudur: true.

yöntemi aşağıdaki özelliklere sahip bir nesne döndürür:

  • Ad: Orchestrator işlevinin adı.
  • InstanceId: Düzenlemenin örnek kimliği (girişle instanceId aynı olmalıdır).
  • CreatedTime: Orchestrator işlevinin çalışmaya başladığı saat.
  • LastUpdatedTime: Düzenlemenin son denetim noktasının oluşturulduğu saat.
  • Giriş: İşlevin JSON değeri olarak girişi. Yanlışsa showInput bu alan doldurulamaz.
  • CustomStatus: JSON biçiminde özel düzenleme durumu.
  • Çıkış: İşlevin JSON değeri olarak çıkışı (işlev tamamlandıysa). Orchestrator işlevi başarısız olduysa, bu özellik hata ayrıntılarını içerir. Orchestrator işlevi askıya alındıysa veya sonlandırıldıysa, bu özellik askıya alma veya sonlandırma nedenini (varsa) içerir.
  • RuntimeStatus: Aşağıdaki değerlerden biri:
    • Beklemede: Örnek zamanlandı ancak henüz çalışmaya başlamadı.
    • Çalışıyor: Örnek çalışmaya başladı.
    • 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 durduruldu.
    • Askıya alındı: Örnek askıya alındı ve daha sonra devam ettirilebilir.
  • Geçmiş: Düzenlemenin yürütme geçmişi. Bu alan yalnızca olarak ayarlandıysa showHistorytruedoldurulur.

Not

Zamanlanmış tüm görevleri tamamlanana ve düzenleyici dönene kadar düzenleyici olarak Completed işaretlenmez. Başka bir deyişle, bir düzenleyicinin olarak Completedişaretlenmesi için deyimine return ulaşması yeterli değildir. Bu, özellikle kullanılan durumlar WhenAny için geçerlidir; bu düzenleyiciler zamanlanmış tüm görevler yürütülmeden önce sık sık return kullanılır.

Bu yöntem örnek yoksa (.NET ve Java), undefined (JavaScript) veya None (Python) döndürür null .

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

Not

Önceki C# kodu Dayanıklı İşlevler 2.x içindir. Dayanıklı İşlevler 1.x için özniteliği OrchestrationClient yerine DurableClient özniteliğini ve yerine IDurableOrchestrationClientparametre türünü kullanmanız DurableOrchestrationClient gerekir. Sürümler arasındaki farklar hakkında daha fazla bilgi için Dayanıklı İşlevler sürümleri makalesine bakın.

Azure Functions Core Tools

Ayrıca, Core Tools'taki komutunu kullanarak bir düzenleme örneğinin func durable get-runtime-status durumunu doğrudan almak da mümkündür.

Not

Temel Araçlar komutları şu anda yalnızca çalışma zamanı durumunu kalıcı hale getiren varsayılan Azure Depolama sağlayıcısı kullanılırken desteklenmektedir.

durable get-runtime-status komutu aşağıdaki parametreleri alır:

  • id (gerekli): Düzenleme örneğinin kimliği.
  • show-input (isteğe bağlı): olarak trueayarlanırsa, yanıt işlevin girişini içerir. Varsayılan değer şudur: false.
  • show-output (isteğe bağlı): olarak trueayarlanırsa, yanıt işlevin çıkışını içerir. Varsayılan değer şudur: false.
  • connection-string-setting(isteğe bağlı): Kullanılacak depolama bağlantı dizesi içeren uygulama ayarının adı. Varsayılan değer: AzureWebJobsStorage.
  • task-hub-name(isteğe bağlı): Kullanılacak Dayanıklı İşlevler görev hub'ının adı. Varsayılan değer: DurableFunctionsHub. host.json'da durableTask:HubName kullanılarak da ayarlanabilir.

Aşağıdaki komut, 0ab8c55a66644d68a3a8b220b12d209c düzenleme örneği kimliğine sahip bir örneğin durumunu (giriş ve çıkış dahil) alır. komutunu işlev uygulamasının kök dizininden çalıştırdığınız func varsayılır:

func durable get-runtime-status --id 0ab8c55a66644d68a3a8b220b12d209c --show-input true --show-output true

Bir düzenleme örneğinin durable get-history geçmişini almak için komutunu kullanabilirsiniz. Aşağıdaki parametreleri alır:

  • id (gerekli): Düzenleme örneğinin kimliği.
  • connection-string-setting(isteğe bağlı): Kullanılacak depolama bağlantı dizesi içeren uygulama ayarının adı. Varsayılan değer: AzureWebJobsStorage.
  • task-hub-name(isteğe bağlı): Kullanılacak Dayanıklı İşlevler görev hub'ının adı. Varsayılan değer: DurableFunctionsHub. host.json'de durableTask:HubName kullanılarak da ayarlanabilir.
func durable get-history --id 0ab8c55a66644d68a3a8b220b12d209c

Tüm örnekleri 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.
}

Not

Önceki C# kodu Dayanıklı İşlevler 2.x içindir. Dayanıklı İşlevler 1.x için özniteliği OrchestrationClient yerine DurableClient özniteliğini ve yerine IDurableOrchestrationClientparametre türünü kullanmanız DurableOrchestrationClient gerekir. Sürümler arasındaki farklar hakkında daha fazla bilgi için Dayanıklı İşlevler sürümleri makalesine bakın.

Azure Functions Core Tools

Çekirdek Araçları'ndaki komutu kullanarak örnekleri doğrudan sorgulamak func durable get-instances da mümkündür.

Not

Çekirdek Araçlar komutları şu anda yalnızca çalışma zamanı durumunu kalıcı hale getiren varsayılan Azure Depolama sağlayıcısı kullanılırken desteklenir.

durable get-instances komutu aşağıdaki parametreleri alır:

  • top (isteğe bağlı): Bu komut disk belleğini destekler. Bu parametre, istek başına alınan örnek sayısına karşılık gelir. Varsayılan değer 10'dur.
  • continuation-token (isteğe bağlı): Örneklerin hangi sayfasını veya bölümünü aldıracaklarını belirten belirteç. Her get-instances yürütme, sonraki örnek kümesine bir belirteç döndürür.
  • connection-string-setting(isteğe bağlı): Kullanılacak depolama bağlantı dizesi içeren uygulama ayarının adı. Varsayılan değer: AzureWebJobsStorage.
  • task-hub-name(isteğe bağlı): Kullanılacak Dayanıklı İşlevler görev hub'ının adı. Varsayılan değer: DurableFunctionsHub. host.json'da durableTask:HubName kullanılarak da ayarlanabilir.
func durable get-instances

Filtrelerle örnekleri sorgulama

Standart örnek sorgusunun sağlayabilecekleri tüm bilgilere gerçekten 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 daraltabilirsiniz.

[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 day(s) 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));
    }
}

Not

Önceki C# kodu Dayanıklı İşlevler 2.x içindir. Dayanıklı İşlevler 1.x için özniteliği OrchestrationClient yerine DurableClient özniteliğini ve yerine IDurableOrchestrationClientparametre türünü kullanmanız DurableOrchestrationClient gerekir. Sürümler arasındaki farklar hakkında daha fazla bilgi için Dayanıklı İşlevler sürümleri makalesine bakın.

Azure Functions Core Tools

Azure İşlevleri Çekirdek Araçları'nda, komutunu filtrelerle birlikte de kullanabilirsinizdurable get-instances. Yukarıda belirtilen top, , continuation-tokenconnection-string-settingve task-hub-name parametrelerine ek olarak üç filtre parametresi (created-after, created-beforeve runtime-status) kullanabilirsiniz.

Not

Çekirdek Araçlar komutları şu anda yalnızca çalışma zamanı durumunu kalıcı hale getiren varsayılan Azure Depolama sağlayıcısı kullanılırken desteklenir.

Komutun parametreleri aşağıdadır durable get-instances .

  • created-after (isteğe bağlı): Bu tarih/saat (UTC) tarihinden sonra oluşturulan örnekleri alın. ISO 8601 biçimlendirilmiş tarih saat kabul edildi.
  • created-before (isteğe bağlı): Bu tarih/saat (UTC) tarihinden önce oluşturulan örnekleri alın. ISO 8601 biçimlendirilmiş tarih saat kabul edildi.
  • runtime-status (isteğe bağlı): Belirli bir duruma sahip örnekleri alın (örneğin, çalışıyor veya tamamlandı). Birden çok (boşlukla ayrılmış) durum sağlayabilir.
  • top (isteğe bağlı): İstek başına alınan örnek sayısı. Varsayılan değer 10'dur.
  • continuation-token (isteğe bağlı): Örneklerin hangi sayfasını veya bölümünü aldıracaklarını belirten belirteç. Her get-instances yürütme, sonraki örnek kümesine bir belirteç döndürür.
  • connection-string-setting(isteğe bağlı): Kullanılacak depolama bağlantı dizesi içeren uygulama ayarının adı. Varsayılan değer: AzureWebJobsStorage.
  • task-hub-name(isteğe bağlı): Kullanılacak Dayanıklı İşlevler görev hub'ının adı. Varsayılan değer: DurableFunctionsHub. host.json'da durableTask:HubName kullanılarak da ayarlanabilir.

Herhangi bir filtre (created-after, created-beforeveya runtime-status) sağlamazsanız komut, çalışma zamanı durumuna veya oluşturma zamanına bakı olmadan örnekleri alır top .

func durable get-instances --created-after 2021-03-10T13:57:31Z --created-before  2021-03-10T23:59Z --top 15

Örnekleri 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 yazılan 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);
}

Not

Önceki C# kodu Dayanıklı İşlevler 2.x içindir. Dayanıklı İşlevler 1.x için özniteliği OrchestrationClient yerine DurableClient özniteliğini ve yerine IDurableOrchestrationClientparametre türünü kullanmanız DurableOrchestrationClient gerekir. Sürümler arasındaki farklar hakkında daha fazla bilgi için Dayanıklı İşlevler sürümleri makalesine bakın.

Sonlandırılan bir örnek sonunda duruma geçiş Terminated yapacaktır. Ancak, bu geçiş hemen gerçekleşmez. Bunun yerine, sonlandırma işlemi görev hub'ında ve bu örneğe yönelik diğer işlemlerde kuyruğa alınır. Sonlandırılan örneğin gerçekten duruma ne zaman ulaştığını öğrenmek için örnek sorgu API'lerini Terminated kullanabilirsiniz.

Not

Örnek sonlandırma şu anda yayılmaz. Etkinlik işlevleri ve alt düzenlemeleri, bunları çağıran düzenleme örneğini sonlandırıp sonlandırmadığınıza bakılmaksızın tamamlanmaya kadar çalışır.

Örnekleri askıya alma ve sürdürme

Düzenlemeyi askıya almak, çalışan bir düzenlemeyi durdurmanıza olanak tanır. Sonlandırmanın aksine, askıya alınmış bir düzenleyiciyi daha sonra sürdürme seçeneğiniz vardır.

Askıya alma API'si için iki parametre, günlüklere ve örnek durumuna yazılan bir örnek kimliği ve neden dizesidir.

[FunctionName("SuspendResumeInstance")]
public static async Task Run(
    [DurableClient] IDurableOrchestrationClient client,
    [QueueTrigger("suspend-resume-queue")] string instanceId)
{
    string suspendReason = "Need to pause workflow";
    await client.SuspendAsync(instanceId, suspendReason);
    
    // Wait for 30 seconds to ensure that the orchestrator state is updated to suspended. 
    DateTime dueTime = context.CurrentUtcDateTime.AddSeconds(30);
    await context.CreateTimer(dueTime, CancellationToken.None);
    
    string resumeReason = "Continue workflow";
    await client.ResumeAsync(instanceId, resumeReason);
}

Askıya alınan örnek sonunda duruma geçiş Suspended yapacaktır. Ancak, bu geçiş hemen gerçekleşmez. Bunun yerine, askıya alma işlemi görev hub'ında ve bu örneğe yönelik diğer işlemlerde kuyruğa alınır. Çalışan bir örneğin Askıya Alınmış durumuna ne zaman ulaştığını öğrenmek için örnek sorgusu API'lerini kullanabilirsiniz.

Askıya alınan bir düzenleyici sürdürülürse, durumu olarak değişir Running.

Azure Functions Core Tools

Ayrıca, Core Tools'taki komutunu kullanarak bir düzenleme örneğini func durable terminate doğrudan sonlandırabilirsiniz.

Not

Çekirdek Araçlar komutları şu anda yalnızca çalışma zamanı durumunu kalıcı hale getiren varsayılan Azure Depolama sağlayıcısı kullanılırken desteklenir.

durable terminate komutu aşağıdaki parametreleri alır:

  • id (gerekli): Sonlandıracak düzenleme örneğinin kimliği.
  • reason (isteğe bağlı): Sonlandırma nedeni.
  • connection-string-setting(isteğe bağlı): Kullanılacak depolama bağlantı dizesi içeren uygulama ayarının adı. Varsayılan değer: AzureWebJobsStorage.
  • task-hub-name(isteğe bağlı): Kullanılacak Dayanıklı İşlevler görev hub'ının adı. Varsayılan değer: DurableFunctionsHub. host.json'da durableTask:HubName kullanılarak da ayarlanabilir.

Aşağıdaki komut, 0ab8c55a66644d68a3a8b220b12d209c kimlikli bir düzenleme örneğini sonlandırır:

func durable terminate --id 0ab8c55a66644d68a3a8b220b12d209c --reason "Found a bug"

Örneklere olay gönderme

Bazı senaryolarda düzenleyici işlevlerinin beklemesi ve dış olayları dinlemesi gerekir. Bunun yararlı olduğu senaryolara örnek olarak izleme ve insan etkileşimi senaryoları verilebilir.

Orchestration istemcisinin raise event API'sini kullanarak çalışan örneklere olay bildirimleri gönderebilirsiniz. Düzenleme işlemleri, dış olay düzenleyici API'sini beklemeyi kullanarak bu olayları dinleyebilir ve yanıtlayabilir.

Raise olayı için parametreler aşağıdaki gibidir:

  • Örnek Kimliği: Örneğin benzersiz kimliği.
  • Olay adı: Gönderilecek olayın adı.
  • Olay verileri: Örneğe gönderilecek JSON serileştirilebilir 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);
}

Not

Önceki C# kodu Dayanıklı İşlevler 2.x içindir. Dayanıklı İşlevler 1.x için özniteliği OrchestrationClient yerine DurableClient özniteliğini ve yerine IDurableOrchestrationClientparametre türünü kullanmanız DurableOrchestrationClient gerekir. Sürümler arasındaki farklar hakkında daha fazla bilgi için Dayanıklı İşlevler sürümleri makalesine bakın.

Not

Belirtilen örnek kimliğine sahip bir düzenleme örneği yoksa, olay iletisi 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.

Azure Functions Core Tools

Ayrıca, Core Tools'taki komutunu kullanarak doğrudan bir düzenleme örneğine func durable raise-event olay oluşturabilirsiniz.

Not

Çekirdek Araçlar komutları şu anda yalnızca çalışma zamanı durumunu kalıcı hale getiren varsayılan Azure Depolama sağlayıcısı kullanılırken desteklenir.

durable raise-event komutu aşağıdaki parametreleri alır:

  • id (gerekli): Düzenleme örneğinin kimliği.
  • event-name: Yükseltilmesi gereken olayın adı.
  • event-data (isteğe bağlı): Düzenleme örneğine gönderilecek veriler. Bu bir JSON dosyasının yolu olabilir veya verileri doğrudan komut satırında sağlayabilirsiniz.
  • connection-string-setting(isteğe bağlı): Kullanılacak depolama bağlantı dizesi içeren uygulama ayarının adı. Varsayılan değer: AzureWebJobsStorage.
  • task-hub-name(isteğe bağlı): Kullanılacak Dayanıklı İşlevler görev hub'ının adı. Varsayılan değer: DurableFunctionsHub. host.json'da durableTask:HubName kullanılarak da ayarlanabilir.
func durable raise-event --id 0ab8c55a66644d68a3a8b220b12d209c --event-name MyEvent --event-data @eventdata.json
func durable raise-event --id 1234567 --event-name MyOtherEvent --event-data 3

Düzenlemenin tamamlanmasını bekleyin

Uzun süre çalışan düzenlemelerde beklemek ve bir düzenlemenin sonuçlarını almak isteyebilirsiniz. Bu gibi durumlarda, düzenlemede bir zaman aşımı süresi tanımlayabilmek de yararlıdır. Zaman aşımı aşılırsa, sonuçlar yerine düzenlemenin durumu döndürülmelidir.

Bir düzenleme örneğinden gerçek çıkışı zaman uyumlu bir şekilde almak için "tamamlanmasını bekleyin veya denetim durumu yanıtı oluşturun" API'sini kullanabilirsiniz. Varsayılan olarak, bu yöntemin varsayılan zaman aşımı 10 saniye ve yoklama aralığı 1 saniyedir.

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));
        }
    }
}

İşlevi aşağıdaki satırla çağırın. Zaman aşımı için 2 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"

Not

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 2 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}"
}

Not

Web kancası URL'lerinin biçimi, çalıştırdığınız Azure İşlevleri konağın sürümüne bağlı olarak farklılık gösterebilir. Yukarıdaki örnek Azure İşlevleri 3.0 konağı içindir.

HTTP yönetimi web kancası URL'lerini alma

Olayları izlemek veya bir düzenlemeye yükseltmek için bir dış sistem kullanabilirsiniz. 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 Dayanıklı İşlevler ile iletişim kurabilir. Web kancası URL'lerine alternatif olarak düzenleme istemci bağlaması kullanılarak program aracılığıyla erişilebilir. Özellikle, oluşturma HTTP yönetimi yük API'si, bu web kancası URL'lerini içeren serileştirilebilir bir nesne almak için kullanılabilir.

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: Düzenlemenin örnek kimliği (girişle InstanceId aynı olmalıdır).
  • StatusQueryGetUri: Düzenleme örneğinin durum URL'si.
  • SendEventPostUri: Düzenleme örneğinin "raise event" URL'si.
  • TerminatePostUri: Düzenleme örneğinin "terminate" URL'si.
  • PurgeHistoryDeleteUri: Düzenleme örneğinin "temizleme geçmişi" URL'si.
  • suspendPostUri: Düzenleme örneğinin "askıya alma" URL'si.
  • resumePostUri: Düzenleme örneğinin "özgeçmiş" 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önderebilir:

[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 };
}

Not

Önceki C# kodu Dayanıklı İşlevler 2.x içindir. Dayanıklı İşlevler 1.x için yerine DurableActivityContextIDurableActivityContextözniteliğini DurableClientOrchestrationClient kullanmanız ve yerine parametre türünü IDurableOrchestrationClientkullanmanız DurableOrchestrationClient gerekir. Sürümler arasındaki farklar hakkında daha fazla bilgi için Dayanıklı İşlevler sürümleri makalesine bakın.

Geri sarma örnekleri (önizleme)

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.

Not

Bu API, doğru hata işleme ve yeniden deneme ilkelerinin yerini alacak şekilde tasarlanmamıştır. Bunun yerine, yalnızca düzenleme örneklerinin beklenmeyen nedenlerle başarısız olduğu durumlarda kullanılması amaçlanmıştır. (örneğin, Running, , Pending, CompletedTerminated) dışındaki Failed durumlardaki düzenleme işlemleri "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 Yeniden Çalışıyor durumuna getirmek için düzenleme istemci bağlamasının (.NET) veya rewind (JavaScript) yöntemini kullanın. Bu yöntem, düzenleme hatasına neden olan etkinlik veya alt düzenleme 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. Birine onayının gerektiğini bildiren ve gerçek zamanlı yanıtı bekleyen bir dizi etkinlik işlevi olduğunu varsayalım. Tüm onay etkinlikleri yanıt aldıktan veya zaman aşımına uğradıktan sonra, geçersiz veritabanı bağlantı dizesi gibi bir uygulama yanlış yapılandırması nedeniyle başka bir etkinliğin başarısız olduğunu varsayalım. Sonuç, iş akışının derinliklerine doğru bir düzenleme 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 sarabilir. İnsan etkileşimi adımlarının hiçbirinin yeniden onaylanması gerekmez ve düzenleme artık başarıyla tamamlanabilir.

Not

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);
}

Not

Önceki C# kodu Dayanıklı İşlevler 2.x içindir. Dayanıklı İşlevler 1.x için özniteliği OrchestrationClient yerine DurableClient özniteliğini ve yerine IDurableOrchestrationClientparametre türünü kullanmanız DurableOrchestrationClient gerekir. Sürümler arasındaki farklar hakkında daha fazla bilgi için Dayanıklı İşlevler sürümleri makalesine bakın.

Azure Functions Core Tools

Ayrıca, Core Tools'taki komutunu kullanarak bir düzenleme örneğini func durable rewind doğrudan geri sarabilirsiniz.

Not

Çekirdek Araçlar komutları şu anda yalnızca çalışma zamanı durumunu kalıcı hale getiren varsayılan Azure Depolama sağlayıcısı kullanılırken desteklenir.

durable rewind komutu aşağıdaki parametreleri alır:

  • id (gerekli): Düzenleme örneğinin kimliği.
  • reason (isteğe bağlı): Düzenleme örneğini geri sarma nedeni.
  • connection-string-setting(isteğe bağlı): Kullanılacak depolama bağlantı dizesi içeren uygulama ayarının adı. Varsayılan değer: AzureWebJobsStorage.
  • task-hub-name(isteğe bağlı): Kullanılacak Dayanıklı İşlevler görev hub'ının adı. Varsayılan olarak, host.json dosyasındaki görev hub'ı adı kullanılır.
func durable rewind --id 0ab8c55a66644d68a3a8b220b12d209c --reason "Orchestrator failed and needs to be revived."

Örnek geçmişini temizleme

Düzenlemeyle ilişkili tüm verileri kaldırmak için örnek geçmişini temizleyebilirsiniz. Örneğin, tamamlanmış bir örnekle ilişkili tüm depolama kaynaklarını silmek isteyebilirsiniz. Bunu yapmak için düzenleme istemcisi tarafından tanımlanan temizleme örneği API'sini kullanın.

Bu ilk örnekte tek bir düzenleme örneğinin nasıl temizlenir gösterilmektedir.

[FunctionName("PurgeInstanceHistory")]
public static Task Run(
    [DurableClient] IDurableOrchestrationClient client,
    [QueueTrigger("purge-queue")] string instanceId)
{
    return client.PurgeInstanceHistoryAsync(instanceId);
}

Sonraki örnekte, belirtilen zaman aralığından sonra tamamlanan tüm düzenleme örneklerinin geçmişini temizleyen zamanlayıcı ile tetiklenen bir işlev gösterilir. 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
        });
}

Not

Önceki C# kodu Dayanıklı İşlevler 2.x içindir. Dayanıklı İşlevler 1.x için özniteliği OrchestrationClient yerine DurableClient özniteliğini ve yerine IDurableOrchestrationClientparametre türünü kullanmanız DurableOrchestrationClient gerekir. Sürümler arasındaki farklar hakkında daha fazla bilgi için Dayanıklı İşlevler sürümleri makalesine bakın.

Not

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.

Azure Functions Core Tools

Core Tools'taki komutunu kullanarak bir düzenleme örneğinin func durable purge-history geçmişini temizleyebilirsiniz. Önceki bölümdeki ikinci C# örneğine benzer şekilde, belirtilen zaman aralığında oluşturulan tüm düzenleme örneklerinin geçmişini temizler. Temizlenir örnekleri çalışma zamanı durumuna göre daha fazla filtreleyebilirsiniz.

Not

Çekirdek Araçlar komutları şu anda yalnızca çalışma zamanı durumunu kalıcı hale getiren varsayılan Azure Depolama sağlayıcısı kullanılırken desteklenir.

Komutun durable purge-history çeşitli parametreleri vardır:

  • created-after (isteğe bağlı): Bu tarih/saat (UTC) tarihinden sonra oluşturulan örneklerin geçmişini temizleme. ISO 8601 biçimlendirilmiş tarih saat kabul edildi.
  • created-before (isteğe bağlı): Bu tarih/saat (UTC) tarihinden önce oluşturulan örneklerin geçmişini temizleme. ISO 8601 biçimlendirilmiş tarih saat kabul edildi.
  • runtime-status (isteğe bağlı): Belirli bir duruma sahip örneklerin geçmişini temizleme (örneğin, çalışıyor veya tamamlandı). Birden çok (boşlukla ayrılmış) durum sağlayabilir.
  • connection-string-setting(isteğe bağlı): Kullanılacak depolama bağlantı dizesi içeren uygulama ayarının adı. Varsayılan değer: AzureWebJobsStorage.
  • task-hub-name(isteğe bağlı): Kullanılacak Dayanıklı İşlevler görev hub'ının adı. Varsayılan olarak, host.json dosyasındaki görev hub'ı adı kullanılır.

Aşağıdaki komut, 14 Kasım 2021'den önce 19:35 'te (UTC) oluşturulan tüm başarısız örneklerin geçmişini siler.

func durable purge-history --created-before 2021-11-14T19:35:00.0000000Z --runtime-status failed

Görev hub'larını silme

func durable delete-task-hub Core Tools'daki komutunu kullanarak Azure depolama tabloları, kuyrukları ve blobları dahil olmak üzere belirli bir görev hub'ı ile ilişkili tüm depolama yapıtlarını silebilirsiniz.

Not

Çekirdek Araçlar komutları şu anda yalnızca çalışma zamanı durumunu kalıcı hale getiren varsayılan Azure Depolama sağlayıcısı kullanılırken desteklenir.

Komutun durable delete-task-hub iki parametresi vardır:

  • connection-string-setting(isteğe bağlı): Kullanılacak depolama bağlantı dizesi içeren uygulama ayarının adı. Varsayılan değer: AzureWebJobsStorage.
  • task-hub-name(isteğe bağlı): Kullanılacak Dayanıklı İşlevler görev hub'ının adı. Varsayılan olarak, host.json dosyasındaki görev hub'ı adı kullanılır.

Aşağıdaki komut, görev hub'ı ile UserTest ilişkili tüm Azure depolama verilerini siler.

func durable delete-task-hub --task-hub-name UserTest

Sonraki adımlar