Share via


Dayanıklı düzenleme

Dayanıklı İşlevler, Azure İşlevleri uzantısıdır. Bir işlev uygulamasındaki diğer Dayanıklı işlevlerin yürütülmesini yönetmek için bir orchestrator işlevi kullanabilirsiniz. Orchestrator işlevleri aşağıdaki özelliklere sahiptir:

  • Orchestrator işlevleri yordam kodunu kullanarak işlev iş akışlarını tanımlar. Bildirim temelli şemalar veya tasarımcılar gerekmez.
  • Orchestrator işlevleri diğer dayanıklı işlevleri zaman uyumlu ve zaman uyumsuz olarak çağırabilir. Çağrılan işlevlerden gelen çıkışlar yerel değişkenlere güvenilir bir şekilde kaydedilebilir.
  • Orchestrator işlevleri dayanıklı ve güvenilirdir. "Awaits" veya "yields" işlevi olduğunda yürütme ilerleme durumu otomatik olarak denetlenir. İşlem geri dönüşüme geçtiğinde veya VM yeniden başlatıldığında yerel durum hiçbir zaman kaybolmaz.
  • Orchestrator işlevleri uzun süre çalışıyor olabilir. Düzenleme örneğinin toplam ömrü saniye, gün, ay veya hiç bitmeyen olabilir.

Bu makale, düzenleyici işlevlerine ve çeşitli uygulama geliştirme zorluklarını çözmenize nasıl yardımcı olabileceklerine yönelik bir genel bakış sunar. bir Dayanıklı İşlevler uygulamasında kullanılabilen işlev türleri hakkında bilgi sahibi değilseniz, önce Dayanıklı İşlev türleri makalesini okuyun.

Düzenleme kimliği

Düzenlemenin her örneğinde bir örnek tanımlayıcısı (örnek kimliği olarak da bilinir) vardır. Varsayılan olarak, her örnek kimliği otomatik olarak oluşturulan bir GUID'dir. Ancak örnek kimlikleri, kullanıcı tarafından oluşturulan herhangi bir dize değeri de olabilir. Her düzenleme örneği kimliği bir görev hub'ı içinde benzersiz olmalıdır.

Örnek kimlikleriyle ilgili bazı kurallar aşağıdadır:

  • Örnek kimlikleri 1 ile 100 karakter arasında olmalıdır.
  • Örnek kimlikleri ile @başlamamalıdır.
  • Örnek kimlikleri , , \#veya ? karakter içermemelidir/.
  • Örnek kimlikleri denetim karakterleri içermemelidir.

Not

Genellikle mümkün olduğunda otomatik olarak oluşturulan örnek kimliklerinin kullanılması önerilir. Kullanıcı tarafından oluşturulan örnek kimlikleri, bir düzenleme örneği ile satın alma siparişi veya belge gibi bir dış uygulamaya özgü varlık arasında bire bir eşlemenin olduğu senaryolara yöneliktir.

Ayrıca, karakter kısıtlama kurallarının gerçek olarak uygulanması, uygulama tarafından kullanılan depolama sağlayıcısına bağlı olarak değişebilir. Doğru davranışı ve uyumluluğu sağlamak için, daha önce listelenen örnek kimliği kurallarına uymanız kesinlikle önerilir.

Düzenlemenin örnek kimliği, çoğu örnek yönetimi işlemi için gerekli bir parametredir. Bunlar, sorun giderme veya analiz amacıyla Uygulama Analizler'nde düzenleme izleme verileri arasında arama yapma gibi tanılamalar için de önemlidir. Bu nedenle, oluşturulan örnek kimliklerinin daha sonra kolayca başvurulabilecekleri bir dış konuma (örneğin, bir veritabanı veya uygulama günlüklerinde) kaydedilmesi önerilir.

Güvenilirlik

Orchestrator işlevleri, olay kaynak oluşturma tasarım desenini kullanarak yürütme durumlarını güvenilir bir şekilde korur. Dayanıklı Görev Çerçevesi, bir düzenlemenin geçerli durumunu doğrudan depolamak yerine, işlev düzenlemesinin gerçekleştirilir eylemlerin tamamını kaydetmek için yalnızca ekleme deposu kullanır. Yalnızca ekleme deposu, tam çalışma zamanı durumunun "dökümünü alma" ile 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 için nihai tutarlılık ile tam denetim izleri ve geçmişi elde edersiniz. Denetim kayıtları güvenilir telafi eylemlerini destekler.

Dayanıklı İşlevler saydam olarak olay kaynağını kullanır. Arka planda, bir düzenleyici işlevindeki await (C#) veya yield (JavaScript/Python) işleci orchestrator iş parçacığının denetimini Dayanıklı Görev Çerçevesi dağıtıcısına geri verir. Java söz konusu olduğunda özel bir dil anahtar sözcüğü yoktur. Bunun yerine, bir görevde çağrılması .await() denetimi özel Throwablebir aracılığıyla dağıtıcıya geri getirir. Dağıtıcı daha sonra orchestrator işlevinin zamanlandığı tüm yeni eylemleri (bir veya daha fazla alt işlevi çağırmak veya dayanıklı bir zamanlayıcı zamanlamak gibi) depolamaya işler. Saydam işleme eylemi, yalnızca ekleme günlüğü gibi tüm yeni olayları depolama alanına ekleyerek düzenleme örneğinin yürütme geçmişini güncelleştirir. Benzer şekilde, işleme eylemi gerçek çalışmayı zamanlamak 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 depolama sağlayıcıları da desteklenir.

Düzenleme işlevine daha fazla iş verildiğinde (ö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. Yeniden yürütme sırasında, kod bir işlevi çağırmaya (veya başka bir zaman uyumsuz iş yapmaya) çalışırsa, Dayanıklı Görev Çerçevesi geçerli düzenlemenin yürütme geçmişine danışır. Etkinlik işlevinin zaten yürütüldüğünü ve bir sonuç verdiğini bulursa, işlevin sonucunu yeniden yürütür ve düzenleyici kodu çalışmaya devam eder. yeniden yürütme, işlev kodu tamamlanana kadar veya yeni zaman uyumsuz çalışma zamanlayana kadar devam eder.

Not

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

Not

Düzenleyici işlevi günlük iletileri yayıyorsa, yeniden yürütme davranışı yinelenen günlük iletilerinin gösterilmesine neden olabilir. Bu davranışın neden oluştuğu ve bu davranışı nasıl düzeltebileceğiniz hakkında daha fazla bilgi edinmek için Günlüğe Kaydetme konusuna bakın.

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 orchestrator işlevi gibi bir etkinlik zincirleme düzenleyici işlevine sahip olduğunuzu varsayalım:

Not

Azure İşlevleri için Node.js programlama modelinin 4. sürümü genel olarak kullanılabilir. Yeni v4 modeli, JavaScript ve TypeScript geliştiricileri için daha esnek ve sezgisel bir deneyime sahip olacak şekilde tasarlanmıştır. Geçiş kılavuzunda v3 ve v4 arasındaki farklar hakkında daha fazla bilgi edinin.

Aşağıdaki kod parçacıklarında JavaScript (PM4), yeni deneyim olan programlama modeli V4'i belirtir.

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

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

Bir etkinlik işlevi zamanlandığında, Dayanıklı Görev Çerçevesi işlevin yürütme durumunu bazı dayanıklı depolama arka ucuna (varsayılan olarak Azure Tablo depolaması) denetler. Bu durum, düzenleme geçmişi olarak adlandırılan durumdur.

Geçmiş tablosu

Genel olarak, Dayanıklı Görev Çerçevesi her denetim noktasında aşağıdakileri yapar:

  1. Yürütme geçmişini dayanıklı depolama alanına kaydeder.
  2. Orchestrator'ın çağırmak istediği işlevler için iletileri sıralar.
  3. Düzenleyicinin kendisi için iletileri (örneğin, dayanıklı zamanlayıcı iletileri) sıralar.

Denetim noktası tamamlandıktan sonra, orchestrator işlevinin daha fazla çalışması olana kadar bellekten kaldırılması serbesttir.

Not

Azure Depolama, verileri tablo depolama alanına ve kuyruklara kaydetme arasında işlem garantisi sağlamaz. 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ğlar. Dayanıklı İşlevler MSSQL depolama sağlayıcısı gibi alternatif depolama sağlayıcıları daha güçlü tutarlılık garantileri sağlayabilir.

Tamamlandıktan sonra, daha önce gösterilen işlevin geçmişi Azure Tablo Depolama'nde aşağıdaki tabloya benzer (çizim amacıyla kısaltılır):

PartitionKey (InstanceId) EventType Zaman damgası Girdi Veri Akışı Adı Sonuç Durum
eaee885b ExecutionStarted 2021-05-05T18:45:28.852Z boş HelloCities
eaee885b OrchestratorStarted 2021-05-05T18:45:32.362Z
eaee885b Görev Zamanlandı 2021-05-05T18:45:32.670Z SayHello
eaee885b OrchestratorCompleted 2021-05-05T18:45:32.670Z
eaee885b Görev Tamamlandı 2021-05-05T18:45:34.201Z """Hello Tokyo!"""
eaee885b OrchestratorStarted 2021-05-05T18:45:34.232Z
eaee885b Görev Zamanlandı 2021-05-05T18:45:34.435Z SayHello
eaee885b OrchestratorCompleted 2021-05-05T18:45:34.435Z
eaee885b Görev Tamamlandı 2021-05-05T18:45:34.763Z """Hello Seattle!"""
eaee885b OrchestratorStarted 2021-05-05T18:45:34.857Z
eaee885b Görev Zamanlandı 2021-05-05T18:45:34.857Z SayHello
eaee885b OrchestratorCompleted 2021-05-05T18:45:34.857Z
eaee885b Görev Tamamlandı 2021-05-05T18:45:34.919Z ""Merhaba Londra!"""
eaee885b OrchestratorStarted 2021-05-05T18:45:35.032Z
eaee885b OrchestratorCompleted 2021-05-05T18:45:35.044Z
eaee885b ExecutionCompleted 2021-05-05T18:45:35.044Z "[""Hello Tokyo!"","Hello Seattle!"",""Hello London!""]" Tamamlandı

Sütun değerleriyle ilgili birkaç not:

  • PartitionKey: Düzenlemenin örnek kimliğini içerir.
  • EventType: Olayın türünü temsil eder. Tüm geçmiş olay türlerinin ayrıntılı açıklamalarını burada bulabilirsiniz.
  • Zaman damgası: Geçmiş olayının UTC zaman damgası.
  • Ad: Çağrılan işlevin adı.
  • Giriş: İşlevin JSON biçimli girişi.
  • Sonuç: İşlevin çıkışı; yani dönüş değeri.

Uyarı

Hata ayıklama aracı olarak yararlı olsa da, bu tabloya herhangi bir bağımlılık eklemeyin. Dayanıklı İşlevler uzantısı geliştikçe değişebilir.

Bir görevin tamamlanmasını bekledikten sonra işlev her sürdürülürken Dayanıklı Görev Çerçevesi orchestrator işlevini sıfırdan yeniden çalıştırır. Her yeniden çalıştırmada, geçerli zaman uyumsuz görevin tamamlanıp tamamlanmadığını belirlemek için yürütme geçmişine başvurur. Yürütme geçmişi görevin zaten tamamlandığını gösteriyorsa, çerçeve bu görevin çıkışını yeniden yürüterek 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 oynatıldıktan sonra yerel değişkenler önceki değerlerine geri yüklenir.

Özellikler ve desenler

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

Alt düzenlemeler

Orchestrator işlevleri etkinlik işlevlerini çağırabilir, ancak diğer orchestrator işlevlerini de çağırabilir. Örneğin, orchestrator işlevleri kitaplığından daha büyük bir düzenleme oluşturabilirsiniz. Alternatif olarak, bir orchestrator işlevinin birden çok örneğini paralel olarak çalıştırabilirsiniz.

Daha fazla bilgi ve örnekler için Alt düzenleme makalesine bakın.

Dayanıklı zamanlayıcılar

Düzenleme işlemleri, gecikmeleri uygulamak veya zaman uyumsuz eylemlerde zaman aşımı işlemeyi ayarlamak için dayanıklı zamanlayıcılar zamanlayabilir. Dilde yerel "uyku" API'leri yerine orchestrator işlevlerinde dayanıklı zamanlayıcılar kullanın.

Daha fazla bilgi ve örnekler için Dayanıklı zamanlayıcılar makalesine bakın.

Dış olaylar

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

Daha fazla bilgi ve örnekler için Dış olaylar makalesine bakın.

Hata işleme

Orchestrator işlevleri, programlama dilinin hata işleme özelliklerini kullanabilir. gibi try/catch mevcut desenler düzenleme kodunda desteklenir.

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.

Not

Orchestrator işlevinde işlenmeyen bir özel durum varsa, düzenleme örneği bir Failed durumda tamamlanır. Düzenleme örneği başarısız olduktan sonra yeniden denenemez.

Daha fazla bilgi ve örnekler için Hata işleme makalesine bakın.

Kritik bölümler (Dayanıklı İşlevler 2.x, şu anda yalnızca .NET)

Düzenleme örnekleri tek iş parçacıklı olduğundan, bir düzenleme içindeki yarış koşulları konusunda endişelenmeniz gerekmez. Ancak, düzenleme işlemleri dış sistemlerle etkileşime geçtiğinde yarış koşulları mümkündür. Dış sistemlerle etkileşim kurarken yarış koşullarını azaltmak için, orchestrator işlevleri .NET'te bir LockAsync yöntem kullanarak kritik bölümler tanımlayabilir.

Aşağıdaki örnek kod, kritik bir bölümü tanımlayan bir orchestrator işlevini gösterir. yöntemini kullanarak kritik bölüme LockAsync girer. Bu yöntem, kilit durumunu kalıcı olarak yöneten Dayanıklı Varlığa bir veya daha fazla başvuru geçirmeyi gerektirir. Bu düzenlemenin yalnızca tek bir örneği, kodu kritik bölümde aynı anda yürütebilir.

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

dayanıklı LockAsync kilitleri alır ve atıldığında kritik bölümü sona erdiren bir IDisposable döndürür. Bu IDisposable sonuç, kritik bölümün bozulmamış bir gösterimini almak 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 Dayanıklı varlıklar "Varlık koordinasyonu" konusuna bakın.

Not

Kritik bölümler Dayanıklı İşlevler 2.0'da kullanılabilir. Şu anda bu özelliği yalnızca .NET in-proc orchestrations uygular. Varlıklar ve kritik bölümler henüz dotnet yalıtılmış çalışan için Dayanıklı İşlevler'de kullanılamaz.

HTTP uç noktalarını çağırma (Dayanıklı İşlevler 2.x)

Orchestrator işlev kodu kısıtlamalarında açıklandığı gibi Orchestrator işlevlerinin G/Ç gerçekleştirmesine izin verilmez. Bu sınırlamanın tipik geçici çözümü, bir etkinlik işlevinde G/Ç yapması gereken tüm kodları sarmalamadır. Dış sistemlerle etkileşim kuran düzenlemelerde http çağrıları yapmak ve sonucu düzenlemeye döndürmek için etkinlik işlevleri sıklıkla kullanılır.

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

[FunctionName("CheckSiteAvailable")]
public static async Task CheckSiteAvailable(
    [OrchestrationTrigger] IDurableOrchestrationContext context)
{
    Uri url = context.GetInput<Uri>();

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

    if ((int)response.StatusCode == 400)
    {
        // handling of error codes goes here
    }
}

Yöntem, temel istek/yanıt desenlerini desteklemeye ek olarak, ortak zaman uyumsuz HTTP 202 yoklama desenlerinin otomatik olarak işlenmesini destekler ve ayrıca Yönetilen Kimlikler kullanarak dış hizmetlerle kimlik doğrulamasını destekler.

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

Not

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

Birden çok parametre geçirme

Bir etkinlik işlevine doğrudan birden çok parametre geçirmek mümkün değildir. Öneri, bir nesne dizisi veya bileşik nesneler geçirmektir.

.NET'te ValueTuple nesnelerini de kullanabilirsiniz. Aşağıdaki örnek, C# 7 ile eklenen yeni ValueTuple özelliklerini kullanmaktır:

[FunctionName("GetCourseRecommendations")]
public static async Task<object> RunOrchestrator(
    [OrchestrationTrigger] IDurableOrchestrationContext context)
{
    string major = "ComputerScience";
    int universityYear = context.GetInput<int>();

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

[FunctionName("CourseRecommendations")]
public static async Task<object> Mapper([ActivityTrigger] IDurableActivityContext inputs)
{
    // parse input for student's major and year in university
    (string Major, int UniversityYear) studentInfo = inputs.GetInput<(string, int)>();

    // retrieve and return course recommendations by major and university year
    return new
    {
        major = studentInfo.Major,
        universityYear = studentInfo.UniversityYear,
        recommendedCourses = new []
        {
            "Introduction to .NET Programming",
            "Introduction to Linux",
            "Becoming an Entrepreneur"
        }
    };
}

Sonraki adımlar