Rubi sobre Carris (Rails, RoR) é um conhecido web estrutura de aplicação escrita em Rubi linguagem de programação. Pub/Sub é uma designação abreviada dos padrões de conceção de software denominados Publicar-subscrever. Vou explicar como a comunicação entre componentes de software no Rails pode ser tratada pelo Pub/Sub.
O que é o Pub/sub?
Pub/sub é um padrão de conceção de software que permite a comunicação serviço-a-serviço. Serviço
implica um dos dois papéis: editor (que produz) ou recetor (que consome). O que é
produzido para ser consumido é determinado como um evento ou uma mensagem ou uma notificação. No
No contexto do presente artigo, são utilizados indistintamente para designar a mesma coisa.
O serviço que produz não sabe quem consome. O serviço que consome não
conhecem a origem da mensagem. Podem permanecer desconhecidos um para o outro. É diferente de
filas de mensagens, em que o componente que envia a mensagem conhece frequentemente o seu destino
- este estilo de envio de mensagens permite-lhe enviar mensagens para qualquer lugar. Este mecanismo é um dos principais
de Pub/sub e isso significa que estão dissociados.
Para exprimirem os seus interesses mútuos, devem partilhar um entendimento comum. Por conseguinte,
ambos os papéis têm um mecanismo implícito de "stick" em que o produtor de uma mensagem e o
consumidor da mensagem. Este mecanismo é designado por assunto, subscrição ou tópico. É
responsável pela categorização de mensagens para assuntos, é essencialmente um filtro de mensagens sem estado.
Os tópicos funcionam como estações de transmissão. Um editor produz a mensagem para o tópico,
os subscritores recebem imediatamente a mensagem do tópico. Devido ao facto de os
a forma mais eficiente de trocar mensagens é tratá-las de forma assíncrona.
Rails sem Pub/Sub
Por padrão, não há sobrecarga do Rails para padrões de design de software para passar mensagens entre componentes. Os desenvolvedores usam o padrão programação orientada para os objectos (OOP): passar parâmetros a funções, pedir classes sobre valores.
Quando a aplicação é bastante simples, pode ser suficiente. Quando a aplicação cresce, por exemplo, algumas operações precisam de ser efectuadas de forma assíncrona, então o projeto precisa de uma abstração que resolva que dados fluxo de trabalho. Em vez de reinventar a roda, os programadores podem implementar Pub/sub para colmatar esta falta de abstração.
Prós do Pub/Sub com Rails
- Evitar as chamadas de retorno de registos activos.
- Ao adicionar o processamento paralelo assíncrono a um sistema, o desempenho, a fiabilidade e a escalabilidade são melhorados.
- As mensagens podem ser transmitidas de forma assíncrona para diferentes partes do sistema.
- Permite que as mensagens sejam transmitidas de forma assíncrona para diferentes partes de um sistema.
- Desacoplamento - adicionar ou alterar uma funcionalidade não terá impacto em nada porque Pub/Sub
permite-lhe modificar a forma como tudo interage. - O consumidor de mensagens deixará de precisar de verificar periodicamente se existem actualizações ou novas
informações. Reduz a latência de entrega que pode ser particularmente problemática em sistemas
sem tolerância para atrasos. - Não há limite para o número de subscritores que o sistema pode suportar, porque este pode mudar,
atualizar, multiplicar ou desaparecer em qualquer altura.
Contras do Pub/Sub com Rails
- A principal desvantagem dos sistemas Pub/sub é a dissociação entre o editor e o
assinante.
Introdução do Rails Pub/Sub
Exemplos de código fonte em Rails foram escritos usando a biblioteca
Pub/Sub em Rails (na nomenclatura do Ruby, uma biblioteca chama-se gem): Encontrará mais pormenores no readme da gem. A implementação é composta por módulos:
- Domínio,
- Evento,
- Manipulador de eventos,
- Editor do evento,
- Assinatura.
Domínio
Descreve a lógica comercial, a fim de fornecer contexto para Pub/Sub e, por conseguinte, tornar mais clara a sua utilização. código.
módulo Notifications
extend PubSub::Domínio
fim
módulo Relatórios
estender PubSub::Domínio
fim
Evento
Trata-se de uma classe que descreve o que aconteceu. Declare o nome da classe como auto-descritor do que aconteceu, por exemplo: cancelado, alterado, criado, destruído, enviado, atualizado. Os nomes dos eventos podem ser semelhantes a: ProfitAndLossStatementCreatedEvent, que significa que uma demonstração financeira foi criada.
classe Reports::ProfitAndLossStatementCreatedEvent < PubSub::DomainEvent
atributo :profit_and_loss_statement_id, Types::Strict::Integer
fim
Editor de eventos
Classe capaz de emitir eventos. O exemplo mostra a criação de um relatório de serviço. Quando o relatório for criado com sucesso, emite o evento de criação desse relatório.
classe Reports::ProfitAndLossStatementService
include PubSub::Emit
def execute
emit(:report_profit_and_loss_statement_created, profit_and_loss_statement_id: id) if result.ok?
end
fim
Manipulador de eventos
Esta classe deve ser executada em resposta ao tratamento de um evento.
módulo Notificações
class ReportsProfitAndLossStatementCreatedHandler < PubSub::DomainEventHandler
def call
ReportMailer.profit_and_loss_statement(profit_and_loss_statement).deliver_now
fim
privado
def profit_and_loss_statement
ProfitAndLossStatement.find(event_data.profit_and_loss_statement_id)
end
end
end
Assinatura
Os eventos são ligados aos seus manipuladores através de subscrições.
notificações:
reports__profit_and_loss_statement_created: async
Exemplos de casos de utilização:
- Funcionalidade "Seguir" nas redes sociais,
- Internet das coisas,
- Correio eletrónico,
- Notificação sobre ficheiros gerados.
Padrões semelhantes
- EventBus - os componentes podem enviar eventos para o EventBus sem saber quem os irá recolher ou quantos inquiridos irão reagir,
- Observador - o sujeito mantém uma lista de dependentes, chamados observadores, e notifica-os sempre que o seu estado se altera,
- Agrupamento - quando os clientes fazem polling, perguntam periodicamente ao sistema se existem novos eventos ou dados.
Gemas
Resumo
Pub/sub não é uma abordagem comum em Ruby in Rails. Como introduzido no artigo, este padrão pode trazer muitos benefícios para o projeto - pode tornar o código limpo, desacoplar serviços e torná-los facilmente escaláveis.
