Patrón de publicador y suscriptorPublisher-Subscriber pattern

Permita que una aplicación anuncie eventos de forma asincrónica a varios consumidores interesados, sin necesidad de emparejar los remitentes con los receptores.Enable an application to announce events to multiple interested consumers asynchronously, without coupling the senders to the receivers.

También se denomina: Mensajería de publicación y suscripciónAlso called: Pub/sub messaging

Contexto y problemaContext and problem

En las aplicaciones distribuidas y basadas en la nube, los componentes del sistema a menudo necesitan proporcionar información a otros componentes a medida que suceden los eventos.In cloud-based and distributed applications, components of the system often need to provide information to other components as events happen.

La mensajería asincrónica es una forma eficaz de desacoplar a los remitentes de los consumidores y evitar bloquear al remitente para que espere una respuesta.Asynchronous messaging is an effective way to decouple senders from consumers, and avoid blocking the sender to wait for a response. Sin embargo, el uso de una cola de mensajes dedicada para cada consumidor no es efectivo para muchos consumidores.However, using a dedicated message queue for each consumer does not effectively scale to many consumers. Además, algunos de los consumidores podrían estar interesados solo en un subconjunto de la información.Also, some of the consumers might be interested in only a subset of the information. ¿Cómo puede el remitente anunciar eventos a todos los consumidores interesados sin conocer su identidad?How can the sender announce events to all interested consumers without knowing their identities?

SoluciónSolution

Introduzca un subsistema de mensajería asincrónica que incluya lo siguiente:Introduce an asynchronous messaging subsystem that includes the following:

  • Un canal de mensajería de entrada utilizado por el remitente.An input messaging channel used by the sender. El remitente empaqueta los eventos en mensajes, mediante un formato de mensaje conocido, y envía estos mensajes a través del canal de entrada.The sender packages events into messages, using a known message format, and sends these messages via the input channel. El remitente en este patrón también se denomina publicador.The sender in this pattern is also called the publisher.

    Nota

    Un mensaje es un paquete de datos.A message is a packet of data. Un evento es un mensaje que notifica a otros componentes sobre un cambio o una acción que ha tenido lugar.An event is a message that notifies other components about a change or an action that has taken place.

  • Un canal de mensajería de salida por consumidor.One output messaging channel per consumer. Los consumidores se conocen como suscriptores.The consumers are known as subscribers.

  • Un mecanismo para copiar cada mensaje del canal de entrada a los canales de salida para todos los suscriptores interesados en ese mensaje.A mechanism for copying each message from the input channel to the output channels for all subscribers interested in that message. Normalmente, esta operación se controla mediante un intermediario, como un bus de mensajes de agente o un evento.This operation is typically handled by an intermediary such as a message broker or event bus.

En el siguiente diagrama se muestran los componentes lógicos de este patrón:The following diagram shows the logical components of this pattern:

Patrón de publicador y suscriptor mediante un agente de mensajes

La mensajería de publicación y suscripción tiene las siguientes ventajas:Pub/sub messaging has the following benefits:

  • Desacopla los subsistemas que aún necesitan comunicarse.It decouples subsystems that still need to communicate. Los subsistemas se pueden administrar de forma independiente y los mensajes se pueden administrar correctamente incluso si uno o más receptores están desconectados.Subsystems can be managed independently, and messages can be properly managed even if one or more receivers are offline.

  • Aumenta la escalabilidad y mejora la capacidad de respuesta del remitente.It increases scalability and improves responsiveness of the sender. El remitente puede enviar rápidamente un solo mensaje al canal de entrada y luego volver a sus responsabilidades de procesamiento principales.The sender can quickly send a single message to the input channel, then return to its core processing responsibilities. La infraestructura de mensajería es responsable de garantizar que los mensajes se entreguen a los suscriptores interesados.The messaging infrastructure is responsible for ensuring messages are delivered to interested subscribers.

  • Mejora la confiabilidad.It improves reliability. La mensajería asincrónica ayuda a que las aplicaciones continúen funcionando sin problemas bajo cargas cada vez mayores y controlen los errores intermitentes con mayor eficacia.Asynchronous messaging helps applications continue to run smoothly under increased loads and handle intermittent failures more effectively.

  • Permite el procesamiento diferido o programado.It allows for deferred or scheduled processing. Los suscriptores pueden esperar para recoger los mensajes hasta las horas de menor consumo, o los mensajes pueden enrutarse o procesarse de acuerdo a un horario 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.

  • Permite una integración más sencilla entre sistemas que utilizan diferentes plataformas, lenguajes de programación o protocolos de comunicación, así como entre sistemas locales y aplicaciones que se ejecutan en la nube.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.

  • Facilita flujos de trabajo asincrónicos en toda la empresa.It facilitates asynchronous workflows across an enterprise.

  • Mejora la capacidad de prueba.It improves testability. Los canales pueden supervisarse y los mensajes se pueden inspeccionar o registrar como parte de una estrategia general de pruebas de integración.Channels can be monitored and messages can be inspected or logged as part of an overall integration test strategy.

  • Proporciona separación de preocupaciones para sus aplicaciones.It provides separation of concerns for your applications. Cada aplicación puede centrarse en sus funcionalidades principales, mientras que la infraestructura de mensajería controla todo lo necesario para enrutar de forma fiable los mensajes a múltiples consumidores.Each application can focus on its core capabilities, while the messaging infrastructure handles everything required to reliably route messages to multiple consumers.

Problemas y consideracionesIssues and considerations

Tenga en cuenta los puntos siguientes al decidir cómo implementar este patrón:Consider the following points when deciding how to implement this pattern:

  • Tecnologías existentes.Existing technologies. Se recomienda encarecidamente utilizar los productos y servicios de mensajería disponibles que admiten un modelo de publicación y suscripción, en lugar de crear uno propio.It is strongly recommended to use available messaging products and services that support a publish-subscribe model, rather than building your own. En Azure, considere el uso de Service Bus o Event Grid.In Azure, consider using Service Bus or Event Grid. Otras tecnologías que se pueden utilizar para la mensajería de publicación y suscripción incluyen Redis, RabbitMQ y Apache Kafka.Other technologies that can be used for pub/sub messaging include Redis, RabbitMQ, and Apache Kafka.

  • Control de suscripciones.Subscription handling. La infraestructura de mensajería debe proporcionar mecanismos que los consumidores puedan utilizar para suscribirse o darse de baja de los canales disponibles.The messaging infrastructure must provide mechanisms that consumers can use to subscribe to or unsubscribe from available channels.

  • Seguridad.Security. La conexión a cualquier canal de mensajes debe estar restringida por una directiva de seguridad para evitar que usuarios o aplicaciones no autorizados resulten interceptados.Connecting to any message channel must be restricted by security policy to prevent eavesdropping by unauthorized users or applications.

  • Subconjuntos de mensajes.Subsets of messages. Por lo general, los suscriptores solo están interesados en el subconjunto de los mensajes distribuidos por un publicador.Subscribers are usually only interested in subset of the messages distributed by a publisher. Los servicios de mensajería a menudo permiten a los suscriptores reducir el conjunto de mensajes recibidos por:Messaging services often allow subscribers to narrow the set of messages received by:

    • Temas.Topics. Cada tema tiene un canal de salida dedicado, y cada consumidor puede suscribirse a todos los temas pertinentes.Each topic has a dedicated output channel, and each consumer can subscribe to all relevant topics.
    • Filtrado de contenido.Content filtering. Los mensajes se inspeccionan y se distribuyen según el contenido de cada mensaje.Messages are inspected and distributed based on the content of each message. Cada suscriptor puede especificar el contenido que le interesa.Each subscriber can specify the content it is interested in.
  • Suscriptores con caracteres comodín.Wildcard subscribers. Considere la posibilidad de permitir que los suscriptores se suscriban a varios temas mediante caracteres comodín.Consider allowing subscribers to subscribe to multiple topics via wildcards.

  • Comunicación bidireccional.Bi-directional communication. Los canales en un sistema de publicación y suscripción se tratan como unidireccionales.The channels in a publish-subscribe system are treated as unidirectional. Si tiene un suscriptor específico enviar la confirmación o comunicar el estado con el publicador, considere la patrón de solicitud/respuesta.If a specific subscriber needs to send acknowledgment or communicate status back to the publisher, consider using the Request/Reply Pattern. Este patrón utiliza un canal para enviar un mensaje al suscriptor y un canal de respuesta separado para comunicarse con el publicador.This pattern uses one channel to send a message to the subscriber, and a separate reply channel for communicating back to the publisher.

  • Orden de los mensajes.Message ordering. El orden en que las instancias de consumidor reciben los mensajes no está garantizado y no refleja necesariamente el orden en que se crearon los mensajes.The order in which consumer instances receive messages isn't guaranteed, and doesn't necessarily reflect the order in which the messages were created. Diseñe el sistema para asegurarse de que el procesamiento de mensajes sea idempotente para eliminar cualquier dependencia en el orden en el que se administran los mensajes.Design the system to ensure that message processing is idempotent to help eliminate any dependency on the order of message handling.

  • Prioridad del mensaje.Message priority. Algunas soluciones pueden requerir que los mensajes se procesen en un orden específico.Some solutions may require that messages are processed in a specific order. El patrón de cola de prioridad proporciona un mecanismo para garantizar que determinados mensajes se entreguen antes que otros.The Priority Queue pattern provides a mechanism for ensuring specific messages are delivered before others.

  • Mensajes dudosos.Poison messages. Un mensaje con formato incorrecto, o una tarea que requiere acceso a recursos que no están disponibles, puede hacer que una instancia de servicio produzca un error.A malformed message, or a task that requires access to resources that aren't available, can cause a service instance to fail. El sistema debe impedir que dichos mensajes vuelvan a la cola.The system should prevent such messages being returned to the queue. En su lugar, capture y almacene los detalles de estos mensajes en otro lugar para que se puedan analizar si es necesario.Instead, capture and store the details of these messages elsewhere so that they can be analyzed if necessary.

  • Mensajes repetidos.Repeated messages. El mismo mensaje se puede enviar varias veces.The same message might be sent more than once. Por ejemplo, puede producirse un error después de que el remitente publique un mensaje.For example, the sender might fail after posting a message. A continuación, una nueva instancia del remitente podría iniciarse y repetir el mensaje.Then a new instance of the sender might start up and repeat the message. La infraestructura de mensajería debe implementar la detección y eliminación de mensajes duplicados (también conocida como deduplicación) basada en identificadores de mensajes para proporcionar la entrega de mensajes de una sola vez.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.

  • Expiración de mensajes.Message expiration. Un mensaje puede tener una duración limitada.A message might have a limited lifetime. Si no se procesa dentro de este período, es posible que ya no sea pertinente y se debe descartar.If it isn't processed within this period, it might no longer be relevant and should be discarded. Un remitente puede especificar un tiempo de expiración como parte de los datos en el mensaje.A sender can specify an expiration time as part of the data in the message. Un receptor puede examinar esta información antes de decidir si desea realizar la lógica de negocios asociada con el mensaje.A receiver can examine this information before deciding whether to perform the business logic associated with the message.

  • Programación de mensajes.Message scheduling. Un mensaje puede estar prohibido temporalmente y no debe procesarse hasta una fecha y hora específicas.A message might be temporarily embargoed and should not be processed until a specific date and time. El mensaje no debe estar disponible para un receptor hasta ese momento.The message should not be available to a receiver until this time.

Cuándo usar este patrónWhen to use this pattern

Use este patrón en los siguientes supuestos:Use this pattern when:

  • Una aplicación necesita difundir información a un número significativo de consumidores.An application needs to broadcast information to a significant number of consumers.

  • Una aplicación necesita comunicarse con una o más aplicaciones o servicios desarrollados de forma independiente, que pueden utilizar diferentes plataformas, lenguajes de programación y protocolos de comunicación.An application needs to communicate with one or more independently-developed applications or services, which may use different platforms, programming languages, and communication protocols.

  • Una aplicación puede enviar información a los consumidores sin requerir respuestas en tiempo real de los consumidores.An application can send information to consumers without requiring real-time responses from the consumers.

  • Los sistemas que se están integrando están diseñados para admitir un eventual modelo de consistencia para sus datos.The systems being integrated are designed to support an eventual consistency model for their data.

  • Una aplicación necesita comunicar información a varios consumidores, que pueden tener diferentes requisitos de disponibilidad o programaciones de tiempo de actividad que el remitente.An application needs to communicate information to multiple consumers, which may have different availability requirements or uptime schedules than the sender.

Este modelo podría no ser útil en las situaciones siguientes:This pattern might not be useful when:

  • Una aplicación tiene solo unos pocos consumidores que necesitan información significativamente diferente de la aplicación que la produce.An application has only a few consumers who need significantly different information from the producing application.

  • Una aplicación requiere una interacción casi en tiempo real con los consumidores.An application requires near real-time interaction with consumers.

EjemploExample

El siguiente diagrama muestra una arquitectura de integración empresarial que utiliza Service Bus para coordinar los flujos de trabajo, y Event Grid notifica a los subsistemas de los eventos que ocurren.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 más información, consulte Integración empresarial en Azure mediante colas de mensajes y eventos.For more information, see Enterprise integration on Azure using message queues and events.

Arquitectura de integración empresarial

Los patrones y las directrices siguientes podrían ser importantes a la hora de implementar este patrón:The following patterns and guidance might be relevant when implementing this pattern:

  • Elija entre los servicios de Azure de entrega de mensajes.Choose between Azure services that deliver messages.

  • El estilo de arquitectura basada en eventos es un estilo de arquitectura que utiliza la mensajería de publicación y suscripción.The Event-driven architecture style is an architecture style that uses pub/sub messaging.

  • Manual de mensajería asincrónica.Asynchronous Messaging Primer. Las colas de mensajes son un mecanismo de comunicaciones asincrónico.Message queues are an asynchronous communications mechanism. Si un servicio de consumidor debe enviar una respuesta a una aplicación, podría ser necesario implementar alguna forma de mensajería de respuesta.If a consumer service needs to send a reply to an application, it might be necessary to implement some form of response messaging. En Asynchronous Messaging Primer se proporciona información sobre cómo implementar la mensajería de solicitud/respuesta con colas de mensajes.The Asynchronous Messaging Primer provides information on how to implement request/reply messaging using message queues.

  • Patrón de observador.Observer Pattern. El patrón de publicador y suscriptor se basa en el patrón de observador al desacoplar los sujetos de los observadores a través de la mensajería asincrónica.The Publish-Subscribe pattern builds on the Observer pattern by decoupling subjects from observers via asynchronous messaging.

  • Patrón de agente de mensajes.Message Broker Pattern. Muchos subsistemas de mensajes compatibles con una publicación-modelo de publicación-suscripción se implementan a través de un agente de mensajes.Many messaging subsystems that support a publish-subscribe model are implemented via a message broker.