Padrão Publisher-SubscriberPublisher-Subscriber pattern

Permite a um aplicativo anunciar eventos para vários consumidores de seu interesse assincronamente, sem acoplar os remetentes aos destinatários.Enable an application to announce events to multiple interested consumers asynchronously, without coupling the senders to the receivers.

Também chamado de: Mensagens pub/subAlso called: Pub/sub messaging

Contexto e problemaContext and problem

Em aplicativos distribuídos baseados em nuvem, normalmente, os componentes do sistema precisam fornecer informações a outros componentes à medida que os eventos acontecem.In cloud-based and distributed applications, components of the system often need to provide information to other components as events happen.

Mensagens assíncronas são uma maneira eficiente de dissociar os remetentes dos consumidores e evitar o bloqueio do remetente até receber uma resposta.Asynchronous messaging is an effective way to decouple senders from consumers, and avoid blocking the sender to wait for a response. No entanto, usar uma fila de mensagens dedicadas para cada consumidor não é algo bom quando há vários consumidores.However, using a dedicated message queue for each consumer does not effectively scale to many consumers. Além disso, talvez alguns consumidores tenham interesse em apenas um subconjunto das informações.Also, some of the consumers might be interested in only a subset of the information. Como o remetente pode anunciar eventos a todos os consumidores interessados sem conhecer suas identidades?How can the sender announce events to all interested consumers without knowing their identities?

SoluçãoSolution

Introduza um subsistema assíncrono de mensagens que inclua o seguinte:Introduce an asynchronous messaging subsystem that includes the following:

  • Um canal de entrada de mensagens usado pelo remetente.An input messaging channel used by the sender. O remetente insere os eventos nas mensagens, usando um formato de mensagem conhecido, e envia essas mensagens por meio do canal de entrada.The sender packages events into messages, using a known message format, and sends these messages via the input channel. O remetente nesse padrão também é chamado de publicador.The sender in this pattern is also called the publisher.

    Observação

    Uma mensagem é um pacote de dados.A message is a packet of data. Um evento é uma mensagem que notifica outros componentes sobre uma alteração ou uma ação que tenha ocorrido.An event is a message that notifies other components about a change or an action that has taken place.

  • Um canal de saída de mensagens por consumidor.One output messaging channel per consumer. Os consumidores são conhecidos como assinantes.The consumers are known as subscribers.

  • Um mecanismo para copiar cada mensagem do canal de entrada para os canais de saída de todos os assinantes interessados nessa mensagem.A mechanism for copying each message from the input channel to the output channels for all subscribers interested in that message. Essa operação normalmente é manipulada por um intermediário, como um barramento de evento ou agente de mensagem.This operation is typically handled by an intermediary such as a message broker or event bus.

O diagrama a seguir mostra os componentes lógicos desse padrão:The following diagram shows the logical components of this pattern:

Padrão publish-subscribe usando um agente de mensagens

A mensagem pub/sub tem os seguintes benefícios:Pub/sub messaging has the following benefits:

  • Ela separa subsistemas que ainda precisam se comunicar.It decouples subsystems that still need to communicate. Os subsistemas podem ser gerenciados independentemente e as mensagens podem ser gerenciadas corretamente mesmo se um ou mais destinatários estiverem offline.Subsystems can be managed independently, and messages can be properly managed even if one or more receivers are offline.

  • Ela aumenta a escalabilidade e melhora a capacidade de resposta do remetente.It increases scalability and improves responsiveness of the sender. O remetente pode enviar rapidamente uma única mensagem para o canal de entrada, e voltar às responsabilidades de processamento principais.The sender can quickly send a single message to the input channel, then return to its core processing responsibilities. A infraestrutura de mensagens é responsável por garantir que as mensagens sejam entregues aos assinantes interessados.The messaging infrastructure is responsible for ensuring messages are delivered to interested subscribers.

  • Isso aumenta a confiabilidade.It improves reliability. Mensagens assíncronas ajudam na execução tranquila dos aplicativos sob cargas maiores e lidam com falhas intermitentes com mais eficiência.Asynchronous messaging helps applications continue to run smoothly under increased loads and handle intermittent failures more effectively.

  • Ela permite o processamento agendado ou adiado.It allows for deferred or scheduled processing. Os assinantes podem esperar para ver as mensagens em um horário de pouco movimento, ou as mensagens podem ser roteadas ou processadas de acordo com um agendamento específico.Subscribers can wait to pick up messages until off-peak hours, or messages can be routed or processed according to a specific schedule.

  • Ela permite uma integração mais simples entre sistemas com plataformas diferentes, linguagens de programação ou protocolos de comunicação, bem como entre sistemas locais e aplicativos em execução na nuvem.It enables simpler integration between systems using different platforms, programming languages, or communication protocols, as well as between on-premises systems and applications running in the cloud.

  • Ela facilita fluxos de trabalho assíncronos em toda a empresa.It facilitates asynchronous workflows across an enterprise.

  • Ela melhora a capacidade de teste.It improves testability. Os canais podem ser monitorados, e as mensagens inspecionadas ou registradas como parte de uma estratégia de teste geral de integração.Channels can be monitored and messages can be inspected or logged as part of an overall integration test strategy.

  • Ela proporciona uma separação das preocupações com seus aplicativos.It provides separation of concerns for your applications. Cada aplicativo pode se concentrar em suas funcionalidades principais, enquanto a infraestrutura de mensagens lida com tudo que é necessário para rotear de forma confiável as mensagens para vários consumidores.Each application can focus on its core capabilities, while the messaging infrastructure handles everything required to reliably route messages to multiple consumers.

Problemas e consideraçõesIssues and considerations

Considere os seguintes pontos ao decidir como implementar esse padrão:Consider the following points when deciding how to implement this pattern:

  • Tecnologias existentes.Existing technologies. Recomendamos usar os produtos e serviços de mensagens disponíveis que dão suporte ao modelo publish-subscribe, em vez de criar seu próprio modelo.It is strongly recommended to use available messaging products and services that support a publish-subscribe model, rather than building your own. No Azure, considere o uso do Barramento de Serviço ou da Grade de Eventos.In Azure, consider using Service Bus or Event Grid. Outras tecnologias que podem ser usadas para mensagens de pub/sub incluem Apache Kafka, RabbitMQ e Redis.Other technologies that can be used for pub/sub messaging include Redis, RabbitMQ, and Apache Kafka.

  • Manipulação de assinatura.Subscription handling. A infraestrutura de mensagens deve fornecer mecanismos que os consumidores possam usar para assinar ou cancelar a assinatura de canais disponíveis.The messaging infrastructure must provide mechanisms that consumers can use to subscribe to or unsubscribe from available channels.

  • Segurança.Security. A conexão com qualquer canal de mensagem deve ser restrita por uma política de segurança, para impedir a interceptação por usuários ou aplicativos não autorizados.Connecting to any message channel must be restricted by security policy to prevent eavesdropping by unauthorized users or applications.

  • Subconjuntos de mensagens.Subsets of messages. Geralmente, os assinantes só têm interesse em um subconjunto das mensagens distribuídas por um publicador.Subscribers are usually only interested in subset of the messages distributed by a publisher. Frequentemente, os serviços de mensagens permitem que os assinantes restrinjam o conjunto de mensagens recebidas por:Messaging services often allow subscribers to narrow the set of messages received by:

    • Tópicos.Topics. Cada tópico tem um canal de saída dedicado, e cada consumidor pode assinar todos os tópicos relevantes.Each topic has a dedicated output channel, and each consumer can subscribe to all relevant topics.
    • Filtragem de conteúdo.Content filtering. As mensagens são inspecionadas e distribuídas com base no conteúdo de cada uma delas.Messages are inspected and distributed based on the content of each message. Cada assinante pode especificar o conteúdo no qual tem interesse.Each subscriber can specify the content it is interested in.
  • Assinantes curinga.Wildcard subscribers. Considere a possibilidade de permitir que os assinantes se inscrevam em vários tópicos por meio de curingas.Consider allowing subscribers to subscribe to multiple topics via wildcards.

  • Comunicação bidirecional.Bi-directional communication. Os canais em um sistema publish-subscribe são tratados como unidirecionais.The channels in a publish-subscribe system are treated as unidirectional. Se um assinante específico precisa enviar confirmação ou comunicar-se o status de volta para o publicador, considere usar o padrão de solicitação/resposta.If a specific subscriber needs to send acknowledgment or communicate status back to the publisher, consider using the Request/Reply Pattern. Esse padrão usa um canal para enviar uma mensagem ao assinante, e um canal de resposta separado para se comunicar com o publicador.This pattern uses one channel to send a message to the subscriber, and a separate reply channel for communicating back to the publisher.

  • Ordenação de mensagem.Message ordering. A ordem na qual as instâncias do consumidor recebem as mensagens não é garantida, e não reflete necessariamente a ordem na qual as mensagens foram criadas.The order in which consumer instances receive messages isn't guaranteed, and doesn't necessarily reflect the order in which the messages were created. Projete o sistema para garantir que o processamento de mensagens seja idempotente, para ajudar a eliminar qualquer dependência em relação à ordem de manipulação das mensagens.Design the system to ensure that message processing is idempotent to help eliminate any dependency on the order of message handling.

  • Prioridade da mensagem.Message priority. Algumas soluções podem exigir que as mensagens sejam processadas em uma ordem específica.Some solutions may require that messages are processed in a specific order. O Padrão de fila de prioridade fornece um mecanismo para garantir que mensagens específicas sejam entregues antes de outras.The Priority Queue pattern provides a mechanism for ensuring specific messages are delivered before others.

  • Mensagens suspeitas.Poison messages. Uma mensagem malformada ou uma tarefa que exige acesso a recursos que não estão disponíveis, pode causar uma falha em uma instância de serviço.A malformed message, or a task that requires access to resources that aren't available, can cause a service instance to fail. O sistema deve impedir que essas mensagens retornem para a fila.The system should prevent such messages being returned to the queue. Em vez disso, capture e armazene os detalhes dessas mensagens em outro lugar, para que elas possam ser analisadas, se for necessário.Instead, capture and store the details of these messages elsewhere so that they can be analyzed if necessary.

  • Mensagens repetidas.Repeated messages. A mesma mensagem pode ser enviada mais de uma vez.The same message might be sent more than once. Por exemplo, o remetente pode falhar após a postagem de uma mensagem.For example, the sender might fail after posting a message. Em seguida, uma nova instância do remetente pode iniciar e repetir a mensagem.Then a new instance of the sender might start up and repeat the message. A infraestrutura de mensagens deve implementar a detecção e remoção de mensagens duplicadas (também conhecida como de-duping) com base nas IDs das mensagens, para realizar, no máximo uma vez, a entrega das mensagens.The messaging infrastructure should implement duplicate message detection and removal (also known as de-duping) based on message IDs in order to provide at-most-once delivery of messages.

  • Expiração da mensagem.Message expiration. Uma mensagem pode ter um tempo de vida limitado.A message might have a limited lifetime. Se ela não for processada dentro desse tempo, talvez não seja mais relevante e deva ser descartada.If it isn't processed within this period, it might no longer be relevant and should be discarded. Um remetente pode especificar um tempo de expiração como parte dos dados na mensagem.A sender can specify an expiration time as part of the data in the message. Um receptor pode examinar essas informações antes de decidir se deve executar a lógica de negócios associada à mensagem.A receiver can examine this information before deciding whether to perform the business logic associated with the message.

  • Agendamento de mensagem.Message scheduling. Uma mensagem pode ser temporariamente embargada e não deve ser processada até uma data e hora específica.A message might be temporarily embargoed and should not be processed until a specific date and time. A mensagem não ficará disponível para um receptor até que esse tempo passe.The message should not be available to a receiver until this time.

Quando usar esse padrãoWhen to use this pattern

Use esse padrão quando:Use this pattern when:

  • Um aplicativo precisar transmitir informações para um número considerável de consumidores.An application needs to broadcast information to a significant number of consumers.

  • Um aplicativo precisar se comunicar com um ou mais aplicativos ou serviços desenvolvidos de forma independente, que podem usar plataformas, linguagens de programação e protocolos de comunicação diferentes.An application needs to communicate with one or more independently-developed applications or services, which may use different platforms, programming languages, and communication protocols.

  • Um aplicativo puder enviar informações para os consumidores sem a necessidade de respostas em tempo real.An application can send information to consumers without requiring real-time responses from the consumers.

  • Os sistemas que estão sendo integrados forem projetados para dar suporte a um modelo de consistência eventual para seus dados.The systems being integrated are designed to support an eventual consistency model for their data.

  • Um aplicativo precisar comunicar informações para vários consumidores, que podem ter requisitos de disponibilidade ou cronogramas de tempo de atividade diferentes do remetente.An application needs to communicate information to multiple consumers, which may have different availability requirements or uptime schedules than the sender.

Esse padrão pode não ser útil quando:This pattern might not be useful when:

  • Um aplicativo tiver apenas alguns consumidores que precisam de informações consideravelmente diferentes do aplicativo de produção.An application has only a few consumers who need significantly different information from the producing application.

  • Um aplicativo exigir interação quase em tempo real com os consumidores.An application requires near real-time interaction with consumers.

ExemploExample

O diagrama a seguir mostra uma arquitetura de integração corporativa que usa o Barramento de Serviço para coordenar fluxos de trabalho, e a Grade de Eventos notifica os subsistemas sobre eventos que ocorrem.The following diagram shows an enterprise integration architecture that uses Service Bus to coordinate workflows, and Event Grid notify subsystems of events that occur. Para saber mais, confira Integração corporativa no Azure usando filas de mensagens e eventos.For more information, see Enterprise integration on Azure using message queues and events.

Arquitetura de integração corporativa

Os padrões e diretrizes a seguir também podem ser relevantes ao implementar esse padrão:The following patterns and guidance might be relevant when implementing this pattern: