Aracılığıyla paylaş


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

Dayanıklı İşlevler'deki düzenleme işlemleri, 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. Örneklere dış olaylar gönderme, örnek geçmişini temizleme vb. gibi çeşitli örnek yönetimi API'leri Dayanıklı İşlevler düzenleme istemci bağlaması tarafından da 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: 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.

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

Uyarı

Önceki C# kodu Dayanıklı İşlevler 2.x içindir. Dayanıklı İşlevler 1.x için OrchestrationClient özniteliği yerine DurableClient özniteliğini ve DurableOrchestrationClient yerine IDurableOrchestrationClient parametre türünü kullanmanız 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 Çekirdek Araçlar

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, @ gibi bir ön eki dosya yoluna @path/to/file.json 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ı dizesini içeren uygulama ayarının adı. Varsayılan değer AzureWebJobsStorage'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.

Uyarı

Temel Araçlar komutları, bunları bir işlev uygulamasının kök dizininden çalıştırdığınızı varsayar. Eğer connection-string-setting ve task-hub-name parametrelerini açıkça sağlarsanız, 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.

Uyarı

Ç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 desteklenmektedir.

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:

  • İsim: Orchestrator fonksiyonunun adı.
  • InstanceId: Koordine işleminin örnek ID'si (girişle instanceId aynı olmalıdır).
  • CreatedTime: Orchestrator işlevinin çalışmaya başladığı saat.
  • LastUpdatedTime: Orkestrasyonun son kontrol noktasına kaydedildiği 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ı: Örneklem askıya alındı ve daha sonra devam edebilir.
  • Geçmiş: Orkestrasyonun yürütme geçmişi. Bu alan yalnızca showHistorytrue olarak ayarlandıysa doldurulur.

Uyarı

Bir düzenleyici, zamanlanmış tüm görevleri tamamlanıp düzenleyici döndükten ve sonra Completed olarak işaretlenmez. Başka bir deyişle, bir düzenleyicinin return deyimine ulaşması, onun Completed olarak işaretlenmesi için yeterli değildir. Bu, özellikle WhenAny kullanıldığında geçerlidir; bu düzenleyiciler genellikle zamanlanmış tüm görevler tamamlanmadan önce return.

Bu yöntem, örnek yoksa null (.NET ve Java), undefined (JavaScript) veya 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 Dayanıklı İşlevler 2.x içindir. Dayanıklı İşlevler 1.x için OrchestrationClient özniteliği yerine DurableClient özniteliğini ve DurableOrchestrationClient yerine IDurableOrchestrationClient parametre türünü kullanmanız 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 Çekirdek Araçlar

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.

Uyarı

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ı dizesini 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 içinde, 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. func komutunu işlev uygulamasının kök dizininden çalıştırdığınız 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ı dizesini 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.jsoniçinde 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.
}

Uyarı

Önceki C# kodu Dayanıklı İşlevler 2.x içindir. Dayanıklı İşlevler 1.x için OrchestrationClient özniteliği yerine DurableClient özniteliğini ve DurableOrchestrationClient yerine IDurableOrchestrationClient parametre türünü kullanmanız 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 Çekirdek Araçlar

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

Uyarı

Ç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 desteklenmektedir.

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

  • top (isteğe bağlı): Bu komut sayfalama desteği sağlar. 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ı dizesini 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 içinde ayarlamak için durableTask:HubName kullanılabilir.
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));
    }
}

Uyarı

Önceki C# kodu Dayanıklı İşlevler 2.x içindir. Dayanıklı İşlevler 1.x için OrchestrationClient özniteliği yerine DurableClient özniteliğini ve DurableOrchestrationClient yerine IDurableOrchestrationClient parametre türünü kullanmanız 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 Çekirdek Araçlar

Azure İşlevleri Temel Araçları'nda, komutunu filtrelerle de kullanabilirsiniz durable 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.

Uyarı

Ç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 desteklenmektedir.

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çiminde tarih ve saatler kabul edilir.
  • created-before (isteğe bağlı): Bu tarih/saat (UTC) tarihinden önce oluşturulan örnekleri alın. ISO 8601 formatında tarih saatleri kabul edilir.
  • 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ı dizesini 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 içinde, durableTask:HubName kullanılarak da ayarlanabilir.

Herhangi bir filtre (created-after, created-before veya runtime-status) sağlamazsanız, komut, çalışma zamanı durumu veya oluşturma zamanını dikkate almadan top örneklerini alır.

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

Uyarı

Önceki C# kodu Dayanıklı İşlevler 2.x içindir. Dayanıklı İşlevler 1.x için OrchestrationClient özniteliği yerine DurableClient özniteliğini ve DurableOrchestrationClient yerine IDurableOrchestrationClient parametre türünü kullanmanız 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ılmış bir örnek sonunda Terminated durumuna geçecektir. Ancak, bu geçiş hemen gerçekleşmez. Ancak sonlandırma işlemi, bu örnek için diğer tüm işlemler ile birlikte görev hub'ında kuyruğa alınacaktı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, onu çağıran orkestrasyon örneğini sonlandırmış olsanız da olmasanız da tamamlanmaya kadar çalışır.

Örnekleri askıya alma ve devam ettirme

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

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

Askıya alınan bir örnek sonunda Suspended durumuna geçiş 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şlemlerle birlikte 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 orchestrator sürdürüldüğünde, durumu Running olarak değişir.

Azure Functions Çekirdek Araçlar

Ayrıca, Core Tools'taki func durable terminate komutu kullanarak bir orkestrasyon örneğini doğrudan sonlandırabilirsiniz.

Uyarı

Ç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 desteklenmektedir.

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

  • id (gerekli): Sonlandırılacak orkestrasyon örneğinin ID'si.
  • reason (isteğe bağlı): Sonlandırma nedeni.
  • connection-string-setting (isteğe bağlı): Kullanılacak depolama bağlantı dizesini 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 içinde 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"

Olayları örneklere 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 istemcisininraise 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ı 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 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 Dayanıklı İşlevler 2.x içindir. Dayanıklı İşlevler 1.x için OrchestrationClient özniteliği yerine DurableClient özniteliğini ve DurableOrchestrationClient yerine IDurableOrchestrationClient parametre türünü kullanmanız gerekir. Sürümler arasındaki farklar hakkında daha fazla bilgi için Dayanıklı İşlevler sürümleri makalesine bakın.

Uyarı

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 Çekirdek Araçlar

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

Uyarı

Ç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 desteklenmektedir.

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ı dizesini 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 içinde ayarlamak için durableTask:HubName kullanılabilir.
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üreli orkestrasyonlarda beklemek ve bir orkestrasyonun 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 orkestrasyonun durumu döndürülmelidir.

Bir düzenleme örneğinden gerçek çıktıyı zaman uyumlu olarak 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"

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

Uyarı

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

HTTP yönetim webhook URL'lerini alma

Olayları izlemek veya bir düzenlemeye yükseltmek için bir dış sistem kullanabilirsiniz. Dış sistemler, HTTP API URL'si 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, HTTP yönetim yükünü oluşturma API'si, bu web kancası URL'lerini içeren serileştirilebilir bir nesne elde etmek için kullanılabilir.

HTTP yönetimi yük oluşturma API'sinin bir parametresi vardır:

  • Instance ID: Örneklemin benzersiz ID'si.

Yöntemler, aşağıdaki dize özelliklerine sahip bir nesne döndürür:

  • Kimlik: Orkestrasyonun örnek kimliği (girişle InstanceId aynı 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 etme" 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 };
}

Uyarı

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

Geri alma örnek (ö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 .

Uyarı

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. Failed dışındaki (örneğin, Running, Pending, Terminated, Completed) durumlardaki orkestrasyonlar "geri alınamaz". Hata işleme ve yeniden deneme ilkeleri hakkında daha fazla bilgi için Hata işleme makalesine bakın.

RewindAsync (.NET) veya rewind (JavaScript) yöntemini kullanarak orkestrasyon istemci bağlaması yöntemini çalışır duruma getirin. 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 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 sarabilir. İ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 Dayanıklı İşlevler 2.x içindir. Dayanıklı İşlevler 1.x için OrchestrationClient özniteliği yerine DurableClient özniteliğini ve DurableOrchestrationClient yerine IDurableOrchestrationClient parametre türünü kullanmanız 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 Çekirdek Araçlar

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

Uyarı

Ç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 desteklenmektedir.

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ı dizesini 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

Orkestrasyon ile ilişkili tüm verileri kaldırmak için örnek geçmişini silebilirsiniz. Ö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 örnek, tek bir orkestrasyon örneğinin nasıl temizleneceğini göstermektedir.

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

Uyarı

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

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.

Azure Functions Çekirdek Araçlar

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. Temizlenmiş örnekleri çalışma zamanı durumuna göre filtreleyerek daha fazla daraltabilirsiniz.

Uyarı

Ç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 desteklenmektedir.

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 formatında tarih saatleri kabul edilir.
  • created-before (isteğe bağlı): Bu tarih/saat (UTC) tarihinden önce oluşturulan örneklerin geçmişini temizleme. ISO 8601 formatında tarih saatleri kabul edilir.
  • 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ı dizesini 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.

Uyarı

Ç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 desteklenmektedir.

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

  • connection-string-setting (isteğe bağlı): Kullanılacak depolama bağlantı dizesini 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