Dayanıklı orkestrasyonlar

Dayanıklı düzenleme, tamamen kodda tanımlanan güvenilir, uzun süre çalışan bir iş akışında diğer işlevlerin yürütülmesini koordine etmek için bir orchestrator işlevi kullanır. Orchestrator işlevleri aşağıdaki özelliklere sahiptir:

  • yordam kodunu kullanarak iş akışlarını tanımlarlar. Bildirim temelli şemalar veya tasarımcılar gerekmez.
  • Diğer işlevleri zaman uyumlu ve zaman uyumsuz olarak çağırırlar. Çağrılan fonksiyonlardan çıkan çıktıyı yerel değişkenlere kaydedebilirsiniz.
  • Bunlar, fonksiyon bir await veya yield operatörünü çağırdığında yürütme ilerlemesini otomatik olarak denetim noktası olarak kaydeder; böylece süreç yeniden başlatıldığında veya VM yeniden önyüklendiğinde yerel durumunu kaybetmez.
  • Uzun süre çalışan işlemleri destekler. Düzenleme örneğinin toplam ömrü saniye, gün veya ay olabilir veya örneği hiç bitmeyecek şekilde yapılandırabilirsiniz.

Bu makalede, orkestrasyon kimliği, olay kaynağı kullanımı, yürütme geçmişi ve alt-orkestrasyonlar, dayanıklı zamanlayıcılar ve hata işleme gibi yaygın iş akışı desenleri dahil olmak üzere dayanıklı orkestrasyonlara genel bir bakış sağlanmaktadır.

Dayanıklı İşlevler uygulamasında kullanılabilen işlev türleri hakkında bilgi için bkz. Durable Task programlama modeli.

Tip

C#'ı .NET izole çalışan modeliyle kullanırsanız, fonksiyon tabanlı bir yaklaşım (öznitelikli [Function] statik yöntemler) veya sınıf tabanlı yaklaşım ('dan TaskOrchestrator<TInput, TOutput>miras alan sınıflar) kullanarak orkestrasyonlar yazabilirsiniz. Sınıf tabanlı yaklaşım , Microsoft.DurableTask.Generators kaynak oluşturucu paketini gerektirir ve kesin olarak belirlenmiş çağrılar sağlar. Daha fazla bilgi için bkz . Kaynak oluşturucular ve sınıf tabanlı söz dizimi. Bu makaledeki C# kod örnekleri her iki yaklaşımı da gösterir.

Dayanıklı Görev SDK'ları, paralel işleme ve olay odaklı koordinasyon ile güvenilir, uzun süre çalışan iş akışları oluşturmak için Dayanıklı İşlevler ile aynı düzenleyici özellikleri sağlar. Dayanıklı İşlevler'in aksine Dayanıklı Görev SDK'sı düzenlemeleri , Dayanıklı Görev Zamanlayıcı tarafından desteklenen tek başına uygulamalar olarak çalışır.

Orkestrasyon kimliği

Orkestrasyonun her örneğinde, örnek kimliği olarak da bilinen bir örnek kimliği vardır. Varsayılan olarak, her örnek kimliği otomatik olarak oluşturulan genel olarak benzersiz bir tanımlayıcıdır (GUID). Ancak, kullanıcı tarafından oluşturulan herhangi bir dizi değerini örnek kimliği olarak kullanabilirsiniz. Her düzenleme örneği kimliği bir görev hub'ı içinde benzersiz olmalıdır.

Aşağıdaki kurallar örnek kimlikleri için geçerlidir:

  • 1 ile 100 karakter arasında olmalıdır.
  • Onlar @ ile başlamamalıdır.
  • /, \, # veya ? karakterlerini içermemelidir.
  • Denetim karakterleri içermemelidir.

Uyarı

Mümkün olduğunda otomatik olarak oluşturulan örnek kimliklerini kullanın. Bir orkestrasyon örneği ile uygulamaya özgü harici bir varlık (örneğin satın alma siparişi veya belge) arasında bire bir eşleme bulunan senaryolarda, kullanıcı tarafından oluşturulan örnek kimliklerini kullanın.

Uyarı

Karakter kısıtlama kurallarının gerçek olarak uygulanması, uygulamanın kullandığı depolama sağlayıcısına bağlı olarak farklılık gösterebilir. Doğru davranışı ve uyumluluğu sağlamaya yardımcı olmak için önceki örnek kimliği kurallarını izleyin.

Düzenlemenin örnek kimliği, çoğu örnek yönetimi işlemi için gerekli bir parametredir. Örnek kimlikleri teşhis amaçları için de önemlidir. Örneğin, sorun giderme veya analiz amacıyla Application Insights'ta düzenleme izleme verilerini ararken bunları kullanırsınız. Bu nedenle, oluşturulan örnek kimliklerini daha sonra başvurmayı kolaylaştıran bir dış konuma (veritabanı veya uygulama günlükleri gibi) kaydedin.

Düzenlemenin örnek kimliği, çoğu örnek yönetimi işlemi için gerekli bir parametredir. Örnek kimlikleri tanılama için de önemlidir, bu nedenle oluşturulan örnek kimliklerini daha sonra başvurmayı kolaylaştıran bir dış konuma kaydedin(veritabanı veya uygulama günlükleri gibi).

Güvenilirlik

Orchestrator işlevleri, yürütme durumlarını güvenilir bir şekilde korumak için olay kaynağı tasarım desenini kullanır. Dayanıklı Görev Çerçevesi, bir orkestrasyonun mevcut durumunu doğrudan depolamak yerine, işlev orkestrasyonunun aldığı tüm eylemleri kaydetmek için yalnızca eklenebilir bir depo kullanır. Yalnızca ekleme deposu, tam çalışma zamanı durumunun dökümünü almayla karşılaştırıldığında birçok avantaja sahiptir. Avantajları arasında daha yüksek performans, ölçeklenebilirlik ve yanıt verme hızı yer alır. Ayrıca işlem verileri, tam denetim izleri ve geçmiş için nihai tutarlılık elde edersiniz. Denetim kayıtları güvenilir telafi eylemlerini destekler.

Dayanıklı Görev Çerçevesi, olay kaynağını saydam olarak kullanır. Arka planda bir düzenleyici işlevi C# dilinde await işlecini ve JavaScript ve Python'de yield işlecini kullanır. Bu operatörler, orkestratör iş parçacığı denetimini Durable Task Framework dağıtıcısına geri verir. Java'da, bir görevde .await() çağrılması, denetimi Throwable özel bir örneği aracılığıyla dağıtıcıya geri verir. Dağıtıcı daha sonra orchestrator işlevinin depolamak üzere planladığı tüm yeni eylemleri taahhüt eder. Eylemlere örnek olarak bir veya daha fazla alt işlevi çağırma veya dayanıklı zamanlayıcı ayarlama verilebilir. Şeffaf taahhüt işlemi, düzenleme örneğinin yürütme geçmişini, sadece ekleme esaslı bir günlük gibi çalışarak, tüm yeni olayları depolama alanına ekleyerek günceller. Benzer şekilde, commit işlemi gerçek işi planlamak için depolamada iletiler oluşturur. Bu noktada orchestrator işlevi bellekten kaldırılabilir.

varsayılan olarak, Dayanıklı İşlevler çalışma zamanı durum deposu olarak Azure Depolama kullanır, ancak diğer storage sağlayıcıları da desteklenir.

Düzenleme işlevinin daha fazla işi olduğunda (örneğin, bir yanıt iletisi alındığında veya dayanıklı bir süreölçer sona erdiğinde), düzenleyici uyanır ve tüm işlevi baştan yeniden yürüterek yerel durumu yeniden oluşturur. Tekrar yürütme sırasında, kod bir işlevi çağırmaya çalışırsa (veya başka bir zaman uyumsuz iş yaparsa), Durable Task Framework mevcut orkestrasyonun yürütme geçmişine danışır. Etkinliğin zaten yürütüldüğünü ve bir sonuç verdiğini bulursa, bu işlevin sonucunu yeniden yürütür ve düzenleyici kodu çalışmaya devam eder. Tekrarlama, işlev kodu tamamlanana veya yeni bir asenkron çalışma zamanlanana kadar devam eder.

Uyarı

Yeniden yürütme düzeninin doğru ve güvenilir bir şekilde çalışması için orchestrator işlev kodunun belirleyici olması gerekir. Belirsiz düzenleyici kodu çalışma zamanı hatalarına veya diğer beklenmeyen davranışlara neden olabilir. Orchestrator işlevleri için kod kısıtlamaları hakkında daha fazla bilgi için bkz . Orchestrator işlev kodu kısıtlamaları.

Uyarı

Bir orkestratör işlevi günlük iletileri yayıyorsa, tekrarlama davranışı yinelenen günlük iletilerinin üretilmesine neden olabilir. Bu davranışın neden oluştuğu ve bu davranışın nasıl çözümlendiği hakkında bilgi edinmek için bkz. Güvenli günlüğü yeniden yürütme.

Düzenleme geçmişi

Dayanıklı Görev Çerçevesi'nin olay kaynak oluşturma davranışı, yazdığınız orchestrator işlev koduyla yakından ilişkilidir. Aşağıdaki örnekte olduğu gibi bir etkinlik zincirleme düzenleyici işlevine sahip olduğunuzu varsayalım.

Yalıtılmış çalışan modeli
[Function("HelloCities")]
public static async Task<List<string>> Run(
    [OrchestrationTrigger] TaskOrchestrationContext context)
{
    var outputs = new List<string>();

    outputs.Add(await context.CallActivityAsync<string>("SayHello", "Tokyo"));
    outputs.Add(await context.CallActivityAsync<string>("SayHello", "Seattle"));
    outputs.Add(await context.CallActivityAsync<string>("SayHello", "London"));

    // Return ["Hello Tokyo!", "Hello Seattle!", "Hello London!"].
    return outputs;
}

Sınıf tabanlı model (yalıtılmış çalışan)

Sınıf tabanlı yaklaşım bir kaynak oluşturucu kullanır ve Microsoft.DurableTask.Generators NuGet paketini gerektirir.

using Microsoft.DurableTask;

[DurableTask]
public class HelloCities : TaskOrchestrator<object?, List<string>>
{
    public override async Task<List<string>> RunAsync(
        TaskOrchestrationContext context, object? input)
    {
        var outputs = new List<string>();

        outputs.Add(await context.CallActivityAsync<string>("SayHello", "Tokyo"));
        outputs.Add(await context.CallActivityAsync<string>("SayHello", "Seattle"));
        outputs.Add(await context.CallActivityAsync<string>("SayHello", "London"));

        // Return ["Hello Tokyo!", "Hello Seattle!", "Hello London!"].
        return outputs;
    }
}

İşlem içi model
[FunctionName("HelloCities")]
public static async Task<List<string>> Run(
    [OrchestrationTrigger] IDurableOrchestrationContext context)
{
    var outputs = new List<string>();

    outputs.Add(await context.CallActivityAsync<string>("SayHello", "Tokyo"));
    outputs.Add(await context.CallActivityAsync<string>("SayHello", "Seattle"));
    outputs.Add(await context.CallActivityAsync<string>("SayHello", "London"));

    // Return ["Hello Tokyo!", "Hello Seattle!", "Hello London!"].
    return outputs;
}
using Microsoft.DurableTask;

[DurableTask]
public class HelloCities : TaskOrchestrator<object?, List<string>>
{
    public override async Task<List<string>> RunAsync(TaskOrchestrationContext context, object? input)
    {
        var outputs = new List<string>();

        outputs.Add(await context.CallActivityAsync<string>("SayHello", "Tokyo"));
        outputs.Add(await context.CallActivityAsync<string>("SayHello", "Seattle"));
        outputs.Add(await context.CallActivityAsync<string>("SayHello", "London"));

        return outputs;
    }
}

Bir etkinlik fonksiyonu planladığınızda, Durable Task Framework fonksiyonun çalıştırma durumunu çeşitli kontrol noktalarında kaydeder. Her denetim noktasında, çerçeve durumu dayanıklı bir depolama arka ucuna kaydeder. Bu durum orkestrasyon tarihidir.

Geçmiş tablosu

Her kontrol noktasında, Dayanıklı Görev Çerçevesi aşağıdaki işlemleri gerçekleştirir:

  • Çalıştırma geçmişini kalıcı depolamaya kaydeder.
  • Orchestrator'ın çağırmak istediği işlevler için iletileri sıralar.
  • Dayanıklı zamanlayıcı iletileri gibi düzenleyicinin kendisi için iletileri sıralar.

Kontrol noktası bittiğinde, çerçeve orkestratör fonksiyonunu hafızadan çıkarır, ta ki daha fazla iş kalana kadar.

Uyarı

Azure Depolama, veri kaydederken tablo depolama ile kuyruklar arasındaki veri tutarlılığı konusunda işlem garantisi vermiyor. Hataları işlemek için Dayanıklı İşlevler Azure Depolama sağlayıcısı nihai tutarlılık desenlerini kullanır. Bu desenler, bir denetim noktasının ortasında kilitlenme veya bağlantı kaybı olması durumunda veri kaybı olmamasını sağlamaya yardımcı olur. Dayanıklı İşlevler Microsoft SQL Server (MSSQL) depolama sağlayıcısı gibi alternatif depolama sağlayıcıları daha güçlü tutarlılık garantileri sağlayabilir.

Daha önce gösterilen işlev tamamlandığında, geçmişi Tablo Depolama'daki aşağıdaki tabloda yer alan verilere benzer. Girdiler açıklama amacıyla kısaltılmıştır.

PartitionKey (InstanceId) EtkinlikTürü Zaman Damgası Giriş İsim Result Statü
eaee885b Çalıştırma Başlatıldı 2021-05-05T18:45:28.852Z sıfır HelloCities
eaee885b Orchestrator Başlatıldı 2021-05-05T18:45:32.362Z
eaee885b Görev Planlandı 2021-05-05T18:45:32.670Z SayHello
eaee885b OrkestratörTamamlandı 2021-05-05T18:45:32.670Z
eaee885b Görev Tamamlandı 2021-05-05T18:45:34.201Z """Merhaba Tokyo!"""
eaee885b Orchestrator Başlatıldı 2021-05-05T18:45:34.232Z
eaee885b Görev Planlandı 2021-05-05T18:45:34.435Z SayHello
eaee885b OrkestratörTamamlandı 2021-05-05T18:45:34.435Z
eaee885b Görev Tamamlandı 2021-05-05T18:45:34.763Z """Merhaba Seattle!"""
eaee885b Orchestrator Başlatıldı 2021-05-05T18:45:34.857Z
eaee885b Görev Planlandı 2021-05-05T18:45:34.857Z SayHello
eaee885b OrkestratörTamamlandı 2021-05-05T18:45:34.857Z
eaee885b Görev Tamamlandı 2021-05-05T18:45:34.919Z ""Merhaba Londra!"""
eaee885b Orchestrator Başlatıldı 2021-05-05T18:45:35.032Z
eaee885b OrkestratörTamamlandı 2021-05-05T18:45:35.044Z
eaee885b İşlemTamamlandı 2021-05-05T18:45:35.044Z "[""Hello Tokyo!"","Hello Seattle!"",""Hello London!""]" Tamamlandı

Tablo sütunları aşağıdaki değerleri içerir:

  • PartitionKey: Orkestrasyonun örnek kimliği.
  • EventType: Olayın türü. Tüm geçmiş olay türlerinin ayrıntılı açıklamaları için bkz. Durable Task Framework Geçmiş Olayları.
  • Zaman damgası: Tarihsel olayın Eşgüdümlü Evrensel Saat zaman damgası.
  • Giriş: İşlevin JSON biçimli girişi.
  • Ad: Çağrılan işlevin adı.
  • Sonuç: İşlevin çıkışı, özellikle de dönüş değeri.

Uyarı

Bu tablo hata ayıklama aracı olarak kullanışlıdır, ancak Dayanıklı İşlevler uzantısı geliştikçe biçimi ve içeriği değişebilir.

Bir görevin tamamlanmasını bekledikten sonra her işlev sürdürüldüğünde, Dayanıklı Görev Çerçevesi orkestratör işlevini baştan yeniden çalıştırır. Her yeniden çalıştırmada, şu anki zaman uyumsuz görevin tamamlanıp tamamlanmadığını belirlemek için yürütme geçmişine başvurur. Eğer yürütme geçmişi görevin zaten tamamlandığını gösteriyorsa, platform bu görevin çıkışını yineleyerek sonraki göreve geçer. Bu işlem, yürütme geçmişinin tamamı yeniden oynatılana kadar devam eder. Geçerli yürütme geçmişi yeniden yürütüldükten sonra yerel değişkenler önceki değerlerine geri yüklenir.

Özellikler ve desenler

Aşağıdaki bölümlerde orchestrator işlevlerinin özellikleri ve desenleri açıklanmaktadır.

Orchestrator işlevlerindeki alt orkestrasyonlar

Orkestratör fonksiyonları etkinlik fonksiyonlarını çağırabilir, ancak diğer orkestratör fonksiyonlarını da çağırabilirler. Örneğin, bir orkestratör işlevleri kitaplığından daha büyük bir orkestrasyon oluşturabilirsiniz. Alternatif olarak, bir orchestrator işlevinin birden çok örneğini paralel olarak çalıştırabilirsiniz.

Daha fazla bilgi ve örnekler için Dayanıklı İşlevler (Azure İşlevleri) içindeki alt düzenlemelere bakın.

Dayanıklı zamanlayıcılar

Orkestrasyonlar, gecikmeleri uygulamak veya eşzamansız işlemlerde zaman aşımı işlemeyi yapılandırmak için dayanıklı zamanlayıcılar zamanlayabilir. Dilde yerel sleep API'ler yerine düzenleyici işlevlerinde dayanıklı zamanlayıcılar kullanın.

Daha fazla bilgi ve örnekler için bkz . Dayanıklı İşlevlerde Zamanlayıcılar (Azure İşlevleri).

Dış olaylar

Orchestrator işlevleri, dış olayların bir düzenleme örneğini güncelleştirmesini bekleyebilir. Bu Dayanıklı İşlevler özelliği genellikle insan etkileşimlerini veya diğer dış geri çağırmaları işlemek için kullanışlıdır.

Daha fazla bilgi ve örnekler için bkz. Dayanıklı İşlevler (Azure İşlevleri)'da dış olayları işleme.

Hata yönetimi

Orchestrator işlevleri, programlama dilinin hata işleme özelliklerini kullanabilir. Orkestrasyon kodu, mevcut kalıpları destekler.try/catch

Orchestrator işlevleri, çağırdıkları etkinlik veya alt düzenleyici işlevlerine yeniden deneme ilkeleri de ekleyebilir. Bir etkinlik veya alt düzenleyici işlevi özel durumla başarısız olursa, belirtilen yeniden deneme ilkesi yürütmeyi otomatik olarak geciktirebilir ve belirtilen sayıda yeniden deneyebilir.

Uyarı

Orchestrator işlevinde işlenmeyen bir özel durum varsa, orkestrasyon örneği bir Failed durumunda tamamlanır. Bir orkestrasyon örneği başarısız olduktan sonra tekrar deneyemezsiniz.

Daha fazla bilgi ve örnekler için bkz. Dayanıklı İşlevler (Azure İşlevleri)'da işleme hataları.

Kritik bölümler (Dayanıklı İşlevler 2.x)

Orkestrasyon örnekleri tek iş parçacıklı olduğundan, yarış koşulları bir orkestrasyon içinde bir sorun teşkil etmez. Ancak, düzenleme işlemleri dış sistemlerle etkileşime geçtiğinde yarış koşulları mümkündür. Dış sistemlerle etkileşimde yarış koşullarını azaltmak için, orkestratör fonksiyonları kritik bölümleri bir kilit kullanarak tanımlayabilir. .NET ve JavaScript kritik bölümleri destekler.

Aşağıdaki örnek kod, kritik bir bölümü tanımlayan bir orchestrator işlevini gösterir. Kritik bölüme girmek, kilit durumunu kalıcı olarak yöneten bir kalıcı varlığa yönelik bir veya daha fazla referans iletmeyi gerektirir. Bu düzenlemenin yalnızca tek bir örneği, kodu kritik bölümde aynı anda yürütebilir.

Kritik bölüme girmek için bu LockAsync yöntemi kullanın.

[FunctionName("Synchronize")]
public static async Task Synchronize(
    [OrchestrationTrigger] IDurableOrchestrationContext context)
{
    var lockId = new EntityId("LockEntity", "MyLockIdentifier");
    using (await context.LockAsync(lockId))
    {
        // Critical section. Only one orchestration can enter at a time.
    }
}

.NET yalıtılmış çalışan düzenlemelerinde TaskOrchestrationContext.Entities.LockEntitiesAsync kullanın (bkz. .NET yalıtılmış API eşlemesi).

LockAsync yöntemi dayanıklı kilitleri alır ve serbest bırakıldığında kritik bölümü sonlandıran bir IDisposable nesnesi döndürür. Bu IDisposable sonuç, kritik bölümün sentaktik bir gösterimini elde etmek için bir using blokla birlikte kullanılabilir. Düzenleyici işlevi kritik bir bölüme girdiğinde, bu kod bloğunu yalnızca bir örnek yürütebilir. Kritik bölüme girmeye çalışan diğer tüm örnekler, önceki örnek kritik bölümden çıkana kadar engellenir.

Kritik bölüm özelliği, dayanıklı varlıklardaki değişiklikleri koordine etmek için de kullanışlıdır. Kritik bölümler hakkında daha fazla bilgi için bkz. Varlık koordinasyonu.

Uyarı

Kritik bölümler, .NET ve JavaScript orkestrasyonları için Dayanıklı İşlevler 2.x içinde mevcuttur. .NET için API modele göre farklılık gösterir: işlem içi IDurableOrchestrationContext.LockAsync kullanırken, yalıtılmış model TaskOrchestrationContext.Entities.LockEntitiesAsync kullanır.

HTTP uç noktalarına yapılan çağrılar (Dayanıklı İşlevler 2.x)

Orkestratör fonksiyonları, Orchestrator fonksiyon kod kısıtlamalarında açıklandığı gibi G/O işlemlerini gerçekleştiremez. Bu sınırlamayı aşmak için, I/O işlemlerini gerçekleştirmesi gereken herhangi bir kodu bir etkinlik fonksiyonuna sarın. Dış sistemlerle etkileşim kuran düzenlemelerde http çağrıları yapmak ve sonuçları düzenlemeye döndürmek için etkinlik işlevleri sıklıkla kullanılır.

Orchestrator işlevleri, bu yaygın düzeni kolaylaştırmak için CallHttpAsync yöntemini kullanarak HTTP API'lerini doğrudan çağırabilir.

Yalıtılmış çalışan modeli
[Function("CheckSiteAvailable")]
public static async Task CheckSiteAvailable(
    [OrchestrationTrigger] TaskOrchestrationContext context)
{
    Uri url = context.GetInput<Uri>();

    // Make an HTTP GET request to the specified endpoint.
    DurableHttpResponse response = await context.CallHttpAsync(
        method: HttpMethod.Get,
        uri: url,
        content: null,
        retryOptions: null);

    if ((int)response.StatusCode == 400)
    {
        // Handle error codes.
    }
}

İşlem içi model
[FunctionName("CheckSiteAvailable")]
public static async Task CheckSiteAvailable(
    [OrchestrationTrigger] IDurableOrchestrationContext context)
{
    Uri url = context.GetInput<Uri>();

    // Make an HTTP GET request to the specified endpoint.
    DurableHttpResponse response = 
        await context.CallHttpAsync(HttpMethod.Get, url);

    if ((int)response.StatusCode == 400)
    {
        // Handle error codes.
    }
}

Temel istek ve yanıt kalıplarını desteklemekten, yöntem yaygın asenkron HTTP 202 anket desenlerinin otomatik işlenmesini de destekler. Ayrıca , yönetilen kimlikleri kullanarak dış hizmetlerle kimlik doğrulamayı destekler.

Daha fazla bilgi ve ayrıntılı örnekler için bkz. HTTP özellikleri.

Uyarı

HTTP uç noktalarını doğrudan orchestrator işlevlerinden çağırmak Dayanıklı İşlevler 2.0 ve sonraki sürümlerde kullanılabilir.

Etkinlik işlevlerine birden çok parametre geçirme

Birden fazla parametreyi doğrudan bir etkinlik fonksiyonuna iletemezsiniz. Bunun yerine bir nesne veya bileşik nesnelerden oluşan bir dizi iletin.

Yalıtılmış çalışan modeli

.NET'te, birden çok parametre geçirmek için kayıt gibi serileştirilebilir bir bileşik tür kullanın.

public record CourseInfo(string Major, int UniversityYear);

[Function("GetCourseRecommendations")]
public static async Task<object> RunOrchestrator(
    [OrchestrationTrigger] TaskOrchestrationContext context)
{
    int universityYear = context.GetInput<int>();
    CourseInfo courseInfo = new("ComputerScience", universityYear);
    object courseRecommendations = await context.CallActivityAsync<object>(
        "CourseRecommendations", courseInfo);
    return courseRecommendations;
}

İşlem içi model

.NET'te birden çok parametre geçirmek için serileştirilebilir bileşik tür kullanın. Aşağıdaki örnek basit bir sınıf kullanır:

public class CourseInfo
{
    public string Major { get; set; }
    public int UniversityYear { get; set; }
}

[FunctionName("GetCourseRecommendations")]
public static async Task<object> RunOrchestrator(
    [OrchestrationTrigger] IDurableOrchestrationContext context)
{
    var input = new CourseInfo
    {
        Major = "ComputerScience",
        UniversityYear = context.GetInput<int>()
    };

    object courseRecommendations = await context.CallActivityAsync<object>(
        "CourseRecommendations",
        input);
    return courseRecommendations;
}

.NET'te, birden fazla parametreyi tek bir bileşik nesne olarak geçirmek için kayıt türleri veya tuplelar kullanın.

using Microsoft.DurableTask;

public record LocationInfo(string City, string State);

[DurableTask]
public class GetWeatherOrchestration : TaskOrchestrator<object?, string>
{
    public override async Task<string> RunAsync(TaskOrchestrationContext context, object? input)
    {
        var location = new LocationInfo("Seattle", "WA");
        string weather = await context.CallActivityAsync<string>("GetWeather", location);
        return weather;
    }
}

Sonraki Adımlar