avatar
Publicado por

Arquitetura Pub Sub Observer

Authors
  • avatar
    Name
    Gabriel Gava Pinheiro
    Twitter

Arquitetura Pub/Sub

Introdução

A arquitetura Pub/Sub, abreviação de Publicador/Assinante, é um padrão de design de mensagens amplamente utilizado em sistemas distribuídos. Nesta arquitetura, os produtores de mensagens (publicadores) não enviam suas mensagens diretamente aos consumidores (assinantes). Em vez disso, as mensagens são categorizadas e publicadas em um tópico. Os assinantes se inscrevem nesses tópicos e consomem as mensagens de acordo.

Vantagens da Arquitetura Pub/Sub

  • Desacoplamento: Produtores e consumidores operam independentemente, melhorando a manutenção e a escalabilidade.
  • Flexibilidade: Novos assinantes podem se inscrever em tópicos a qualquer momento sem afetar os publicadores.
  • Escalabilidade: A arquitetura suporta um grande número de produtores e consumidores.

Onde a Arquitetura Pub/Sub é Usada

  • Sistemas de Mensagens em Tempo Real: Como em chats e notificações push.
  • Integração de Aplicações Empresariais: Para sincronizar dados entre diferentes sistemas.
  • Processamento de Eventos e Análises: Como em sistemas de telemetria e monitoramento.

Exemplos de Implementações de Pub/Sub

Google Cloud Pub/Sub

Oferece uma infraestrutura global para mensagens e streaming de dados, escalável e totalmente gerenciada.

Apache Kafka

Um sistema de streaming distribuído que funciona como uma plataforma de mensagens robusta, escalável e de alta performance.

RabbitMQ

Um broker de mensagens que suporta vários protocolos de mensagens, sendo muito utilizado para operações de Pub/Sub.

AWS SNS (Simple Notification Service)

Um serviço de mensagens para a entrega de mensagens ou notificações em larga escala.

Codigo na Prática

A arquitetura Pub/Sub, abreviação de Publicador/Assinante, é um padrão de design de mensagens usado em sistemas distribuídos para desacoplar produtores e consumidores de mensagens.

Exemplo de Implementação em C++

A seguir, apresentamos um exemplo simplificado de implementação da arquitetura Pub/Sub em C++, conforme descrito no livro "Padrões de Projeto":

#include <iostream>
#include <list>
#include <string>

class Subscriber {
public:
    virtual void update(const std::string &message_from_subject) = 0;
};

class Publisher {
    std::list<Subscriber *> list_of_subscribers;
    std::string message;

public:
    void attach(Subscriber *subscriber) {
        list_of_subscribers.push_back(subscriber);
    }
    void detach(Subscriber *subscriber) {
        list_of_subscribers.remove(subscriber);
    }
    void notify() {
        for (auto *subscriber : list_of_subscribers) {
            subscriber->update(message);
        }
    }
    void createMessage(std::string message) {
        this->message = message;
        notify();
    }
};

class ConcreteSubscriber : public Subscriber {
public:
    void update(const std::string &message_from_subject) override {
        std::cout << "Message to subscriber: " << message_from_subject << std::endl;
    }
};

int main() {
    Publisher *publisher = new Publisher;
    Subscriber *subscriber1 = new ConcreteSubscriber;
    Subscriber *subscriber2 = new ConcreteSubscriber;

    publisher->attach(subscriber1);
    publisher->attach(subscriber2);
    publisher->createMessage("Hello World!");

    delete subscriber1;
    delete subscriber2;
    delete publisher;

    return 0;
}

Adaptabilidade a Mudanças

Mudanças em tecnologias periféricas (como banco de dados, servidores web, frameworks) podem ser feitas com mínimo ou nenhum impacto na lógica de negócio. Isso é possível porque a comunicação com essas tecnologias é feita através de portas e adaptadores que podem ser facilmente substituídos ou modificados.

Conclusão

A arquitetura Pub/Sub é uma escolha robusta e escalável para sistemas que requerem comunicação eficiente entre componentes desacoplados. Sua aplicabilidade varia desde pequenas aplicações até grandes sistemas empresariais, destacando-se pela flexibilidade, desempenho e capacidade de integração.