Ruby en Rieles (Rails, RoR) es un conocido web escrito en el lenguaje de programación Ruby lenguaje de programación. Pub/Sub es un nombre abreviado de los patrones de diseño de software denominados Publicar-suscribir. Voy a explicar cómo la comunicación entre los componentes de software en Rails podría ser manejado por Pub / Sub.
¿Qué es Pub/sub?
Pub/sub es un patrón de diseño de software que proporciona comunicación de servicio a servicio. Servicio
implica uno de los dos papeles: editor (quien produce) o receptor (quien consume). ¿Cuál es
producido para ser consumido se determina como un evento o un mensaje o una notificación. En el
En el contexto de este artículo, se utilizan indistintamente para referirse a lo mismo.
El servicio que produce no sabe quién consume. El servicio que consume no
conocer el origen del mensaje. Pueden permanecer desconocidos entre sí. Es diferente de
colas de mensajes, en las que el componente que envía el mensaje suele conocer su destino
- Este estilo de mensajería permite enviar mensajes a cualquier lugar. Este mecanismo es un núcleo
de Pub/sub y significa que están desacoplados.
Para expresar sus intereses mutuos, deben compartir un entendimiento común. Por tanto,
ambos roles tienen implícito un mecanismo del stick donde el productor de un mensaje y el
consumidor del mensaje se reúnen. Este mecanismo se denomina asunto, suscripción o tema. Es
responsable de categorizar los mensajes a los sujetos, es esencialmente un filtro de mensajes sin estado.
Los temas actúan como emisoras. Un editor produce el mensaje para el tema,
los abonados reciben inmediatamente el mensaje del tema. Debido al desacoplamiento
la forma más eficaz de intercambiar mensajes es hacerlo de forma asíncrona.
Rails sin Pub/Sub
Por defecto, Rails no tiene sobrecarga de patrones de diseño de software para el paso de mensajes entre componentes. Los desarrolladores utilizan el estándar programación orientada a objetos (OOP): pasar parámetros a funciones, pedir clases sobre valores.
Cuando la aplicación es poco complicada, podría ser suficiente. Cuando la aplicación crece, por ejemplo, algunas operaciones deben realizarse de forma asíncrona, entonces el proyecto necesita una abstracción que resuelva que datos flujo de trabajo. En lugar de reinventar la rueda, los desarrolladores pueden implementar Pub/sub para suplir esta falta de abstracción.
Ventajas de Pub/Sub con Rails
- Evite las devoluciones de llamada de registros activos.
- Al añadir el procesamiento paralelo asíncrono a un sistema, el rendimiento, la fiabilidad y el escalabilidad se mejoran.
- Los mensajes pueden difundirse de forma asíncrona a distintas partes del sistema.
- Permite emitir mensajes de forma asíncrona a diferentes partes de un sistema.
- Desacoplamiento: añadir o cambiar una funcionalidad no afectará a nada porque Pub/Sub
te permite modificar cómo interactúa todo. - El consumidor de mensajes ya no tendrá que comprobar periódicamente si hay actualizaciones o nuevas
información. Reduce la latencia de entrega que puede ser especialmente problemática en sistemas
sin tolerancia a los retrasos. - No hay límite para el número de abonados que puede manejar el sistema porque puede cambiar,
actualizarse, multiplicarse o desaparecer en cualquier momento.
Contras de Pub/Sub con Rails
- La principal desventaja de los sistemas Pub/sub es que desvinculan el editor de los usuarios.
abonado.
Rails Pub/Sub introducir
Los ejemplos de código fuente en Rails se escribieron utilizando la librería
Pub/Sub en Rails (en la nomenclatura de Ruby, una biblioteca se llama gema): Encontrarás más detalles en el readme de la gema. La implementación se compone de módulos:
- Dominio,
- Evento,
- Controlador de eventos,
- Editor del evento,
- Suscripción.
Dominio
Describe la lógica de negocio con el fin de proporcionar contexto para Pub/Sub y, por lo tanto, hacer limpio código.
módulo Notificaciones
extend PubSub::Dominio
end
módulo Reports
extend PubSub::Dominio
end
Evento
Es una clase que describe lo sucedido. Declara el nombre de la clase como auto-descriptivo con lo sucedido como sea posible, por ejemplo: cancelado, cambiado, creado, destruido, enviado, actualizado. Los nombres de eventos pueden ser como ProfitAndLossStatementCreatedEvent, que significa que un estado financiero fue creado.
clase Reports::ProfitAndLossStatementCreatedEvent < PubSub::DomainEvent
atributo :profit_and_loss_statement_id, Types::Strict::Integer
fin
Editor del evento
Clase capaz de emitir eventos. El ejemplo muestra la creación de un informe de servicio. Cuando el informe se ha creado correctamente, emite el evento de creación de dicho informe.
clase Reports::ProfitAndLossStatementService
include PubSub::Emit
def ejecutar
emit(:informe_estado_de_ganancias_y_pérdidas_creado, estado_de_ganancias_y_pérdidas_id: id) if result.ok?
end
end
Controlador de eventos
Esta clase debe ejecutarse en respuesta a la gestión de un evento.
módulo Notificaciones
class ReportsProfitAndLossStatementCreatedHandler < PubSub::DomainEventHandler
def call
ReportMailer.estado_ganancias_y_pérdidas(estado_ganancias_y_pérdidas).deliver_now
end
privado
def declaración_de_ganancias_y_pérdidas
ProfitAndLossStatement.find(event_data.profit_and_loss_statement_id)
end
end
end
Suscripción
Los eventos se vinculan a sus gestores mediante suscripciones.
notificaciones:
reports__profit_and_loss_statement_created: async
Ejemplos de casos de uso:
- Función "Seguir" en las redes sociales,
- Internet de los objetos,
- Correo,
- Notificación sobre los archivos generados.
Patrones similares
- EventBus - pueden enviar eventos a EventBus sin saber quién los recogerá o cuántos encuestados lo harán. reaccionar,
- Observador - el sujeto mantiene una lista de dependientes, llamados observadores, y les notifica cada vez que cambia su estado,
- Puesta en común - al sondear, los clientes preguntan periódicamente al sistema si hay nuevos eventos o datos.
Gemas
Resumen
Pub/sub no es un enfoque común en Ruby in Rails. Tal y como se introduce en el artículo, este patrón puede aportar muchos beneficios al proyecto: puede hacer que el código sea limpio, desacoplar servicios y hacerlos fácilmente escalables.
