1 of 46

Trilha Microsserviços�Message patterns

Padrões de Comunicação Assíncrona em Microsserviços

Tania Raquel Stormovski

Qual problema resolvem?

Software Architect at Ambev Tech

Globalcode – Open4education

2 of 46

Sobre mim��Me chamo Tania Raquel Stormovski sou arquiteta de software na Ambev Tech

Possuo mais de 15 anos de experiência em desenvolvimento e arquitetura de sistemas.�Atuei em liderança técnica,

liderança de chapter e gestão de times.�Nos últimos venho me dedicando majoritariamente à arquitetura.

Globalcode – Open4education

3 of 46

Motivação�

  • Microsserviços trazem um aumento exponencial da necessidade de comunicação assíncrona por sua natureza distribuída e independente.�
  • Desafios enfrentados na comunicação entre os sistemas e componentes.�
  • Importância de uma infraestrutura de mensagens bem estruturada para conectar microsserviços de forma escalável e desacoplada.

Globalcode – Open4education

4 of 46

Design patterns

Fornecem um vocabulário neutro em termos de tecnologia para descrever soluções comuns e trade-offs de design

Frameworks side/effect :

“Pattern Winter” crença de que os frameworks anteciparam as decisões de arquitetura mais críticas

Microsserviços trouxeram também um interesse renovado em arquitetura de software e padrões (por exemplo, Microservices Patterns, 2018 - Chris Richardson) pois adotam arquiteturas mais sofisticadas suportadas pela cloud.

Globalcode – Open4education

5 of 46

Lock-in

  • Plataformas de tecnologia

Incitam a pensar em componentes da plataforma ao invés de construções de solução.

  • Mental Lock-in : Experiências anteriores

Impedem de adotar arquiteturas modernas (ou diferentes) ou abominam um estilo arquitetural que foi apenas mal implementado.

“Usar mensageria da maneira correta não é escolher a sua tecnologia preferida. É entender a natureza das operações e tipos de mensagens a serem trocadas entre os sistemas e componentes, para então tomar a melhor decisão do que se aplica melhor ao nosso cenário .”

Globalcode – Open4education

6 of 46

Projetar e desenvolver aplicações distribuídas ou integrar aplicações existentes.� Pattern language consisting of 65 integration patterns ��O padrões promovem

  • Independência de tecnologia
  • Notação visual
  • Solução para problemas recorrentes e “gotchas” (armadilhas)

Globalcode – Open4education

7 of 46

Message Patterns

“Os padrões devem ser prescritivos, o que significa que eles devem dizer a você o que fazer. �Eles não apenas descrevem um problema e não apenas descrevem como resolvê-lo - eles dizem o que fazer para resolvê-lo. �Cada padrão representa uma decisão que você deve tomar: �“Devo usar mensageria?” �“Uma Mensagem de Comando me ajudaria aqui?” �O objetivo dos padrões e da linguagem de padrões é ajudá-lo a tomar decisões que levem a uma boa solução para o seu problema específico”��Gregor Hohpe

Globalcode – Open4education

8 of 46

Globalcode – Open4education

9 of 46

As mensagens assíncronas são uma ótima maneira de os sistemas distribuídos se comunicarem, mantendo o baixo acoplamento porém:

Porém projetar conversas robustas não é uma tarefa simples:

  • Perda e/ou atraso de mensagens
  • Sobrecarga de mensagens
  • Ordenação
  • Estado dos participantes ficando fora de sincronia
  • Timeouts
  • … muitas outras coisas podem dar errado em sistemas distribuídos que se comunicam por redes nem sempre confiáveis.

Globalcode – Open4education

10 of 46

Como posso integrar sistemas para que funcionem juntos e possam trocar informações?

Remote Procedure Invocation(..COM.. .NET..SOAP .. REST.. gRPC, middle layers as Api Gateways)

Estilos de Integração

Globalcode – Open4education

11 of 46

Message Patterns

Globalcode – Open4education

12 of 46

Message Systems

Messaging Systems

Message Chanel

Como um aplicativo se comunica com outro usando mensagens?

Message

Como duas aplicações conectadas por um canal de mensagens podem trocar uma informação?

Como podemos dividir um processamento complexo em tarefas menores mantendo independência e flexibilidade?

Como você pode desacoplar as etapas de processamento individuais para que as mensagens possam ser passadas para diferentes filtros, dependendo de um conjunto de condições?

Como os sistemas que usam diferentes formatos de dados podem se comunicar uns com os outros usando mensagens?

Como um aplicativo se conecta a um canal de mensagens para enviar e receber mensagens?

Globalcode – Open4education

13 of 46

Message Construction

Message Construction

Como as mensagens podem ser usadas para invocar um procedimento em outro aplicativo?

Document Message

Como as mensagens podem ser usadas para transferir dados entre aplicativos?

Event Message

Como as mensagens podem ser usadas para transmitir eventos de um aplicativo para outro?

Request-Reply

Quando um aplicativo envia uma mensagem, como ele pode obter uma resposta do remetente?

Correlation Identifier

Como um solicitante que recebeu uma resposta sabe para qual solicitação essa resposta é?

Message Sequence

Como as mensagens podem transmitir uma quantidade arbitrariamente grande de dados ou fazer parte de um grupo de mensagens?

Globalcode – Open4education

14 of 46

Exemplo de mensagens com diferentes intenções

Cenário: Inventário de Produtos

Document Message:

Produto (Estado inteiro em um dado momento de tempo) �Nome:Malte�Categoria:Insumo�Tipo:Ingrediente�Fabricação: 12/05/2023

Event Message

ProdutoInserido�ProdutoDescontinuado

Command Message

AdicionarProduto�DesabilitarProduto�DeletarProduto

Query Message

ObterProduto

Globalcode – Open4education

15 of 46

Message Construction

Perguntas comuns que precisamos responder ao definir a estrutura e o conteúdo de nossas mensagens�

Pattern

Implementação

Document Message:

Transferir uma estrutura de dados

Conteúdo é mais importante do que tempo

Sem instruções ao receptor

Pode ser implementada como uma mensagem que transmitida por Filas e Tópicos, utilizando por exemplo Azure Service Bus como Channel de Mensagens .

Command Message:

Contém uma instrução clara e geralmente tem um receptor específico

Acoplamento remetente ao receptor

Dada a natureza unidirecional de uma mensagem de comando filas são mais adequadas como canais de mensagens para transmiti-los

Globalcode – Open4education

16 of 46

Message Construction

Perguntas comuns que precisamos responder ao definir a estrutura e o conteúdo de nossas mensagens�

Pattern

Implementação

Event Message:

Notifica algo que aconteceu sobre um objeto�Descrição do que aconteceu mas não o estado completo*�O tempo geralmente é um fator importante

Geralmente consumida por Event-Driven Consumer

Tópico Azure Event Grid

�Através de uma exchange do Rabbit��Em um tópico do Kafka

Query Message:

Instruir o receptor sobre que informações devem ser retornadas ao chamador.

Acoplamento do remetente com o receptor

Da mesma forma que a mensagem de comando , as filas são mais adequadas como canais de mensagens para transmiti-los.

Globalcode – Open4education

17 of 46

Message Construction

Perguntas comuns que precisamos responder ao definir a estrutura e o conteúdo de nossas mensagens�

Pattern

Implementação

Message Sequence:

Quantidade de dados a serem transmitidos não cabem em uma única mensagem, por conta do tamanho ou outras restrições ou mensagem que tenham dependência de outras mensagens e precisam ser processadas em uma determinada sequência

  • Sequence Identifier : para distinguir o grupo de mensagens.
  • Position Identifier: para ordenar cada mensagem em uma sequência
  • Size or End Indicator: para indicar o número de mensagens do grupo ou identificar a última mensagem do grupo.

O Azure Service Bus permite implementar o Sequence Pattern usando o cabeçalho da sessão SessionId como identificador de sequência. ��Para Position Identifier, podemos usar o cabeçalho SequenceNumber

Size or End poder ser definidos através de custom properties�

Globalcode – Open4education

18 of 46

Messaging Channels

Messaging Channels

Como o remetente pode ter certeza de que exatamente um destinatário receberá o documento ou realizará a chamada?

Como o remetente pode transmitir a mensagem para vários receptores interessados?

Como um destinatário de mensagens pode lidar com o recebimento de uma mensagem que não faz sentido?

O que o sistema de mensagens fará com uma mensagem que não pode entregar?

Como o remetente pode ter certeza de que uma mensagem será entregue, mesmo que o sistema de mensagens falhe?

Como vários sistemas de mensagens podem ser conectados de modo que as mensagens disponíveis em um também estejam disponíveis nos outros?

Globalcode – Open4education

19 of 46

Messaging Routing

Message Filter

Como podemos evitar que mensagens não relevantes sejam entregues?

Como você mantém o fluxo geral de mensagens quando uma mensagem precisa ser enviada para vários destinatários, cada um dos quais pode enviar uma resposta?

Content-Based Router

Como implementamos o roteamento dinâmico com base no conteúdo ou nos cabeçalhos de uma mensagem?

Splitter

Como podemos processar uma mensagem se ela contém vários elementos, cada um dos quais deve ser processado de maneira diferente?

Recipient List

Como podemos deixar a mensagem definir a lista de receptores dinamicamente?

Aggregator

Como combinamos os resultados de mensagens individuais, mas relacionadas, para que possam ser processadas como um todo?

Como podemos colocar um fluxo de mensagens relacionadas, mas fora de sequência, de volta na ordem correta?

Globalcode – Open4education

20 of 46

Globalcode – Open4education

21 of 46

Routers

Pattern

Number of Messages Consumed

Number of Messages Published

Stateful?

1

1

No (mostly)

1

0 or 1

No (mostly)

1

multiple (incl. 0)

No

1

multiple

No

multiple

1

Yes

multiple

multiple

Yes

Globalcode – Open4education

22 of 46

Message Transformation

Globalcode – Open4education

23 of 46

Message

Endpoints

Globalcode – Open4education

24 of 46

Arquitetura Acoplada a

Componentes Técnicos

Expressar arquitetura apenas em componentes técnicos

Ao descrever sua solução através dos componentes de plataforma ou linguagem, corre-se o risco de perder a intenção original.�

Exemplo

Globalcode – Open4education

25 of 46

Arquitetura Desacoplada

baseada em EIP Patterns

Expressar arquitetura através de message patterns EIP

Ao expressar a sua solução em termos de padrões de projeto fica mais simples portar para outra plataforma, entendermos de fato como o fluxo de mensagem deve se comportar.

Exemplo

Globalcode – Open4education

26 of 46

Globalcode – Open4education

27 of 46

Design with Components Draw.io

Globalcode – Open4education

28 of 46

Globalcode – Open4education

29 of 46

Message Construction

Perguntas comuns que precisamos responder ao definir a estrutura e o conteúdo de nossas mensagens�

Desafio

Patterns

Como definir e estruturar minhas mensagens?

Que dados devo incluir?

Globalcode – Open4education

30 of 46

Message Construction

Perguntas comuns que precisamos responder ao definir a estrutura e o conteúdo de nossas mensagens�

Desafios

Patterns

Como podemos identificar quando as mensagens devem ser processadas como parte de um grupo e em uma determinada sequência?��Como transmitir uma quantidade grande, arbitrária de dados?

Globalcode – Open4education

31 of 46

Messaging Channels

Perguntas comuns que precisamos responder ao definir quais canais vão transportar as nossas mensagens�

Desafio

Patterns

Devemos implementar uma interface direta entre o emissor e o receptor das nossas mensagens ou remetente não precisa ter ciência nenhuma do destinatário?

Globalcode – Open4education

32 of 46

Message Construction

Perguntas comuns que precisamos responder ao definir a estrutura e o conteúdo de nossas mensagens�

Pattern

Implementação

Point-to-Point Channel :

Remetente está ciente de um destinatário que deve receber e processar a mensagem. É comum que Mensagens de Comando ou Mensagens de Consulta

Uma fila deve ter apenas um consumidor, dessa forma é comum que o remetente que coloca a mensagem na fila esteja ciente do destinatário.�

Azure Service Bus Queue

Publish-Subscribe Channel

Permite enviar uma mensagem para todos os receptores interessados ​​disponíveis (assinantes). Nesse padrão, o remetente não precisa saber quem está assinando as mensagens, cada um dos assinantes ativos terá sua cópia de cada mensagem.

Azure Service Bus Azure Event Grid�Kafka�RabbitMQ

Globalcode – Open4education

33 of 46

Exemplo:��Tópico Kafka três partições divididas em dois consumidores

Um Message Router distribui as mensagens por três Point-to-Point Channels.

Esse roteador geralmente é um Content-Based Router que funciona com a Key da mensagem.

(assegura que as mensagens relacionadas vão para a mesma partição preservando ordem que não é garantida entre as partições.)

Esse design implica que a decisão de qual consumidor recebe a mensagem é feita a priori, o que significa que os consumidores não competem de fato, mas sim leem de canais independentes. Isso limita a capacidade de balanceamento de carga entre os consumidores, por exemplo, se um canal estiver vazio, o consumidor correspondente não poderá atender outros consumidores cujos canais ainda tenham mensagens. Além disso, como o número de partições é definido de forma independente, nem todos os consumidores atenderão ao mesmo número de partições, conforme ilustrado no exemplo acima

Globalcode – Open4education

34 of 46

Exemplo:��O RabbitMQ permite uma implementação direta do canal Publish-Subscribe Channel com Message Filters por meio de uma direct exchange que coloca as mensagens recebidas em uma fila de com base na Routing Key de uma mensagem e na Binding Key da fila

Um Message Filter distribui as mensagens por 2 Point-to-Point Channels.

O consumidor é um Event-Driven Consumer (padrão no rabbit) chamado toda vez que uma mensagem é recebida. Também é conhecido como asynchronous receiver, porque o receptor não tem um thread em execução até que um thread de callback entregue uma mensagem.

Globalcode – Open4education

35 of 46

Messaging Channels

Perguntas comuns que precisamos responder ao definir quais canais vão transportar as nossas mensagens�

Desafio

Patterns

Como o aplicativo destinatário deve receber a mensagem?

Ele precisa receber a mensagem do canal ou o canal deve enviar a mensagem para ele?

Globalcode – Open4education

36 of 46

Message Construction

Pattern

Implementação

A Push-Pull Channel

É um canal de mensagens que não pode enviar mensagens para os aplicativos receptores pretendidos. Assim, cabe ao aplicativo receptor puxar as mensagens do canal. Esse tipo de canal se encaixa bem com o consumidor de pesquisa.

Azure Service Bus��Tópicos do Kafka

Push-Push �É um canal de mensagens capaz de enviar mensagens para os aplicativos receptores pretendidos. Assim, o aplicativo receptor deve ser capaz de receber as mensagens e estar disponível. Esse padrão de Canal de Mensagens se ajusta bem ao Consumidor Orientado a Eventos. Além disso, os Canais Push-Push são ideais para Mensagens de Evento

O Azure Event Grid é um Canal Push-Push ideal para Mensagens de Evento. ��Dado que o Event Grid envia as mensagens para o aplicativo receptor pretendido, o aplicativo deve estar disponível.

Event Grid oferece retries configuráveis e dead-lettering

Globalcode – Open4education

37 of 46

Messaging Channels

Perguntas comuns que precisamos responder ao definir quais canais vão transportar as nossas mensagens�

Desafio

Patterns

Como gerenciamos as mensagens inválidas que passam pelo canal?�

Onde armazenamos mensagens quando elas não podem mais ser processadas pelo destinatário pretendido?

Globalcode – Open4education

38 of 46

Message Construction

Perguntas comuns que precisamos responder ao definir a estrutura e o conteúdo de nossas mensagens�

Pattern

Implementação

Invalid Message Channel

O canal de mensagens inválidas é um canal para o qual um canal de mensagens ou o aplicativo receptor pode entregar essas mensagens inválidas de maneira elegante sem perdê-las.

De valores obrigatórios ausentes a valores inválidos, a uma estrutura de mensagem inválida e a tipos de mensagem inválidos. Em todos esses casos, não adianta tentar novamente o processamento da mensagem, pois ela continuará falhando nas validações.

Azure Service Bus Queues and Topics , há uma subfila de Dead-Letters, mas não uma subfila separada de Mensagens Inválidas. No entanto, podemos usar os campos DeadLetterReason e DeadLetterErrorDescription para especificar a causa do envio da mensagem para a subfila. Dado que o Barramento de Serviço não fornece Validação de Mensagem (*), isso deve ocorrer no aplicativo receptor e esse aplicativo seria responsável por mover a mensagem para a subfila correspondente ao especificar o motivo..��Quando o Event-Grid tenta entregar um evento e recebe um código de resposta Http 400 (Bad Request) ou Http 413 (Request Entity Too Large) do receptor, ele imediatamente envia o evento para o ponto final de mensagens mortas. A Validação de Mensagem (*) deve ocorrer no aplicativo receptor e esse aplicativo deve retornar o código de status Http correspondente para a Grade de Eventos. No momento da redação, a grade de eventos oferece suporte apenas para gravar mensagens inválidas em um blob, que não pode ser considerado um canal de mensagens adequado. Então cabe à solução ou ao administrador puxar esses eventos para resolver as entregas.

Dead Letter Channel

No padrão anterior, descrevemos como lidar com mensagens que não podem ser processadas quando a mensagem é inválida. Mas, e se a mensagem for válida, mas não puder ser entregue ao destinatário pretendido? Isso pode acontecer por vários motivos, desde a indisponibilidade do destinatário, a uma falha de comunicação com o destinatário, a não ser capaz de identificar o destinatário, a uma mensagem expirada. Quando o canal não pode entregar a mensagem, deve haver uma maneira elegante de remover a mensagem da fila ou assinatura do tópico e deixá-la em outro lugar para um tipo diferente de processamento ou solução de problemas. Este é o propósito de um Dead Letter Channel.

Barramento de Serviço do Azure fornece uma subfila de mensagens mortas e subassinaturas para que as mensagens que não podem ser entregues possam ser movidas para lá. As mensagens também podem ser movidas para a letra morta se seu TimeToLive for excedido ou quando todas as novas tentativas (MaxDeliveryCount) forem esgotadas.

Globalcode – Open4education

39 of 46

Messaging Channels

Perguntas comuns que precisamos responder ao definir quais canais vão transportar as nossas mensagens�

Desafio

Patterns

Como podemos ter certeza de que uma mensagem é entregue ao destinatário pretendido?

Como podemos garantir que tentativas de entrega repetidas não tenham um impacto negativo na integridade ou no desempenho do destinatário pretendido?

Globalcode – Open4education

40 of 46

Message Construction

Perguntas comuns que precisamos responder ao definir a estrutura e o conteúdo de nossas mensagens�

Pattern

Implementação

Guaranteed Delivery

Quando o destinatário não está disponível ou acessível através da rede, o sistema de mensagens pode armazenar a mensagem e tentar entregá-la novamente até que o destinatário esteja acessível ou disponível. Para fazer isso, o canal de mensagens não deve apenas ter a mensagem na memória, mas também persisti-la no disco para que a mensagem sobreviva a uma falha no canal.

Event Grid oferece suporte a novas tentativas de entrega de eventos aos aplicativos receptores. Ele implementa a política de retirada exponencial para evitar a sobrecarga de endpoints não saudáveis ​​ou minimizar o tráfego quando o endpoint fica inativo por um longo período. No entanto, no momento em que escrevo, ele tenta novamente em até 24 horas.

��

O padrão Circuit Breaker �pode impedir sistemas downstream sejam sobrecarregados com mensagens que provavelmente falharão devido à indisponibilidade ou ao status não íntegro do sistema downstream. Ao implementar esse padrão, a solução deve ser capaz de detectar falhas no aplicativo receptor e interromper o envio de mensagens quando é improvável que sejam processadas com sucesso. Ao mesmo tempo, a solução deve detectar quando a falha foi resolvida para que possa retomar o envio das mensagens em fila.

Esse padrão não é um recurso interno de nenhum dos Serviços de Integração do Azure. No entanto, Jeff Hollan, gerente de programa da equipe Azure maneira de implementar esse padrão usando Aplicativos Lógicos e Azure Functions. A solução descrita em sua postagem depende do cache Redis como um estado compartilhado em todas as instâncias (consumidores concorrentes) que processam as mensagens e um aplicativo lógico como um gerenciador de processos que pode gerenciar o estado do circuito (aberto ou fechado). A solução descrita usa Hubs de Eventos, mas pode ser facilmente implementada com o Barramento de Serviço do Azure.

Globalcode – Open4education

41 of 46

Messaging Endpoints

Perguntas comuns que precisamos responder ao definir como as aplicações se conectam aos canais( channels) de mensagens�

Desafio

Patterns

Como um cliente pode controlar suas Como implementamos transações para que as mensagens não sejam perdidas no processo de envio ou recebimento de uma mensagem para ou de um canal?

Globalcode – Open4education

42 of 46

Message Construction

Perguntas comuns que precisamos responder ao definir a estrutura e o conteúdo de nossas mensagens�

Pattern

Implementação

Transactional Client

é a implementação de limites de uma transação atômica para que as mensagens não sejam perdidas no processo de envio ou recebimento. O escopo da transação também pode ir além, por exemplo:

  • Database to Message:so that the object is not marked as processed or deleted on the sender application’s database until it has been successfully sent to the Messaging Channel.
  • para que o objeto não seja marcado como processado ou excluído no banco de dados do aplicativo remetente até que seja enviado com sucesso
  • Message to Database:
  • para que a mensagem não seja excluída do canal de mensagens até que seja confirmada no banco de dados de destino no aplicativo receptor.
  • this can easily be implemented using Service Bus, a Logic App workflow, and a Logic App connector. The Logic App workflow trigger would be a Peek-Lock on the Service Bus queue or topic subscription. Later, the workflow will try to deliver the message to the receiver application. Only if the delivery is successful, the message is completed on Service Bus, otherwise, the message will be abandoned so that a new instance of the workflow can retry later. This pattern was described in detail in the previous post, in the Guaranteed Delivery pattern.
  • Message Groups: A Logic App workflow can be implemented to receive all messages within a session from a Service Bus queue or topic subscription and only commit the transaction if all messages have been received and processed successfully.
  • Receive-Send Message Pairs: To implement this pattern, a Logic App workflow could be utilised, so a message is not completed on a queue or topic subscription until a correlated message is successfully sent to another queue or topic.
  • Send-Receive Message Pairs: This pattern can be implemented on a Logic App workflow, implementing the Request-Reply pattern, either using the webhook action, or Service Bus sessions, and not committing or completing the request message, until the reply is received.

Globalcode – Open4education

43 of 46

Messaging Endpoints

Perguntas comuns que precisamos responder ao definir como as aplicações se conectam aos canais ( channels) de mensagens�

Desafio

Patterns

Como podemos processar várias mensagens ao mesmo tempo com vários workers no aplicativo receptor?��Como podemos controlar quantas mensagens são processadas em um determinado momento com base nos requisitos ou na capacidade do receptor?

Globalcode – Open4education

44 of 46

Message Construction

Perguntas comuns que precisamos responder ao definir a estrutura e o conteúdo de nossas mensagens�

Pattern

Implementação

Competing Consumers

é a implementação de limites de uma transação atômica para que as mensagens não sejam perdidas no processo de envio ou recebimento. O escopo da transação também pode ir além, por exemplo:��Ao consumir mensagens de uma fila, ter um único trabalhador de processamento pode resultar em mensagens sendo empilhadas no canal, o que pode afetar a taxa de transferência. Ter consumidores concorrentes processando mensagens em paralelo de um canal permite reduzir gargalos e aumentar o rendimento. Ter vários consumidores trabalhando em paralelo pode trazer o risco de processar a mesma mensagem várias vezes. Para evitar isso, duas abordagens podem ser usadas: ��Destructive Read Leitura Destrutiva: significa que uma vez que uma mensagem é capturada por um dos consumidores, a mensagem é imediatamente removida do canal. Essa abordagem é muito simples, porém, não muito resiliente. As mensagens podem ser perdidas se ocorrer uma falha.

Non-destructive Read: para minimizar o risco de perda de mensagens em caso de falhas, uma mensagem pode ser mantida trancada no canal após ser captada, para que nenhum outro consumidor possa pegá-la. Em seguida, a mensagem pode ser removida depois de processada com sucesso, o bloqueio pode ser renovado se o processamento estiver demorando mais do que a duração do bloqueio ou a mensagem pode ser desbloqueada se ocorrer uma falha temporária para que possa ser processada novamente por qualquer um dos os Consumidores Concorrentes.

Logic Apps implementam o padrão Consumidor Competitivo com Barramento de Serviço pronto para uso. Por padrão, o fluxo de trabalho será expandido para várias instâncias para processar várias mensagens em paralelo. Os aplicativos lógicos permitem que você implemente uma abordagem de leitura destrutiva com o gatilho de barramento de serviço de preenchimento automático e a leitura não destrutiva com o gatilho de barramento de serviço Peek-lock.

��Azure Functions implementam o padrão de consumidores concorrentes com barramento de serviço pronto para uso. Por padrão, a função será expandida para várias instâncias para processar várias mensagens em paralelo.

Globalcode – Open4education

45 of 46

Message Construction

Perguntas comuns que precisamos responder ao definir a estrutura e o conteúdo de nossas mensagens�

Pattern

Implementação

Throttled Consumer

Nas soluções cloud native ter consumidores concorrentes é quase sempre a norma.no entanto, podemos querer ter um número limitado de instâncias de nossos workers de processamento consumindo as mensagens disponíveis. Esse requisito é comum quando precisamos evitar sobrecarregar um aplicativo receptor com mais solicitações do que ele pode atender.��Singleton Consumer�é necessário quando o aplicativo receptor deve ou pode manipular apenas uma mensagem por vez��Processamento em ordem: se soubermos que as mensagens em uma fila são sequenciadas e precisarmos processá-las nessa ordem, precisaremos garantir que apenas um trabalhador esteja processando essas mensagens em um determinado momento. No entanto, confiar apenas na abordagem FIFO (primeiro a entrar, primeiro a sair) nas filas tem limitações para o processamento ordenado. Por exemplo, precisamos ter certeza de que as partições estão alinhadas com os requisitos de sequenciamento e devemos estar cientes de que a mensagem head-of-queue pode bloquear toda a fila se seu processamento estiver demorando, especialmente ao usar novas tentativas��Limitação de processamento: Alguns aplicativos podem manipular apenas uma mensagem por vez. Isso pode não ser verdade para aplicativos em nuvem, mas pode ser o caso em aplicativos legados.

Logic Apps ipermitem que você tenha controle de simultaneidade para que você possa limitá-los a ter apenas um número limitado de instâncias de um fluxo de trabalho em execução ao mesmo tempo. Outras mensagens aguardarão até que a instância em execução conclua sua execução.

��Azure Functions suporte ao controle do grau de paralelismo, mas com algumas limitações

��Os Aplicativos Lógicos do Azure permitem que você tenha controle de simultaneidade para que você possa limitá-los a ter apenas uma instância de um fluxo de trabalho em execução ao mesmo tempo. Outras mensagens aguardarão até que a instância em execução conclua sua execução.��Azure Functions dá suporte ao controle do grau de paralelismo, mas com algumas limitações, conforme descrito nas postagens a seguir: (1), (2) e (3).

Globalcode – Open4education

46 of 46

Obrigada!

https://www.linkedin.com/in/taniastormovski/�https://medium.com/@tanstorm

Globalcode – Open4education