Compartilhar via


Manipular mensagens grandes em fluxos de trabalho usando agrupamento nos Aplicativos Lógicos do Azure

Aplica-se a: Aplicativos Lógicos do Azure (Consumo + Standard)

Os Aplicativos Lógicos do Azure impõem limites de tamanho diferentes no conteúdo da mensagem que as operações podem manipular nos fluxos de trabalho do aplicativo lógico. Esses limites variam de acordo com o tipo de recurso do aplicativo lógico e o ambiente em que um fluxo de trabalho é executado. Os limites também ajudam a reduzir qualquer sobrecarga resultante do armazenamento e processamento de mensagens grandes. Para obter mais informações sobre os limites de tamanho da mensagem, consulte os limites de mensagens nos Aplicativos Lógicos do Azure.

Se você usar ações HTTP internas ou ações específicas de conectores gerenciados para trabalhar com mensagens maiores que os limites padrão, você pode habilitar o agrupamento de partes. Essa abordagem divide uma mensagem grande em mensagens menores, para que você ainda possa transferir arquivos grandes em condições específicas.

Para essas ações internas de HTTP e ações específicas de conectores gerenciados, o fatiamento é a única maneira pela qual o Azure Logic Apps pode consumir mensagens grandes. A troca de mensagens HTTP subjacente entre os Aplicativos Lógicos do Azure e outros serviços deve usar agrupamento ou as conexões criadas pelos conectores gerenciados devem dar suporte ao agrupamento.

Observação

Devido ao aumento de sobrecarga causado pela troca de múltiplas mensagens, os Aplicativos Lógicos do Azure não oferecem suporte ao agrupamento de partes em gatilhos. Além disso, os Aplicativos Lógicos do Azure implementam o agrupamento para ações HTTP usando seu próprio protocolo, conforme descrito neste artigo. Mesmo que seu site ou serviço Web dê suporte ao agrupamento, eles não funcionam com o agrupamento de ações HTTP.

Para usar o agrupamento de ações HTTP com seu site ou serviço Web, implemente o mesmo protocolo usado pelos Aplicativos Lógicos do Azure. Caso contrário, não habilite o agrupamento na ação HTTP.

Este artigo fornece uma visão geral sobre o que as mensagens grandes significam, como o agrupamento funciona e como configurar o agrupamento em ações com suporte nos Aplicativos Lógicos do Azure.

O que torna as mensagens "grandes"?

As mensagens são grandes de acordo com o serviço que manipula essas mensagens. O limite de tamanho exato em mensagens grandes difere entre os Aplicativos Lógicos do Azure e as ações do conector. Os Aplicativos Lógicos do Azure e os conectores não podem consumir mensagens grandes diretamente sem agrupamento.

Para obter o limite de tamanho de mensagem dos Aplicativos Lógicos do Azure, consulte os limites e a configuração dos Aplicativos Lógicos do Azure. Para o limite de tamanho da mensagem de cada conector, consulte a referência do conector.

Manipulação de mensagens fragmentadas nos Aplicativos Lógicos do Azure

Os Aplicativos Lógicos do Azure não podem usar diretamente as saídas de mensagens segmentadas que excedem o limite de tamanho da mensagem. Somente as ações que dão suporte ao agrupamento podem acessar o conteúdo da mensagem nessas saídas. Uma ação que manipula mensagens grandes deve atender a qualquer um dos seguintes critérios:

  • A ação deve oferecer suporte nativo ao chunking quando essa ação pertencer a um conector.
  • A ação deve ter suporte de agrupamento habilitado na configuração de runtime dessa ação.

Caso contrário, você receberá um erro de runtime ao tentar acessar uma saída de conteúdo grande.

Tratamento de mensagens em blocos para conectores

Os serviços que se comunicam com os Aplicativos Lógicos do Azure podem ter seus próprios limites de tamanho de mensagem. Esses limites geralmente são menores do que o limite dos Aplicativos Lógicos do Azure. Por exemplo, supondo que um conector ofereça suporte ao agrupamento de partes, um conector poderá considerar uma mensagem de 30 MB como grande, enquanto os Aplicativos Lógicos do Azure não. Para cumprir o limite desse conector, os Aplicativos Lógicos do Azure dividem qualquer mensagem maior que 30 MB em partes menores.

Para conectores que dão suporte a agrupamento, o protocolo de agrupamento subjacente é invisível para os usuários finais. Nem todos os conectores dão suporte à fragmentação. Conectores que não dão suporte a ele geram erros de runtime quando as mensagens de entrada excedem os limites de tamanho do conector.

Para ações que dão suporte e estão habilitadas para agrupamentos de partes, você não poderá usar corpos de gatilho, variáveis e expressões como triggerBody()?['Content']. O uso de qualquer uma dessas entradas impede que a operação de agrupamento ocorra. Em vez disso, use a ação Redigir. Especificamente, crie um body campo usando a ação Compose para armazenar a saída de dados do corpo do gatilho, variável, expressão e assim por diante, por exemplo:

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

Para fazer referência aos dados, na ação de agrupamento, use a expressão body('Compose'), por exemplo:

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

Configurar a divisão em blocos por HTTP

Em cenários HTTP genéricos, você pode dividir grandes downloads de conteúdo e uploads por HTTP para que seu fluxo de trabalho possa trocar mensagens grandes com um ponto de extremidade externo. Você deve agrupar mensagens da maneira esperada pelos Aplicativos Lógicos do Azure.

Se um ponto de extremidade externo estiver configurado para fazer downloads ou uploads em partes, as ações HTTP em seu fluxo de trabalho agruparão automaticamente mensagens grandes. Caso contrário, você deve configurar o suporte a chunking no ponto de extremidade. Se você não possui ou controla o ponto de extremidade, talvez não consiga configurar a divisão em partes.

Se uma ação HTTP ainda não tiver o agrupamento habilitado, você deverá configurar o agrupamento por meio da propriedade da runTimeConfiguration ação. Você pode configurar essa propriedade na definição de ação usando o editor de exibição de código, conforme descrito posteriormente ou no designer de fluxo de trabalho, conforme descrito aqui:

  1. No designer, selecione a ação HTTP para abrir o painel de informações de ação e selecione Configurações.

  2. Em Transferência de conteúdo, defina Permitir agrupamento como Ativado.

    A captura de tela mostra as configurações de uma ação HTTP, com Permitir agrupamento selecionado. Ative o agrupamento.

  3. Para concluir a configuração de divisão em blocos para downloads ou uploads, continue com as seções a seguir.

Baixar conteúdo em partes

Quando você baixa o conteúdo de um ponto de extremidade externo usando uma solicitação HTTP GET, muitos pontos de extremidade externos enviam mensagens grandes automaticamente em partes. Esse comportamento requer que o endpoint dê suporte a solicitações de conteúdo parciais ou downloads fragmentados. Portanto, se uma ação no seu fluxo de trabalho enviar uma solicitação HTTP GET para baixar o conteúdo de um endpoint externo e o endpoint responder com o código de status 206 de Conteúdo Parcial, a resposta conterá conteúdo fragmentado.

Os Aplicativos Lógicos do Azure não podem controlar se um ponto de extremidade externo dá suporte a solicitações de conteúdo parciais. Quando a ação de solicitação em seu fluxo de trabalho obtém a primeira resposta com o código de status 206 Conteúdo Parcial, essa ação envia automaticamente várias solicitações para fazer download de todo o conteúdo.

Para verificar se um ponto de extremidade externo dá suporte a conteúdo parcial, envie uma solicitação HTTP HEAD, que solicita uma resposta apenas com a linha de status e a seção de cabeçalho, omitindo o corpo da resposta. Essa solicitação ajuda você a determinar se a resposta contém o Accept-Ranges cabeçalho.

Se o ponto de extremidade oferecer suporte a downloads em partes, mas não enviar o conteúdo em partes, você poderá sugerir essa opção definindo o cabeçalho Range na solicitação HTTP GET.

As etapas a seguir descrevem o processo que os Aplicativos Lógicos do Azure usam para baixar conteúdo em partes de um ponto de extremidade externo em seu fluxo de trabalho:

  1. Em seu fluxo de trabalho, uma ação envia uma solicitação HTTP GET para o endpoint.

    Opcionalmente, o cabeçalho da solicitação pode incluir um Range campo que descreve um intervalo de bytes para solicitar partes de conteúdo.

  2. O ponto de extremidade responde com o código de status 206 e um corpo de mensagem HTTP.

    Os detalhes sobre o conteúdo desta parte aparecem no cabeçalho da Content-Range resposta. Esses detalhes incluem informações que ajudam os Aplicativos Lógicos do Azure a determinar o início e o término da parte, além do tamanho total de todo o conteúdo antes do agrupamento.

  3. A ação envia automaticamente solicitações HTTP GET de acompanhamento até que todo o conteúdo seja recuperado.

Por exemplo, a definição de ação a seguir mostra uma solicitação HTTP GET que define o Range cabeçalho. O cabeçalho sugere que o endpoint responda com conteúdo fragmentado.

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

A solicitação GET define o cabeçalho Range para bytes=0-1023 para especificar o intervalo de bytes. Se o ponto de extremidade der suporte a solicitações de conteúdo parcial, o ponto de extremidade responderá com uma parte de conteúdo do intervalo solicitado. Com base no ponto de extremidade, o formato exato do Range campo de cabeçalho pode ser diferente.

Carregar conteúdo em partes

Para carregar conteúdo em partes de uma ação HTTP, você deve configurar o suporte de agrupamento definindo a propriedade da runtimeConfiguration ação. Essa configuração permite que a ação inicie o protocolo de agrupamento.

Em seguida, a ação pode enviar uma mensagem POST ou PUT inicial para o ponto de extremidade externo. Depois que o endpoint responde com um tamanho de fragmento sugerido, a ação continua enviando solicitações de PATCH HTTP que contêm os fragmentos de conteúdo.

As etapas a seguir descrevem o processo detalhado que os Aplicativos Lógicos do Azure usam para carregar conteúdo em partes de uma ação em seu fluxo de trabalho para um ponto de extremidade externo:

  1. No fluxo de trabalho, uma ação envia uma solicitação HTTP POST ou PUT inicial com um corpo de mensagem vazio.

    O cabeçalho da solicitação inclui as seguintes informações sobre o conteúdo que seu aplicativo lógico deseja carregar em partes:

    Campo de cabeçalho da solicitação Valor Tipo Descrição
    x-ms-transfer-mode em partes fio Indica que o conteúdo é carregado em partes
    x-ms-content-length < comprimento do conteúdo> Número Inteiro O tamanho inteiro do conteúdo em bytes antes do agrupamento
  2. O endpoint responde com o código de status de êxito 200 e as seguintes informações:

    Campo de cabeçalho de resposta do ponto de extremidade Tipo Obrigatório Descrição
    Localidade fio Sim O URL para onde enviar as mensagens HTTP PATCH
    x-ms-chunk-size Número Inteiro Não O tamanho da parte sugerida em bytes
  3. A ação de fluxo de trabalho cria e envia mensagens PATCH HTTP de acompanhamento, cada uma com as seguintes informações:

    • Um bloco de conteúdo baseado em x-ms-chunk-size ou algum tamanho calculado internamente até que todo o conteúdo totalizando x-ms-content-length seja carregado sequencialmente

    • As seguintes informações de cabeçalho sobre o bloco de conteúdo enviado em cada mensagem PATCH:

      Campo de cabeçalho da solicitação Valor Tipo Descrição
      Intervalo de conteúdo <<intervalo()> fio O intervalo de bytes da parte de conteúdo atual, incluindo o valor inicial, o valor final e o tamanho total do conteúdo, por exemplo: bytes=0-1023/10100
      Content-Type < tipo de conteúdo> fio O tipo de conteúdo em partes
      Content-Length < comprimento do conteúdo> fio O comprimento do tamanho em bytes do bloco atual
  4. Depois de cada solicitação PATCH, o ponto de extremidade confirma o recebimento para cada parte respondendo com o código de status 200 e os seguintes cabeçalhos de resposta:

    Campo de cabeçalho de resposta do ponto de extremidade Tipo Obrigatório Descrição
    Intervalo fio Sim O intervalo de bytes para conteúdo recebido pelo ponto de extremidade, por exemplo: bytes=0-1023
    x-ms-chunk-size Número Inteiro Não O tamanho da parte sugerida em bytes

Por exemplo, a definição de ação a seguir mostra uma solicitação HTTP POST para enviar conteúdo dividido em blocos a um endpoint. Na propriedade runTimeConfiguration da ação, a propriedade contentTransfer define transferMode como chunked:

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