(function(w,d,s,l,i){w[l]=w[l]||[];w[l].push({'gtm.start': new Date().getTime(),event:'gtm.js'});var f=d.getElementsByTagName(s)[0], j=d.createElement(s),dl=l!='dataLayer'?'&l='+l:'';j.async=true;j.src= 'https://www.googletagmanager.com/gtm.js?id='+i+dl;f.parentNode.insertBefore(j,f); })(window,document,'script','dataLayer','GTM-5LHNRP9'); thecodest, Autor em The Codest - Página 7 de 9

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

Contras do Pub/Sub com Rails

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:

  1. Domínio,
  2. Evento,
  3. Manipulador de eventos,
  4. Editor do evento,
  5. 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:

Padrões semelhantes

  1. EventBus - os componentes podem enviar eventos para o EventBus sem saber quem os irá recolher ou quantos inquiridos irão reagir,
  2. Observador - o sujeito mantém uma lista de dependentes, chamados observadores, e notifica-os sempre que o seu estado se altera,
  3. 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.

faixa de cooperação
pt_PTPortuguese