Introdução ao Apache Pulsar
1. Introdução
Apache Pulsar is a distributed open source Publication/Subscription based messaging system developed at Yahoo.
Ele foi criado para alimentar os aplicativos essenciais do Yahoo, como Yahoo Mail, Yahoo Finance, Yahoo Sports etc. Então, em 2016, foi de código aberto sob a Apache Software Foundation.
2. Arquitetura
Pulsar is a multi-tenant, high-performance solution for server-to-server messaging. É composto por um conjunto de corretores e agenciadores, juntamente com umApache ZooKeeper embutido para configuração e gerenciamento. Os bookies são deApache BookKeeper, que fornecem armazenamento para as mensagens até que sejam consumidas.
Em um cluster, teremos:
-
Vários intermediários de cluster para manipular a mensagem recebida dos produtores e despachar a mensagem para os consumidores
-
Apache BookKeeper para dar suporte à persistência de mensagens
-
Apache ZooKeeper para armazenar a configuração do cluster
Para entender melhor isso, vamos dar uma olhada no diagrama de arquitetura dedocumentation:
3. Características principais
Vamos começar com uma rápida olhada em alguns dos principais recursos:
-
Suporte embutido para vários clusters
-
Suporte para replicação geográfica de mensagens em vários clusters
-
Vários modos de assinatura
-
Escalável para milhões de tópicos
-
Usa o Apache BookKeeper para garantir a entrega da mensagem.
-
Baixa latência
Agora, vamos discutir alguns dos principais recursos em detalhes.
3.1. Modelo de Mensagens
A estrutura fornece um modelo de mensagens flexível. Em geral, as arquiteturas de mensagens têm dois modelos de mensagens, ou seja, enfileiramento e editor / assinante. Publisher/Subscriber is a broadcast messaging system in which the message is sent to all consumers. Por outro lado, a fila é um ponto a ponto da comunicação.
Pulsar combines both concepts in one generalized API. O editor publica as mensagens para diferentes tópicos. Em seguida, essas mensagens são transmitidas para todas as assinaturas.
Os consumidores se inscrevem para receber mensagens. A biblioteca permite que os consumidores escolham as diferentes maneiras de consumir mensagens na mesma assinatura, incluindo exclusividade, compartilhamento e failover. Discutiremos esses tipos de assinatura em detalhes nas seções posteriores.
3.2. Modos de implantação
Pulsar has inbuilt support for deployment in different environments. Isso significa que podemos usá-lo em máquinas locais padrão ou implantá-lo em um cluster Kubernetes, Google ou AWS Cloud.
Pode ser executado como um único nó para fins de desenvolvimento e teste. Nesse caso, todos os componentes (broker, BookKeeper e ZooKeeper) são executados em um único processo.
3.3. Replicação geográfica
The library provides out of the box support for geo-replication of data. Podemos ativar a replicação de mensagens entre vários clusters configurando diferentes regiões geográficas.
Os dados da mensagem são replicados quase em tempo real. Em caso de falha na rede entre os clusters, os dados estão sempre seguros e armazenados no BookKeeper. O sistema de replicação continua tentando novamente até que a replicação seja bem-sucedida.
The geo-replication feature also allows the organization to deploy Pulsar across different cloud providers and replicate the data. Isso os ajuda a evitar o uso de APIs de provedor de nuvem proprietário.
3.4. Permanência
After Pulsar reads and acknowledges the data, it guarantees no data loss. A durabilidade dos dados está relacionada ao número de discos configurados para armazenar os dados.
O Pulsar garante durabilidade usando agenciadores de apostas (instância do Apache BookKeeper) em execução nos nós de armazenamento. Sempre que um apostador recebe uma mensagem, ele salva uma cópia na memória e também grava os dados em um WAL (Write Ahead Log). Esse log funciona da mesma maneira que um WAL de banco de dados. Os agentes de apostas operam com o princípio de transação do banco de dados e garantem que os dados não sejam perdidos, mesmo em caso de falha da máquina.
Além do acima, o Pulsar também pode suportar várias falhas de nós. A biblioteca replica dados para vários agenciadores de apostas e envia uma mensagem de confirmação ao produtor. Esse mecanismo garante que nenhuma perda de dados seja zero, mesmo no caso de várias falhas de hardware.
4. Configuração de nó único
Agora vamos ver como configurar um cluster de nó único do Apache Pulsar.
Apache also provides a simple client API with bindings for Java, Python, and C++. Mais tarde, criaremos um produtor Java simples e um exemplo de assinatura.
4.1. Instalação
O Apache Pulsar está disponível como uma distribuição binária. Vamos começar fazendo o download:
wget https://archive.apache.org/dist/incubator/pulsar/pulsar-2.1.1-incubating/apache-pulsar-2.1.1-incubating-bin.tar.gz
Quando o download estiver concluído, podemos desarquivar o arquivo zip. A distribuição desarquivada conterá a pastabin, conf, example, licenseselib.
Depois disso, precisamos fazer o download dos conectores embutidos. Agora eles são enviados como um pacote separado:
wget https://archive.apache.org/dist/incubator/pulsar/pulsar-2.1.1-incubating/apache-pulsar-io-connectors-2.1.1-incubating-bin.tar.gz
Vamos desarquivar os conectores e copiar a pastaConnectors na pasta Pulsar.
4.2. Iniciando uma Instância
Para iniciar uma instância autônoma, podemos executar:
bin/pulsar standalone
5. Cliente Java
Agora vamos criar um projeto Java para produzir e consumir mensagens. Também criaremos exemplos para diferentes tipos de assinatura.
5.1. Configurando o Projeto
Começaremos adicionando a dependênciapulsar-client ao nosso projeto:
org.apache.pulsar
pulsar-client
2.1.1-incubating
5.2. Produtor
Vamos continuar criando um exemploProducer. Aqui, vamos criar um tópico e um produtor.
First, we need to create a PulsarClient which will connect to a Pulsar service on a specific host and port, using seu próprio protocolo. Muitos produtores e consumidores podem compartilhar um único objeto de cliente.
Agora, vamos criar umProducer com o nome do tópico específico:
private static final String SERVICE_URL = "pulsar://localhost:6650";
private static final String TOPIC_NAME = "test-topic";
PulsarClient client = PulsarClient.builder()
.serviceUrl(SERVICE_URL)
.build();
Producer producer = client.newProducer()
.topic(TOPIC_NAME)
.compressionType(CompressionType.LZ4)
.create();
O produtor enviará 5 mensagens:
IntStream.range(1, 5).forEach(i -> {
String content = String.format("hi-pulsar-%d", i);
Message msg = MessageBuilder.create()
.setContent(content.getBytes())
.build();
MessageId msgId = producer.send(msg);
});
5.3. Consumidor
A seguir, criaremos o consumidor para obter as mensagens criadas pelo produtor. O consumidor também requer o mesmoPulsarClient para se conectar ao nosso servidor:
Consumer consumer = client.newConsumer()
.topic(TOPIC_NAME)
.subscriptionType(SubscriptionType.Shared)
.subscriptionName(SUBSCRIPTION_NAME)
.subscribe();
Aqui, criamos o cliente com um tipo de assinaturaShared. Isso permite que vários consumidores se conectem à mesma assinatura e recebam mensagens.
5.4. Tipos de assinatura para consumidor
No exemplo do consumidor acima,we have created a subscription with shared type. We can also create exclusive and failover subscriptions.
A assinaturaexclusive permite que apenas um consumidor seja inscrito.
Por outro lado, um failover subscription permite ao usuário definir o consumidor substituto, caso um consumidor falhe, conforme mostrado neste diagrama do Apache:
6. Conclusão
Neste artigo, destacamos os recursos do sistema de mensagens Pulsar, como o modelo de mensagens, georreplicação e fortes garantias de durabilidade.
Também aprendemos como configurar um único nó e como usar o cliente Java.
Como sempre, a implementação completa deste tutorial pode ser encontradaover on Github.