Enviar mensagens relacionadas por ordem através de um transporte sequencial no Azure Logic Apps com o Azure Service Bus
Aplica-se a: Aplicativos Lógicos do Azure (Consumo)
Quando precisar enviar mensagens correlacionadas em uma ordem específica, você poderá seguir o padrão de comboio sequencial ao usar os Aplicativos Lógicos do Azure usando o conector do Barramento de Serviço do Azure. As mensagens correlacionadas têm uma propriedade que define a relação entre essas mensagens, como a ID da sessão no Service Bus.
Por exemplo, suponha que você tenha 10 mensagens para uma sessão chamada "Sessão 1" e 5 mensagens para uma sessão chamada "Sessão 2" que são enviadas para a mesma fila do Service Bus. Você pode criar um aplicativo lógico que processa mensagens da fila para que todas as mensagens da "Sessão 1" sejam manipuladas por uma única execução de gatilho e todas as mensagens da "Sessão 2" sejam tratadas pela próxima execução de gatilho.
Este artigo mostra como criar um aplicativo lógico que implementa esse padrão usando o modelo Entrega na ordem correlacionada usando sessões de barramento de serviço. Este modelo define um fluxo de trabalho de aplicativo lógico que começa com o gatilho Quando uma mensagem é recebida em uma fila (peek-lock), que recebe mensagens de uma fila do Service Bus. Aqui estão as etapas de alto nível que este aplicativo lógico executa:
Inicialize uma sessão com base em uma mensagem que o gatilho lê da fila do Service Bus.
Leia e processe todas as mensagens da mesma sessão na fila durante a execução do fluxo de trabalho atual.
Para revisar o arquivo JSON desse modelo, consulte GitHub: service-bus-sessions.json.
Para obter mais informações, consulte Padrão de comboio sequencial - Azure Architecture Cloud Design Patterns.
Pré-requisitos
Uma subscrição do Azure. Se não tiver uma subscrição, inscreva-se numa conta do Azure gratuita.
Um namespace do Service Bus e uma fila do Service Bus, que é uma entidade de mensagens que você usará em seu aplicativo lógico. Esses itens e seu aplicativo lógico precisam usar a mesma assinatura do Azure. Certifique-se de selecionar Ativar sessões ao criar sua fila. Se você não tiver esses itens, saiba como criar seu namespace do Service Bus e uma fila.
Importante
Tenha cuidado ao selecionar um gatilho e uma ação que tenham o mesmo tipo de conector e usá-los para trabalhar com a mesma entidade, como uma fila de mensagens ou uma assinatura de tópico. Essa combinação pode criar um loop infinito, o que resulta em um aplicativo lógico que nunca termina.
Conhecimento básico sobre como criar aplicativos lógicos. Se você é novo nos Aplicativos Lógicos do Azure, experimente o início rápido que cria um exemplo de fluxo de trabalho de aplicativo lógico de consumo em Aplicativos Lógicos do Azure multilocatário.
Verificar o acesso ao namespace do Service Bus
Se você não tiver certeza se seu aplicativo lógico tem permissões para acessar seu namespace do Service Bus, confirme essas permissões.
Inicie sessão no portal do Azure. Localize e selecione seu namespace do Service Bus.
No menu namespace, em Configurações, selecione Políticas de acesso compartilhado. Em Declarações, verifique se você tem permissões de gerenciamento para esse namespace.
Agora obtenha a cadeia de conexão para seu namespace do Service Bus. Você pode usar essa cadeia de caracteres mais tarde quando criar uma conexão com o namespace a partir do seu aplicativo lógico.
No painel Políticas de acesso compartilhado, em Política, selecione RootManageSharedAccessKey.
Ao lado da cadeia de conexão principal, selecione o botão Copiar. Salve a cadeia de conexão para uso posterior.
Gorjeta
Para confirmar se a cadeia de conexão está associada ao namespace do Service Bus ou a uma entidade de mensagens, como uma fila, pesquise o
EntityPath
parâmetro na cadeia de conexão. Se você encontrar esse parâmetro, a cadeia de conexão é para uma entidade específica e não é a cadeia de caracteres correta para usar com seu aplicativo lógico.
Criar aplicação lógica
Nesta seção, você cria um aplicativo lógico usando o modelo Entrega na ordem correlacionada usando sessões de barramento de serviço, que inclui o gatilho e as ações para implementar esse padrão de fluxo de trabalho. Você também cria uma conexão com seu namespace do Service Bus e especifica o nome para a fila do Service Bus que deseja usar.
No portal do Azure, crie um aplicativo lógico em branco. Na home page do Azure, selecione Criar um aplicativo lógico de integração>de recursos.>
Depois que a galeria de modelos for exibida, passe pelo vídeo e pelas seções de gatilhos comuns. Na seção Modelos , selecione o modelo, Entrega na ordem correlacionada usando sessões de barramento de serviço.
Quando a caixa de confirmação aparecer, selecione Usar este modelo.
No Designer de Aplicativo Lógico, na forma Service Bus , selecione Continuar e selecione o sinal de adição (+) que aparece na forma.
Agora, crie uma conexão do Service Bus escolhendo uma das opções:
Para usar a cadeia de conexão copiada anteriormente do namespace do Service Bus, siga estas etapas:
Selecione Inserir informações de conexão manualmente.
Em Nome da Conexão, forneça um nome para sua conexão. Para Cadeia de Conexão, cole a cadeia de conexão do namespace e selecione Criar, por exemplo:
Gorjeta
Se você não tiver essa cadeia de conexão, saiba como localizar e copiar a cadeia de conexão do namespace do Service Bus.
Para selecionar um namespace do Service Bus de sua assinatura atual do Azure, siga estas etapas:
Em Nome da Conexão, forneça um nome para sua conexão. Para Namespace do Service Bus, selecione seu namespace do Service Bus, por exemplo:
Quando o próximo painel for exibido, selecione sua política do Service Bus e selecione Criar.
Quando terminar, selecione Continuar.
O Logic App Designer agora mostra o modelo Correlated in-order delivery using service bus sessions , que contém um fluxo de trabalho pré-preenchido com um gatilho e ações, incluindo dois escopos que implementam o tratamento de erros que seguem o
Try-Catch
padrão.
Agora você pode saber mais sobre o gatilho e as ações no modelo ou avançar para fornecer os valores para o modelo de aplicativo lógico.
Resumo do modelo
Aqui está o fluxo de trabalho de nível superior no modelo Entrega na ordem correlacionada usando sessões do barramento de serviço quando os detalhes são recolhidos:
Nome | Descrição |
---|---|
When a message is received in a queue (peek-lock) |
Com base na recorrência especificada, esse gatilho do Barramento de Serviço verifica se há mensagens na fila do Barramento de Serviço especificada. Se existir uma mensagem na fila, o gatilho é acionado, o que cria e executa uma instância de fluxo de trabalho. O termo peek-lock significa que o gatilho envia uma solicitação para recuperar uma mensagem da fila. Se existir uma mensagem, o gatilho recupera e bloqueia a mensagem para que nenhum outro processamento aconteça nessa mensagem até que o período de bloqueio expire. Para obter detalhes, inicialize a sessão. |
Init isDone |
Esta ação Inicializar variável cria uma variável booleana que é definida como false e indica quando as seguintes condições são verdadeiras:- Não há mais mensagens na sessão disponíveis para leitura. Para obter detalhes, consulte Inicializar a sessão. |
Try |
Esta ação Escopo contém as ações executadas para processar uma mensagem. Se ocorrer um problema no Try escopo, a ação Escopo subsequente Catch resolverá esse problema. Para obter mais informações, consulte Escopo "Tentar". |
Catch |
Esta ação Escopo contém as ações que são executadas se ocorrer um problema no escopo anteriorTry . Para obter mais informações, consulte Escopo "Capturar". |
Âmbito de aplicação "Tentar"
Aqui está o fluxo de nível superior na ação de Try
escopo quando os detalhes são recolhidos:
Nome | Descrição |
---|---|
Send initial message to topic |
Você pode substituir essa ação por qualquer ação que você deseja manipular a primeira mensagem da sessão na fila. O ID da sessão especifica a sessão. Para este modelo, uma ação do Service Bus envia a primeira mensagem para um tópico do Service Bus. Para obter detalhes, consulte Manipular a mensagem inicial. |
(ramo paralelo) | Essa ação de ramificação paralela cria dois caminhos: - Ramificação #1: Continue processando a mensagem. Para obter mais informações, consulte Ramificação #1: Concluir mensagem inicial na fila. - Ramificação #2: Abandone a mensagem se algo der errado e libere para captação por outro gatilho executado. Para obter mais informações, consulte Ramificação #2: Abandonar a mensagem inicial da fila. Ambos os caminhos se unem mais tarde na ação Fechar sessão em uma fila e ter êxito , descrita na próxima linha. |
Close a session in a queue and succeed |
Esta ação do Service Bus une as ramificações descritas anteriormente e fecha a sessão na fila após um dos seguintes eventos acontecer: - O fluxo de trabalho termina o processamento das mensagens disponíveis na fila. Para obter detalhes, consulte Fechar uma sessão em uma fila e ter êxito. |
Ramificação #1: Mensagem inicial completa na fila
Nome | Descrição |
---|---|
Complete initial message in queue |
Esta ação do Service Bus marca uma mensagem recuperada com êxito como concluída e remove a mensagem da fila para impedir o reprocessamento. Para obter detalhes, consulte Manipular a mensagem inicial. |
While there are more messages for the session in the queue |
Este loop até continua a receber mensagens enquanto as mensagens existem ou até que uma hora passe. Para obter mais informações sobre as ações nesse loop, consulte Enquanto há mais mensagens para a sessão na fila. |
Set isDone = true |
Quando não existirem mais mensagens, esta ação Definir variável será definida isDone como true . |
Renew session lock until cancelled |
Esse loop Until garante que o bloqueio de sessão seja mantido por esse aplicativo lógico enquanto as mensagens existirem ou até que uma hora passe. Para obter mais informações sobre as ações nesse loop, consulte Renovar bloqueio de sessão até ser cancelado. |
Ramificação #2: Abandonar a mensagem inicial da fila
Se a ação que manipula a primeira mensagem falhar, a ação do Service Bus, Abandonar a mensagem inicial da fila, liberará a mensagem para outra instância de fluxo de trabalho ser executada para pegar e processar. Para obter detalhes, consulte Manipular a mensagem inicial.
Âmbito de aplicação "Catch"
Se as Try
ações no escopo falharem, o aplicativo lógico ainda deverá fechar a sessão. A Catch
ação de escopo é executada quando a ação de Try
escopo resulta no status, Failed
, Skipped
ou TimedOut
. O escopo retorna uma mensagem de erro que inclui a ID da sessão onde o problema aconteceu e encerra o aplicativo lógico.
Aqui está o fluxo de nível superior na ação de Catch
escopo quando os detalhes são recolhidos:
Nome | Descrição |
---|---|
Close a session in a queue and fail |
Esta ação do Service Bus fecha a sessão na fila para que o bloqueio de sessão não permaneça aberto. Para obter detalhes, consulte Fechar uma sessão em uma fila e falhar. |
Find failure msg from 'Try' block |
Esta ação Matriz de Filtros cria uma matriz a partir das entradas e saídas de todas as ações dentro do Try escopo com base nos critérios especificados. Nesse caso, essa ação retorna as saídas das ações que resultaram em Failed status. Para obter detalhes, consulte Localizar mensagem de falha no bloco 'Tentar'. |
Select error details |
Esta ação Select cria uma matriz que contém objetos JSON com base nos critérios especificados. Esses objetos JSON são criados a partir dos valores na matriz criada pela ação anterior, Find failure msg from 'Try' block . Nesse caso, essa ação retorna uma matriz que contém um objeto JSON criado a partir dos detalhes de erro retornados da ação anterior. Para obter detalhes, consulte Selecionar detalhes do erro. |
Terminate |
Esta ação Encerrar interrompe a execução do fluxo de trabalho, cancela todas as ações em andamento, ignora todas as ações restantes e retorna o status especificado, a ID da sessão e o resultado do erro da Select error details ação. Para obter detalhes, consulte Encerrar aplicativo lógico. |
Preencha o modelo
Para fornecer os valores para o gatilho e as ações no modelo Entrega na ordem correlacionada usando sessões do barramento de serviço, siga estas etapas. Você precisa fornecer todos os valores necessários, que são marcados por um asterisco (*), antes de salvar seu aplicativo lógico.
Inicializar a sessão
Para o gatilho Quando uma mensagem é recebida em uma fila (peek-lock), forneça essas informações para que o modelo possa inicializar uma sessão usando a propriedade Session id , por exemplo:
Nota
Inicialmente, o intervalo de sondagem é definido como três minutos para que o aplicativo lógico não seja executado com mais frequência do que o esperado e resulte em cobranças de cobrança imprevistas. Idealmente, defina o intervalo e a frequência para 30 segundos para que o aplicativo lógico seja acionado imediatamente quando uma mensagem chegar.
Property Necessário para este cenário valor Description Nome da fila Sim <nome da fila> O nome da fila do Service Bus criada anteriormente. Este exemplo usa "Fabrikam-Service-Bus-Queue". Tipo de fila Sim Principal Sua fila principal do Service Bus ID da sessão Sim Seguinte disponível Essa opção obtém uma sessão para cada execução de gatilho, com base na ID da sessão da mensagem na fila do Service Bus. A sessão também é bloqueada para que nenhum outro aplicativo lógico ou outro cliente possa processar mensagens relacionadas a essa sessão. As ações subsequentes do fluxo de trabalho processam todas as mensagens associadas a essa sessão, conforme descrito mais adiante neste artigo. Aqui estão mais informações sobre as outras opções de ID de sessão:
- Nenhum: a opção padrão, que resulta em nenhuma sessão e não pode ser usada para implementar o padrão de comboio sequencial.
- Insira o valor personalizado: use esta opção quando souber a ID da sessão que deseja usar e sempre quiser executar o gatilho para essa ID de sessão.
Observação: o conector do Service Bus pode salvar um número limitado de sessões exclusivas de cada vez do Barramento de Serviço do Azure no cache do conector. Se a contagem de sessões exceder esse limite, as sessões antigas serão removidas do cache. Para obter mais informações, consulte Mensagens do Exchange na nuvem com os Aplicativos Lógicos do Azure e o Barramento de Serviço do Azure.
Intervalo Sim <Número de intervalos> O número de unidades de tempo entre as recorrências antes de verificar uma mensagem. Frequência Sim Segundo, minuto, hora, dia, semana ou mês A unidade de tempo para a recorrência a ser usada ao verificar uma mensagem. Dica: Para adicionar um fuso horário ou uma hora de início, selecione essas propriedades na lista Adicionar novos parâmetros.
Para obter mais informações sobre o gatilho, consulte Service Bus - Quando uma mensagem é recebida em uma fila (peek-lock). O gatilho gera uma ServiceBusMessage.
Depois de inicializar a sessão, o fluxo de trabalho usa a ação Inicializar variável para criar uma variável booleana que inicialmente define e false
indica quando as seguintes condições são verdadeiras:
Não há mais mensagens na sessão disponíveis para leitura.
O bloqueio de sessão não precisa mais ser renovado para que a instância do fluxo de trabalho atual possa ser concluída.
Em seguida, no bloco Tentar , o fluxo de trabalho executa ações na primeira mensagem lida.
Manipular a mensagem inicial
A primeira ação é uma ação do Service Bus de espaço reservado, Enviar mensagem inicial para o tópico, que você pode substituir por qualquer outra ação que você deseja manipular a primeira mensagem da sessão na fila. O ID da sessão especifica a sessão de onde a mensagem se originou.
A ação do Barramento de Serviço de espaço reservado envia a primeira mensagem para um tópico do Barramento de Serviço especificado pela propriedade ID da Sessão . Dessa forma, todas as mensagens associadas a uma sessão específica vão para o mesmo tópico. Todas as propriedades de ID de sessão para ações subsequentes neste modelo usam o mesmo valor de ID de sessão.
Na ação Barramento de Serviço, Concluir mensagem inicial na fila, forneça o nome para a fila do Barramento de Serviço e mantenha todos os outros valores de propriedade padrão na ação.
Na ação Barramento de Serviço, Abandonar a mensagem inicial da fila, forneça o nome para a fila do Barramento de Serviço e mantenha todos os outros valores de propriedade padrão na ação.
Em seguida, você fornecerá as informações necessárias para as ações que seguem a ação Concluir mensagem inicial na fila . Você começará com as ações em Enquanto houver mais mensagens para a sessão no loop de fila .
Embora haja mais mensagens para a sessão na fila
Este loop Until executa essas ações enquanto as mensagens existem na fila ou até que uma hora passe. Para alterar o limite de tempo do loop, edite o valor da propriedade Timeout do loop.
Obtenha mensagens adicionais da fila enquanto as mensagens existem.
Verifique o número de mensagens restantes. Se as mensagens ainda existirem, continue processando as mensagens. Se não existirem mais mensagens, o fluxo de trabalho define a
isDone
variável comotrue
e sai do loop.
Na ação do Service Bus, Obter mensagens adicionais da sessão, forneça o nome para a fila do Service Bus. Caso contrário, mantenha todos os outros valores de propriedade padrão na ação.
Nota
Por padrão, o número máximo de mensagens é definido como
175
, mas esse limite é afetado pela propriedade tamanho e tamanho máximo da mensagem no Service Bus. Para obter mais informações, consulte Tamanho da mensagem para uma fila.Em seguida, o fluxo de trabalho se divide nestas ramificações paralelas:
Se ocorrer um erro ou falha durante a verificação de mensagens adicionais, defina a
isDone
variável comotrue
.O processo de mensagens se obtivermos alguma condição verifica se o número de mensagens restantes é zero. Se existirem mensagens falsas e mais falsas, continue a processar. Se true e não existirem mais mensagens, o fluxo de trabalho definirá a
isDone
variável comotrue
.
Na seção If false, um loop For each processa cada mensagem na ordem first-in, first-out (FIFO). Nas Configurações do loop, a configuração Controle de Simultaneidade é definida como , portanto
1
, apenas uma única mensagem é processada de cada vez.Para as ações do Service Bus, Concluir a mensagem em uma fila e Abandonar a mensagem em uma fila, forneça o nome para a fila do Service Bus.
Depois que o Enquanto houver mais mensagens para a sessão na fila for concluído, o fluxo de trabalho define a
isDone
variável comotrue
.
Em seguida, você fornecerá as informações necessárias para as ações no bloqueio Renovar sessão até o loop cancelado .
Renovar bloqueio de sessão até ser cancelado
Esse loop Until garante que o bloqueio de sessão seja mantido por esse aplicativo lógico enquanto as mensagens existirem na fila ou até que uma hora passe executando essas ações. Para alterar o limite de tempo do loop, edite o valor da propriedade Timeout do loop.
Atraso de 25 segundos ou um período de tempo inferior à duração do tempo limite de bloqueio para a fila que está a ser processada. A menor duração de bloqueio é de 30 segundos, portanto, o valor padrão é suficiente. No entanto, você pode otimizar o número de vezes que o loop é executado ajustando adequadamente.
Verifique se a
isDone
variável está definida comotrue
.Se
isDone
estiver definido comotrue
, o fluxo de trabalho ainda está processando mensagens, portanto, o fluxo de trabalho renova o bloqueio da sessão na fila e verifica a condição de loop novamente.Você precisa fornecer o nome para a fila do Service Bus na ação do Service Bus, Renovar bloqueio na sessão em uma fila.
Se
isDone
estiver definido comotrue
, o fluxo de trabalho não renovará o bloqueio na sessão na fila e sairá do loop.
Renovar bloqueio na sessão em uma fila
Esta ação do Service Bus renova o bloqueio da sessão na fila enquanto o fluxo de trabalho ainda está processando mensagens.
Na ação Barramento de Serviço, Renovar bloqueio na sessão em uma fila, forneça o nome para a fila do Barramento de Serviço.
Em seguida, você fornecerá as informações necessárias para a ação do Service Bus, Fechar uma sessão em uma fila e ter êxito.
Fechar uma sessão em uma fila e ter êxito
Esta ação do Service Bus fecha a sessão na fila depois que o fluxo de trabalho conclui o processamento de todas as mensagens disponíveis na fila ou o fluxo de trabalho abandona a mensagem inicial.
Na ação do Service Bus, Fechar uma sessão em uma fila e ter êxito, forneça o nome para a fila do Service Bus.
As seções a Catch
seguir descrevem as ações na seção, que lidam com erros e exceções que acontecem em seu fluxo de trabalho.
Fechar uma sessão numa fila e falhar
Essa ação do Service Bus sempre é executada Catch
como a primeira ação no escopo e fecha a sessão na fila.
Na ação do Service Bus, Fechar uma sessão em uma fila e falhar, forneça o nome para a fila do Service Bus.
Em seguida, o fluxo de trabalho cria uma matriz que tem as entradas e saídas de todas as ações no Try
escopo para que o aplicativo lógico possa acessar informações sobre o erro ou falha que aconteceu.
Encontrar mensagem de falha do bloco 'Tentar'
Esta ação Matriz de Filtro cria uma matriz que tem as entradas e saídas de todas as ações dentro do Try
escopo com base nos critérios especificados usando a result()
função. Nesse caso, essa ação retorna as saídas das ações que têm Failed
status usando a função e item()
a equals()
função.
Aqui está a definição JSON para esta ação:
"Find_failure_msg_from_'Try'_block": {
"inputs": {
"from": "@Result('Try')",
"where": "@equals(item()['status'], 'Failed')"
},
"runAfter": {
"Close_the_session_in_the_queue_and_fail": [
"Succeeded"
]
},
"type": "Query"
},
Em seguida, o fluxo de trabalho cria uma matriz com um objeto JSON que contém as informações de erro na matriz retornada da Find failure msg from 'Try' block
ação.
Selecionar detalhes do erro
Esta ação Selecionar cria uma matriz que contém objetos JSON com base na matriz de entrada que é saída da ação anterior, Find failure msg from 'Try' block
. Especificamente, essa ação retorna uma matriz que tem apenas as propriedades especificadas para cada objeto na matriz. Nesse caso, a matriz contém o nome da ação e as propriedades do resultado do erro.
Aqui está a definição JSON para esta ação:
"Select_error_details": {
"inputs": {
"from": "@body('Find_failure_msg_from_''Try''_block')[0]['outputs']",
"select": {
"action": "@item()['name']",
"errorResult": "@item()"
}
},
"runAfter": {
"Find_failure_msg_from_'Try'_block": [
"Succeeded"
]
},
"type": "Select"
},
Em seguida, o fluxo de trabalho interrompe a execução do aplicativo lógico e retorna o status da execução junto com mais informações sobre o erro ou falha que aconteceu.
Encerrar a execução do aplicativo lógico
Aqui está a definição JSON para esta ação:
"Terminate": {
"description": "This Failure Termination only runs if the Close Session upon Failure action runs - otherwise the LA will be terminated as Success",
"inputs": {
"runError": {
"code": "",
"message": "There was an error processing messages for Session ID @{triggerBody()?['SessionId']}. The following error(s) occurred: @{body('Select_error_details')['errorResult']}"
},
"runStatus": "Failed"
},
"runAfter": {
"Select_error_details": [
"Succeeded"
]
},
"type": "Terminate"
}
},
Salvar e executar o aplicativo lógico
Depois de concluir o modelo, agora você pode salvar seu aplicativo lógico. Na barra de ferramentas do estruturador, selecione Guardar.
Para testar seu aplicativo lógico, envie mensagens para a fila do Service Bus.
Próximos passos
- Saiba mais sobre os gatilhos e ações do conector do Service Bus