Obsługa dużych komunikatów w przepływach pracy przy użyciu fragmentowania w usłudze Azure Logic Apps

Dotyczy: Azure Logic Apps (Zużycie)

Usługa Azure Logic Apps ma różne maksymalne limity dotyczące rozmiaru zawartości komunikatu, który wyzwalacze i akcje mogą być obsługiwane w przepływach pracy aplikacji logiki na podstawie typu zasobu aplikacji logiki i środowiska, w którym jest uruchamiany przepływ pracy aplikacji logiki. Te limity pomagają zmniejszyć wszelkie nakłady pracy wynikające z przechowywania i przetwarzania dużych komunikatów. Aby uzyskać więcej informacji na temat limitów rozmiaru komunikatów, zobacz Limity komunikatów w usłudze Azure Logic Apps.

Jeśli używasz wbudowanych akcji HTTP lub określonych akcji łącznika zarządzanego i potrzebujesz usługi Azure Logic Apps do pracy z komunikatami większymi niż limity domyślne, możesz włączyć fragmentowanie, które dzieli duży komunikat na mniejsze komunikaty. Dzięki temu nadal można przesyłać duże pliki w określonych warunkach. W rzeczywistości, gdy używasz tych wbudowanych akcji HTTP lub określonych akcji łącznika zarządzanego, fragmentowanie jest jedynym sposobem, w jaki usługa Azure Logic Apps może korzystać z dużych komunikatów. To wymaganie oznacza, że podstawowa wymiana komunikatów HTTP między usługą Azure Logic Apps i innymi usługami musi używać fragmentów lub że połączenia utworzone przez zarządzane łączniki, które mają być używane, również muszą obsługiwać fragmentowanie.

Uwaga

Usługa Azure Logic Apps nie obsługuje fragmentowania wyzwalaczy ze względu na zwiększone obciążenie związane z wymianą wielu komunikatów. Ponadto usługa Azure Logic Apps implementuje fragmentowanie akcji HTTP przy użyciu własnego protokołu zgodnie z opisem w tym artykule. Dlatego nawet jeśli witryna internetowa lub usługa internetowa obsługuje fragmentowanie, nie będą działać z fragmentowaniem akcji HTTP. Aby używać fragmentów akcji HTTP z witryną internetową lub usługą internetową, musisz zaimplementować ten sam protokół, który jest używany przez usługę Azure Logic Apps. W przeciwnym razie nie włączaj fragmentowania akcji HTTP.

Ten artykuł zawiera omówienie sposobu działania fragmentowania w usłudze Azure Logic Apps oraz sposobu konfigurowania fragmentów obsługiwanych akcji.

Co sprawia, że komunikaty są "duże"?

Komunikaty są "duże" na podstawie usługi obsługującej te komunikaty. Dokładny limit rozmiaru dużych komunikatów różni się w zależności od usługi Logic Apps i łączników. Zarówno usługa Logic Apps, jak i łączniki nie mogą bezpośrednio korzystać z dużych komunikatów, które muszą być fragmentowane. Aby uzyskać limit rozmiaru komunikatów usługi Logic Apps, zobacz Logic Apps limits and configuration (Limity i konfiguracja usługi Logic Apps). Aby uzyskać informacje o limicie rozmiaru komunikatów każdego łącznika, zobacz dokumentację referencyjną łącznika.

Obsługa fragmentowanych komunikatów dla usługi Logic Apps

Usługa Logic Apps nie może bezpośrednio używać danych wyjściowych z fragmentowanych komunikatów, które są większe niż limit rozmiaru komunikatów. Tylko akcje, które obsługują fragmentowanie, mogą uzyskiwać dostęp do zawartości komunikatu w tych danych wyjściowych. Dlatego akcja, która obsługuje duże komunikaty, musi spełniać następujące kryteria:

  • Natywnie obsługuje fragmentowanie, gdy ta akcja należy do łącznika.
  • Obsługa fragmentowania jest włączona w konfiguracji środowiska uruchomieniowego tej akcji.

W przeciwnym razie podczas próby uzyskania dostępu do dużych danych wyjściowych zawartości wystąpi błąd środowiska uruchomieniowego. Aby włączyć fragmentowanie, zobacz Konfigurowanie obsługi fragmentów.

Obsługa fragmentowanych komunikatów dla łączników

Usługi komunikujące się z usługą Logic Apps mogą mieć własne limity rozmiaru komunikatów. Te limity są często mniejsze niż limit usługi Logic Apps. Na przykład przy założeniu, że łącznik obsługuje fragmentowanie, łącznik może traktować jako duży komunikat o rozmiarze 30 MB, a usługa Logic Apps nie. Aby zachować zgodność z limitem tego łącznika, usługa Logic Apps dzieli wszystkie komunikaty większe niż 30 MB na mniejsze fragmenty.

W przypadku łączników, które obsługują fragmentowanie, podstawowy protokół fragmentowania jest niewidoczny dla użytkowników końcowych. Jednak nie wszystkie łączniki obsługują fragmentowanie, więc te łączniki generują błędy środowiska uruchomieniowego, gdy komunikaty przychodzące przekraczają limity rozmiaru łączników.

W przypadku akcji, które obsługują fragmentowanie i są włączone, nie można używać treści wyzwalacza, zmiennych i wyrażeń, takich jak @triggerBody()?['Content'] użycie dowolnego z tych danych wejściowych, uniemożliwia wykonywanie operacji fragmentowania. Zamiast tego użyj akcji Redaguj. W szczególności należy utworzyć body pole przy użyciu akcji Redaguj , aby przechowywać dane wyjściowe z treści wyzwalacza, zmiennej, wyrażenia itd., na przykład:

"Compose": {
    "inputs": {
        "body": "@variables('myVar1')"
    },
    "runAfter": {
        "Until": [
            "Succeeded"
        ]
    },
    "type": "Compose"
},

Następnie, aby odwołać się do danych, w akcji fragmentowania użyj polecenia @body('Compose') .

"Create_file": {
    "inputs": {
        "body": "@body('Compose')",
        "headers": {
            "ReadFileMetadataFromServer": true
        },
        "host": {
            "connection": {
                "name": "@parameters('$connections')['sftpwithssh_1']['connectionId']"
            }
        },
        "method": "post",
        "path": "/datasets/default/files",
        "queries": {
            "folderPath": "/c:/test1/test1sub",
            "name": "tt.txt",
            "queryParametersSingleEncoded": true
        }
    },
    "runAfter": {
        "Compose": [
            "Succeeded"
        ]
    },
    "runtimeConfiguration": {
        "contentTransfer": {
            "transferMode": "Chunked"
        }
    },
    "type": "ApiConnection"
},

Konfigurowanie fragmentowania za pośrednictwem protokołu HTTP

W ogólnych scenariuszach HTTP można podzielić duże pliki do pobrania i przekazania zawartości za pośrednictwem protokołu HTTP, aby aplikacja logiki i punkt końcowy mogły wymieniać duże komunikaty. Należy jednak fragmentować komunikaty w oczekiwany sposób, w jaki usługa Logic Apps.

Jeśli punkt końcowy włączył fragmentowanie pobierania lub przekazywania, akcje HTTP w aplikacji logiki automatycznie fragmentowane są dużymi komunikatami. W przeciwnym razie należy skonfigurować obsługę fragmentowania w punkcie końcowym. Jeśli nie jesteś właścicielem punktu końcowego lub łącznika, być może nie masz możliwości skonfigurowania fragmentów.

Ponadto jeśli akcja HTTP nie włączy jeszcze fragmentowania, należy również skonfigurować fragmentowanie we właściwości akcji runTimeConfiguration . Tę właściwość można ustawić wewnątrz akcji bezpośrednio w edytorze widoku kodu zgodnie z opisem w dalszej części lub w Projektancie aplikacji usługi Logic Apps zgodnie z opisem poniżej:

  1. W prawym górnym rogu akcji HTTP wybierz przycisk wielokropka (...), a następnie wybierz pozycję Ustawienia.

    W akcji otwórz menu ustawień

  2. W obszarze Transfer zawartości ustaw opcję Zezwalaj na fragmentowanie na .

    Włączanie fragmentowania

  3. Aby kontynuować konfigurowanie fragmentów pobierania lub przekazywania, przejdź do poniższych sekcji.

Pobieranie zawartości we fragmentach

Wiele punktów końcowych automatycznie wysyła duże komunikaty we fragmentach po pobraniu za pośrednictwem żądania HTTP GET. Aby pobrać fragmentowane komunikaty z punktu końcowego za pośrednictwem protokołu HTTP, punkt końcowy musi obsługiwać częściowe żądania zawartości lub fragmentowane pliki do pobrania. Gdy aplikacja logiki wysyła żądanie HTTP GET do punktu końcowego w celu pobrania zawartości, a punkt końcowy odpowiada kodem stanu "206", odpowiedź zawiera fragmentowaną zawartość. Usługa Logic Apps nie może kontrolować, czy punkt końcowy obsługuje żądania częściowe. Jednak gdy aplikacja logiki otrzyma pierwszą odpowiedź "206", aplikacja logiki automatycznie wysyła wiele żądań w celu pobrania całej zawartości.

Aby sprawdzić, czy punkt końcowy może obsługiwać częściową zawartość, wyślij żądanie HEAD. To żądanie pomaga określić, czy odpowiedź zawiera Accept-Ranges nagłówek . W ten sposób, jeśli punkt końcowy obsługuje fragmentowane pliki do pobrania, ale nie wysyła fragmentowanej zawartości, możesz zasugerować tę opcję, ustawiając Range nagłówek w żądaniu HTTP GET.

W tych krokach opisano szczegółowy proces używany przez usługę Logic Apps do pobierania fragmentowanej zawartości z punktu końcowego do aplikacji logiki:

  1. Aplikacja logiki wysyła żądanie HTTP GET do punktu końcowego.

    Nagłówek żądania może opcjonalnie zawierać Range pole opisujące zakres bajtów na potrzeby żądania fragmentów zawartości.

  2. Punkt końcowy odpowiada kodem stanu "206" i treścią komunikatu HTTP.

    Szczegółowe informacje o zawartości tego fragmentu są wyświetlane w nagłówku odpowiedzi Content-Range , w tym informacje ułatwiające usłudze Logic Apps określenie początku i końca fragmentu oraz całkowity rozmiar całej zawartości przed fragmentem.

  3. Aplikacja logiki automatycznie wysyła kolejne żądania HTTP GET.

    Aplikacja logiki wysyła kolejne żądania GET do momentu pobrania całej zawartości.

Na przykład ta definicja akcji przedstawia żądanie HTTP GET, które ustawia Range nagłówek. Nagłówek sugeruje , że punkt końcowy powinien odpowiadać z fragmentowaną zawartością:

"getAction": {
    "inputs": {
        "headers": {
            "Range": "bytes=0-1023"
        },
       "method": "GET",
       "uri": "http://myAPIendpoint/api/downloadContent"
    },
    "runAfter": {},
    "type": "Http"
}

Żądanie GET ustawia nagłówek "Zakres" na "bytes=0-1023", czyli zakres bajtów. Jeśli punkt końcowy obsługuje żądania częściowej zawartości, punkt końcowy odpowiada fragmentem zawartości z żądanego zakresu. Na podstawie punktu końcowego dokładny format pola nagłówka "Zakres" może się różnić.

Przekazywanie zawartości we fragmentach

Aby przekazać fragmentowaną zawartość z akcji HTTP, akcja musi mieć włączoną obsługę fragmentowania za pośrednictwem właściwości akcji runtimeConfiguration . To ustawienie zezwala akcji na uruchomienie protokołu fragmentowania. Aplikacja logiki może następnie wysłać początkowy komunikat POST lub PUT do docelowego punktu końcowego. Gdy punkt końcowy odpowie z sugerowanym rozmiarem fragmentu, aplikacja logiki postępuje zgodnie z instrukcjami, wysyłając żądania HTTP PATCH zawierające fragmenty zawartości.

W poniższych krokach opisano szczegółowy proces używany przez usługę Logic Apps do przekazywania fragmentowanej zawartości z aplikacji logiki do punktu końcowego:

  1. Aplikacja logiki wysyła początkowe żądanie HTTP POST lub PUT z pustą treścią komunikatu. Nagłówek żądania zawiera następujące informacje o zawartości, którą aplikacja logiki chce przekazać we fragmentach:

    Pole nagłówka żądania usługi Logic Apps Wartość Typ Opis
    tryb transferu x-ms Fragmentaryczne Ciąg Wskazuje, że zawartość jest przekazywana we fragmentach
    x-ms-content-length <długość zawartości> Liczba całkowita Cały rozmiar zawartości w bajtach przed fragmentowaniem
  2. Punkt końcowy odpowiada kodem stanu powodzenia "200" i następującymi informacjami:

    Pole nagłówka odpowiedzi punktu końcowego Typ Wymagane Opis
    Lokalizacja Ciąg Tak Lokalizacja adresu URL, w której mają być wysyłane komunikaty HTTP PATCH
    x-ms-chunk-size Liczba całkowita Nie Sugerowany rozmiar fragmentu w bajtach
  3. Aplikacja logiki tworzy i wysyła kolejne komunikaty HTTP PATCH — każdy z następujących informacji:

    • Fragment zawartości oparty na rozmiarze x-ms-chunk-lub niektórych wewnętrznie obliczonych rozmiarach do momentu sekwencyjnego przekazania całej zawartości x-ms-content-length

    • Następujące informacje nagłówka dotyczące fragmentu zawartości wysyłanego w każdym komunikacie PATCH:

      Pole nagłówka żądania usługi Logic Apps Wartość Typ Opis
      Zakres zawartości <Zakres> Ciąg Zakres bajtów dla bieżącego fragmentu zawartości, w tym wartość początkowa, wartość końcowa i całkowity rozmiar zawartości, na przykład: "bytes=0-1023/10100"
      Typ zawartości <typ zawartości> Ciąg Typ fragmentowanej zawartości
      Długość zawartości <długość zawartości> Ciąg Długość rozmiaru w bajtach bieżącego fragmentu
  4. Po każdym żądaniu PATCH punkt końcowy potwierdza potwierdzenie potwierdzenia dla każdego fragmentu, odpowiadając na kod stanu "200" i następujące nagłówki odpowiedzi:

    Pole nagłówka odpowiedzi punktu końcowego Typ Wymagane Opis
    Zakres Ciąg Tak Zakres bajtów dla zawartości, która została odebrana przez punkt końcowy, na przykład: "bytes=0-1023"
    x-ms-chunk-size Liczba całkowita Nie Sugerowany rozmiar fragmentu w bajtach

Na przykład ta definicja akcji pokazuje żądanie HTTP POST dotyczące przekazywania fragmentowanej zawartości do punktu końcowego. We właściwości contentTransfer akcji runTimeConfiguration właściwość ustawia transferMode wartość chunked:

"postAction": {
    "runtimeConfiguration": {
        "contentTransfer": {
            "transferMode": "chunked"
        }
    },
    "inputs": {
        "method": "POST",
        "uri": "http://myAPIendpoint/api/action",
        "body": "@body('getAction')"
    },
    "runAfter": {
    "getAction": ["Succeeded"]
    },
    "type": "Http"
}