Enviar mensagens relacionadas em ordem usando o padrão de comboio sequencial nos Aplicativos Lógicos do Azure com o Barramento de Serviço do Azure
Aplica-se a: Aplicativos Lógicos do Azure (Consumo)
Quando você precisar enviar mensagens correlacionadas em determinada ordem, siga o padrão de comboio sequencial com os Aplicativos Lógicos do Azure e o conector do Barramento de Serviço do Azure. As mensagens correlacionadas têm uma propriedade que define a relação entre elas, como a ID da sessão no Barramento de Serviço.
Por exemplo, imagine que a "Sessão 1" tem 10 mensagens e a "Sessão 2' tem cinco mensagens, todas enviadas à mesma fila do Barramento de Serviço. Você pode criar um aplicativo lógico que processa as mensagens da fila para que todas as mensagens da "Sessão 1" sejam processadas por uma única execução de gatilho e todas as mensagens da "Sessão 2" sejam processadas pela execução do gatilho seguinte.
Este artigo mostra como criar um aplicativo lógico que implementa esse padrão por meio do modelo Correlata e entrega em ordem usando sessões de barramento de serviço. O 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) do conector do Barramento de Serviço, que recebe mensagens de uma fila do Barramento de Serviço. O aplicativo lógico realiza as seguintes etapas de alto nível:
Inicializar uma sessão com base em uma mensagem que o gatilho lê na fila do Barramento de Serviço.
Ler e processar todas as mensagens da mesma sessão na fila durante a execução do fluxo de trabalho atual.
Para examinar o arquivo JSON do modelo, confira GitHub: service-bus-sessions.json.
Veja mais informações em Padrão de comboio sequencial – Padrões de design de nuvem de arquitetura do Azure.
Pré-requisitos
Uma assinatura do Azure. Se você não tem uma assinatura, inscreva-se em uma conta gratuita do Azure.
Um namespace e uma fila do Barramento de Serviço, que é uma entidade de mensagens que você usará no aplicativo lógico. Esses itens e o aplicativo lógico precisam usar a mesma assinatura do Azure. Selecione Habilitar sessões ao criar a fila. Se você não tiver esses itens, saiba como criar seu namespace do Barramento de Serviço 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ê for novo em Aplicativos Lógicos do Azure, experimente oinício rápido que cria um exemplo de fluxo de trabalho de aplicativo lógico de Consumo nos Aplicativos Lógicos do Azure multilocatário.
Verificar o acesso ao namespace do Barramento de Serviço
Se você não sabe se o aplicativo lógico tem permissões para acessar o namespace do Barramento de Serviço, confirme as permissões.
Entre no portal do Azure. Encontre e selecione seu namespace do Barramento de Serviço.
No menu do 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 do namespace do Barramento de Serviço. Você pode usar essa cadeia de caracteres mais tarde quando criar uma conexão com o namespace no aplicativo lógico.
No painel Políticas de acesso compartilhadas, em Política, selecione RootManageSharedAccessKey.
Ao lado da cadeia de conexão primária, escolha o botão de cópia. Salve a cadeia de conexão para uso posterior.
Dica
Para confirmar se a cadeia de conexão está associada ao namespace do Barramento de Serviço ou a uma entidade de sistema de mensagens, como uma fila, pesquise a cadeia de conexão para o parâmetro
EntityPath
. Se encontrar esse parâmetro, a cadeia de conexão servirá para uma entidade específica e não será a cadeia correta a ser usada com seu aplicativo lógico.
Criar aplicativo lógico
Nesta seção, você criará um aplicativo lógico com o modelo Correlata e entrega em ordem usando sessões de barramento de serviço, que inclui o gatilho e as ações para implementar o padrão de fluxo de trabalho. Você também criará uma conexão com o namespace do Barramento de Serviço e especificará o nome da fila a ser usada.
No portal do Azure, crie um aplicativo lógico em branco. Na home page do Azure, selecione Criar um recurso>Integração>Aplicativo Lógico.
Quando a galeria de modelos aparecer, role além do vídeo e das seções de gatilhos comuns. Na seção Modelos, selecione o modelo Correlata e entrega em ordem usando sessões de barramento de serviço.
Quando a caixa de confirmação for exibida, selecione Usar este modelo.
No Designer de Aplicativo Lógico, na forma Barramento de Serviço, selecione Continuar e selecione o sinal de mais (+) que aparece na forma.
Agora, crie uma conexão com o Barramento de Serviço com uma das opções:
Para usar a cadeia de conexão que você copiou do namespace do Barramento de Serviço, siga estas etapas:
Selecione Insira as informações de conexão manualmente.
Em Nome da conexão, dê um nome à conexão. Cole a cadeia de conexão do namespace em Cadeia de Conexão e selecione Criar, por exemplo:
Dica
Se você não tem a cadeia de conexão, saiba como localizar e copiar a cadeia de conexão do namespace do Barramento de Serviço.
Para selecionar um namespace do Barramento de Serviço da sua assinatura atual do Azure, siga estas etapas:
Em Nome da conexão, dê um nome à conexão. Selecione o namespace em Namespace do Barramento de Serviço, por exemplo:
Quando o próximo painel for exibido, selecione sua política do Barramento de Serviço e depois Criar.
Quando terminar, selecione Continuar.
O Designer de Aplicativo Lógico agora mostra o modelo Correlata e entrega em ordem usando sessões de barramento de serviço, que contém um fluxo de trabalho já preenchido com um gatilho e ações, incluindo dois escopos que implementam o tratamento de erro seguindo o padrão
Try-Catch
.
Agora você pode aprender mais sobre o gatilho e as ações do modelo ou passar adiante para informar os valores do modelo de aplicativo lógico.
Resumo de modelo
Aqui está o fluxo de trabalho de nível superior no modelo Correlata e entrega em ordem usando sessões de barramento de serviço quando os detalhes estão recolhidos:
Nome | Descrição |
---|---|
When a message is received in a queue (peek-lock) |
Com base na recorrência especificada, o gatilho do Barramento de Serviço verifica se há mensagens na fila especificada. Se houver uma mensagem na fila, o gatilho vai disparar, o que criará e executará 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 houver mensagem, o gatilho a recupera e bloqueia para que não seja feito processamento na mensagem até a expiração do bloqueio. Para obter detalhes, inicialize a sessão. |
Init isDone |
A ação Inicializar variável cria uma variável booliana 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. Veja mais detalhes em Inicializar a sessão. |
Try |
Essa ação de Escopo contém as ações que são executadas para processar uma mensagem. Se um problema ocorrer no escopo Try , a ação do escopo Catch subsequente cuidará dele. Veja mais informações no escopo "Try". |
Catch |
Essa ação de escopo contém as ações que são executadas quando um problema ocorre no escopo Try anterior. Veja mais informações no Escopo "Catch". |
Escopo "Try"
Aqui está o fluxo de nível superior na ação do escopo Try
quando os detalhes são recolhidos:
Nome | Descrição |
---|---|
Send initial message to topic |
Você pode substituir essa ação por qualquer ação para processar a primeira mensagem da sessão na fila. A ID da sessão especifica a sessão. Para este modelo, uma ação do Barramento de Serviço envia a primeira mensagem a um tópico do Barramento de Serviço. Veja mais detalhes em Processar a mensagem inicial. |
(ramificação paralela) | Esta ação de ramificação paralela cria dois caminhos: - Ramificação nº 1: continuar processando a mensagem. Veja mais informações em Ramificação nº 1: concluir a mensagem inicial na fila. - Ramificação nº 2: abandonar a mensagem se algo der errado e liberar para retirada por outra execução de gatilho. Veja mais informações em Ramificação nº 2: abandonar a mensagem inicial da fila. Ambos os caminhos se unem posteriormente na ação Encerrar sessão em uma fila e ter êxito, descrita na próxima linha. |
Close a session in a queue and succeed |
Essa ação do Barramento de Serviço une as ramificações descritas anteriormente e fecha a sessão na fila após a ocorrência de um dos seguintes eventos: - O fluxo de trabalho conclui o processamento das mensagens disponíveis na fila. Veja mais detalhes em Encerrar uma sessão em uma fila e ter êxito. |
Ramificação nº 1: concluir a mensagem inicial na fila
Nome | Descrição |
---|---|
Complete initial message in queue |
Essa ação do Barramento de Serviço marca uma mensagem que foi recuperada como concluída e a remove da fila, para evitar o reprocessamento. Veja mais detalhes em Processar a mensagem inicial. |
While there are more messages for the session in the queue |
Esse loop Until continua a obter mensagens enquanto existem mensagens ou até uma hora se passar. Veja mais informações sobre as ações nesse loop em Enquanto houver mais mensagens para a sessão na fila. |
Set isDone = true |
Quando não houver mais mensagens, essa ação Definir variável definirá 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 houver mensagens ou pelo período de uma hora. Veja mais informações sobre as ações nesse loop em Renovar bloqueio de sessão até o cancelamento. |
Ramificação nº 2: abandonar a mensagem inicial da fila
Se a ação que processa a primeira mensagem falhar, a ação do Barramento de Serviço Abandonar a mensagem inicial da fila vai liberar a mensagem para que outra instância de fluxo de trabalho a capture e execute. Veja mais detalhes em Processar a mensagem inicial.
Escopo "Catch"
Se as ações no escopo Try
falharem, o aplicativo lógico ainda deverá fechar a sessão. A ação de escopo Catch
é executada quando a ação de escopo Try
resulta no status Failed
, Skipped
ou TimedOut
. O escopo retorna uma mensagem de erro que inclui a ID da sessão em que o problema ocorreu e encerra o aplicativo lógico.
Aqui está o fluxo de nível superior na ação do escopo Catch
quando os detalhes são recolhidos:
Nome | Descrição |
---|---|
Close a session in a queue and fail |
Essa ação do Barramento de Serviço fecha a sessão na fila para que o bloqueio da sessão não permaneça aberto. Veja mais detalhes em Encerrar uma sessão em uma fila e falhar. |
Find failure msg from 'Try' block |
Essa ação de matriz de filtro cria uma matriz das entradas e saídas de todas as ações no escopo Try com base nos critérios especificados. Nesse caso, a ação retorna as saídas das ações que resultaram no status Failed . Veja mais detalhes em Localizar mensagem de falha do bloco "Try". |
Select error details |
Essa ação Selecionar cria uma matriz que contém objetos JSON com base nos critérios especificados. Esses objetos JSON são criados usando os 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 com base nos detalhes do erro retornados na ação anterior. Veja mais detalhes em Selecionar detalhes do erro. |
Terminate |
Essa ação Terminar interrompe a execução do fluxo de trabalho, cancela as ações em andamento, ignora as ações restantes e retorna o status especificado, a ID da sessão e o resultado do erro da ação Select error details . Veja mais detalhes em Terminar aplicativo lógico. |
Conclua o modelo
Para informar os valores do gatilho e das ações no modelo Correlata e entrega em ordem usando sessões de barramento de serviço, siga estas etapas. Você precisa informar todos os valores necessários, que são marcados por um asterisco ( * ), para salvar o aplicativo lógico.
Inicializar a sessão
Para o gatilho Quando uma mensagem é recebida em uma fila (peek-lock) , informe os dados abaixo para que o modelo possa inicializar uma sessão usando a propriedade ID da sessão, por exemplo:
Observação
Inicialmente, o intervalo de sondagem é de três minutos para que o aplicativo lógico não seja executado com mais frequência do que o esperado e resulte em encargos de cobrança inesperados. Idealmente, defina o intervalo e a frequência como 30 segundos para que o aplicativo lógico seja disparado imediatamente quando uma mensagem chegar.
Propriedade Obrigatório para este cenário Valor Descrição Nome da fila Sim <nome da fila> O nome da fila do Barramento de Serviço que você criou. Neste exemplo, usamos "Fabrikam-Service-Bus-Queue". Tipo de fila Sim Principal A fila principal do Barramento de Serviço ID da sessão Sim Próximo disponível Essa opção obtém uma sessão para cada execução de gatilho, com base na ID de sessão da mensagem na fila do Barramento de Serviço. A sessão também é bloqueada para que nenhum outro aplicativo lógico ou cliente possa processar as mensagens relacionadas à sessão. As ações subsequentes do fluxo de trabalho processam todas as mensagens associadas a essa sessão, conforme descrito posteriormente neste artigo. Aqui estão mais informações sobre as outras opções da 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.
- Inserir valor personalizado: use essa opção quando você sabe a ID de sessão que deseja usar e sempre executa o gatilho para essa ID.
Observação: o conector do Barramento de Serviço pode salvar um número limitado de sessões exclusivas por vez do Barramento de Serviço do Azure para o cache do conector. Se a contagem de sessões exceder esse limite, as sessões antigas serão removidas do cache. Veja mais informações em Trocar mensagens na nuvem com os Aplicativos Lógicos do Azure e o Barramento de Serviço do Azure.
Intervalo Sim <number-of-intervals> 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 da recorrência a ser usada ao verificar se há mensagens. Dica: para adicionar um fuso horário ou uma hora de início, selecione essas propriedades na lista Adicionar novo parâmetro.
Veja mais informações sobre gatilhos em Barramento de Serviço – Quando uma mensagem é recebida em uma fila (peek-lock). O gatilho gera um ServiceBusMessage.
Depois de inicializar a sessão, o fluxo de trabalho usa a ação Inicializar variável para criar uma variável booliana que inicialmente é 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.
Não é preciso renovar o bloqueio de sessão, e a instância de fluxo de trabalho atual pode ser encerrada.
Em seguida, no bloco Try, o fluxo de trabalho executa ações na primeira mensagem que é lida.
Manipular a mensagem inicial
A primeira ação é uma ação de espaço reservado do Barramento de Serviço, Enviar mensagem inicial ao tópico, que você pode substituir por outra ação que processe a primeira mensagem da sessão na fila. A ID da sessão especifica a sessão de origem da mensagem.
A ação do Barramento de Serviço de espaço reservado envia a primeira mensagem a um tópico do Barramento de Serviço que é especificado pela propriedade ID da sessão. Dessa forma, todas as mensagens associadas a uma sessão específica vão ao mesmo tópico. Todas as propriedades de ID de sessão das ações subsequentes no modelo usam o mesmo valor.
Na ação do Barramento de Serviço Concluir a mensagem inicial na fila, informe o nome da fila do Barramento de Serviço e mantenha todos os outros valores de propriedade padrão na ação.
Na ação do Barramento de Serviço Abandonar a mensagem inicial da fila, informe o nome da fila do Barramento de Serviço e mantenha todos os outros valores de propriedade padrão na ação.
Em seguida, você informará os dados necessários para as ações que seguem a ação Concluir mensagem inicial na fila. Você começará com as ações no loop Enquanto houver mais mensagens para a sessão na fila.
Enquanto houver mais mensagens para a sessão na fila
Esse loop Until executa estas ações enquanto houver mensagens na fila ou durante uma hora. Para alterar o limite de tempo do loop, edite o valor da propriedade Tempo limite dele.
Obter mais mensagens da fila enquanto houver mensagens.
Verificar o número de mensagens restantes. Se ainda houver mensagens, continuar processando mensagens. Se não houver mais mensagens, o fluxo de trabalho definirá a variável
isDone
comotrue
e sairá do loop.
Na ação do Barramento de Serviço Obter mais mensagens da sessão, informe o nome da fila do Barramento de Serviço. Mantenha todos os outros valores de propriedade padrão na ação.
Observação
Por padrão, o número máximo de mensagens é
175
, mas esse limite é afetado pelo tamanho das mensagens e pela propriedade de tamanho máximo de mensagens no Barramento de Serviço. Veja mais informações em Tamanho das mensagens de 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 variável
isDone
comotrue
.A condição Processar mensagens se houver alguma verifica se o número de mensagens restantes é zero. Se for falso e houver mais mensagens, continuar o processamento. Se for verdadeiro e não houver mais mensagens, o fluxo de trabalho definirá a variável
isDone
comotrue
.
Na seção Se falso, um loop Para cada processa cada mensagem na ordem de chegada. Nas configurações do loop, a configuração Controle de Simultaneidade é definida como
1
, portanto, apenas uma única mensagem é processada de cada vez.Para as ações do Barramento de Serviço Concluir a mensagem em uma fila e Abandonar a mensagem em uma fila, informe o nome da fila do Barramento de Serviço.
Após a conclusão de Enquanto houver mais mensagens para a sessão na fila, o fluxo de trabalho define a variável
isDone
comotrue
.
Em seguida, você informará os dados necessários para as ações no loop Renovar bloqueio de sessão até o cancelamento.
Renovar bloqueio de sessão até o cancelamento
Esse loop Until garante que o bloqueio de sessão seja mantido por esse aplicativo lógico enquanto houver mensagens na fila ou pelo menos após uma hora de execução das ações. Para alterar o limite de tempo do loop, edite o valor da propriedade Tempo limite dele.
Atraso por 25 segundos ou um período menor que a duração do tempo limite de bloqueio da fila que está sendo 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 com os ajustes adequados.
Verifique se a variável
isDone
está definida comotrue
.Se
isDone
está definido comotrue
, o fluxo de trabalho ainda está processando mensagens, portanto, o fluxo de trabalho renova o bloqueio na sessão na fila e verifica a condição de loop novamente.Você precisa informar o nome da fila do Barramento de Serviço na ação do Barramento de Serviço Renovar o 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 o bloqueio na sessão em uma fila
Essa ação do Barramento de Serviço renova o bloqueio na sessão na fila enquanto o fluxo de trabalho ainda está processando mensagens.
Na ação do Barramento de Serviço Renovar bloqueio de sessão em uma fila, informe o nome da fila do Barramento de Serviço.
Em seguida, você informará os dados necessários para a ação do Barramento de Serviço Fechar uma sessão em uma fila e ter êxito.
Fechar uma sessão em uma fila e ter êxito
Essa ação do Barramento de Serviço fecha a sessão na fila depois que o fluxo de trabalho termina de processar todas as mensagens disponíveis na fila ou quando o fluxo de trabalho abandona a mensagem inicial.
Na ação do Barramento de Serviço Fechar uma sessão em uma fila e ter êxito, informe o nome da fila do Barramento de Serviço.
As seções a seguir descrevem as ações na seção Catch
, que trata de erros e exceções que ocorrem em um fluxo de trabalho.
Fechar uma sessão em uma fila e falhar
Essa ação do Barramento de Serviço sempre é executada como a primeira ação no escopo Catch
e fecha a sessão na fila.
Na ação do Barramento de Serviço Fechar uma sessão em uma fila e falhar, informe o nome da fila do Barramento de Serviço.
Em seguida, o fluxo de trabalho cria uma matriz que tem as entradas e saídas de todas as ações no escopo Try
, para que o aplicativo lógico possa acessar informações sobre o erro ou a falha ocorrida.
Localizar mensagem de falha do bloco "Try"
Essa ação de matriz de filtro cria uma matriz que tem entradas e saídas de todas as ações no escopo Try
com base nos critérios especificados, usando a função result()
. Nesse caso, essa ação retorna as saídas das ações que têm status Failed
usando a função equals()
e a função item()
.
Aqui está a definição de JSON da 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 ação Find failure msg from 'Try' block
.
Selecione detalhes do erro
Essa ação Selecionar cria uma matriz que contém objetos JSON com base na matriz de entrada que faz a 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 as propriedades nome da ação e resultado do erro.
Aqui está a definição de JSON da 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 com mais informações sobre o erro ou a falha que aconteceu.
Encerrar execução do aplicativo lógico
Essa ação Terminar interrompe a execução do aplicativo lógico e retorna Failed
como o status da execução do aplicativo lógico junto com a ID da sessão e o resultado do erro da ação Select error details
.
Aqui está a definição de JSON da 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"
}
},
Salve e execute o aplicativo lógico
Depois de concluir o modelo, agora você pode salvar o aplicativo lógico. Selecione Salvar na barra de ferramentas do designer.
Para testar o aplicativo lógico, envie mensagens à fila do Barramento de Serviço.
Próximas etapas
- Saiba mais sobre os gatilhos e as ações do conector do Barramento de Serviço