02_Pulsar的集群架构、架构基本介绍、Pulsar提供的组件介绍、Brokers介绍、Zookeeper的元数据存储、基于bookKeeper持久化存储、Pulsar代理

1.2. Apache Pulsar的集群架构
1.2.1.架构基本介绍
1.2.2.Apache Pulsar提供的组件介绍
1.2.2.1.Brokers介绍
1.2.2.2.Zookeeper的元数据存储
1.2.2.3.基于bookKeeper持久化存储
1.2.2.4.基于bookKeeper持久化存储
1.2.2.5.Pulsar代理

1.2. Apache Pulsar的集群架构

1.2.1.架构基本介绍

单个 Pulsar 集群由以下三部分组成:

  • 多个broker 负责处理和负载均衡 producer 发出的消息,并将这些消息分派给 consumer;Broker 与 Pulsar 配置存储交互来处理相应的任务,并将消息存储在 BookKeeper 实例中(又称 bookies);Broker 依赖 ZooKeeper集群处理特定的任务,等等。
  • 多个 bookie 的 BookKeeper 集群负责消息的持久化存储。
  • 一个zookeeper集群,用来处理多个Pulsar集群之间的协调任务。
    在这里插入图片描述

1.2.2.Apache Pulsar提供的组件介绍

1.2.2.1.Brokers介绍

Pulsar的broker是一个无状态组件,主要负责运行另外的两个组件:

  • 一个 HTTP服务器, 它暴露了REST 系统管理接口以及在生产者和消费者之间进行Topic查找的API。
  • 一个调度分发器, 它是异步的TCP服务器,通过自定义二进制协议应用于所有相关的数据传输。

出于性能考虑,消息通常从Managed Ledger缓存中分派出去,除非积压超过缓存大小。如果积压的消息对于缓存来说太大了, 则Broker将开始从BookKeeper那里读取Entries(Entry同样是BookKeeper中的概念,相当于一条记录)。

最后,为了支持全局Topic异地复制,Broker会控制Replicators追踪本地发布的条目,并把这些条目用Java客户端重新发布到其他区域。

1.2.2.2.Zookeeper的元数据存储

Pulsar使用Apache Zookeeper进行元数据存储、集群配置和协调。
配置存储:存储租户,命名域和其他需要全局一致的配置项。
每个集群有自己独立的Zookeeper保存集群内部配置和协调信息,例如归属信息,broker负载报告,BookKeeper ledger信息(这个是BookKeeper本身所依赖的)等等。

1.2.2.3.基于bookKeeper持久化存储

Apache Pulsar 为应用程序提供有保证的信息传递, 如果消息成功到达broker, 就认为其预期到达了目的地。

为了提供这种保证,未确认送达的消息需要持久化存储直到它们被确认送达。这种消息传递模式通常称为持久消息传递. 在Pulsar内部,所有消息都被保存并同步N份,例如,2个服务器保存四份,每个服务器上面都有镜像的RAID存储。
Pulsar用Apache bookKeeper作为持久化存储。 bookKeeper是一个分布式的预写日志(WAL)系统,有如下几个特性特别适合Pulsar的应用场景:

  1. 使pulsar能够利用独立的日志,称为ledgers. 可以随着时间的推移为topic创建多个Ledgers。
  2. 它为处理顺序消息提供了非常有效的存储。
  3. 保证了多系统挂掉时Ledgers的读取一致性。
  4. 提供不同的Bookies之间均匀的IO分布的特性。
  5. 它在容量和吞吐量方面都具有水平伸缩性。能够通过增加bookies立即增加容量到集群中,并提升吞吐量
  6. Bookies被设计成可以承载数千的并发读写的ledgers。 使用多个磁盘设备 (一个用于日志,另一个用于一般存储) ,这样Bookies可以将读操作的影响和对于写操作的延迟分隔开。
1.2.2.4.基于bookKeeper持久化存储

在这里插入图片描述
Ledger是一个只追加的数据结构,并且只有一个写入器,这个写入器负责多个bookKeeper存储节点(就是Bookies)的写入。 Ledger的条目会被复制到多个bookies。 Ledgers本身有着非常简单的语义:

  • Pulsar Broker可以创建ledeger,添加内容到ledger和关闭ledger。
  • 当一个ledger被关闭后,除非明确的要写数据或者是因为写入器挂掉导致ledger关闭,ledger只会以只读模式打开。
  • 最后,当ledger中的条目不再有用的时候,整个ledger可以被删除(ledger分布是跨Bookies的)。
1.2.2.5.Pulsar代理

Pulsar客户端和Pulsar集群交互的一种方式就是直连Pulsar brokers。然而,在某些情况下,这种直连既不可行也不可
取,因为客户端并不知道broker的地址。 例如在云环境或者Kubernetes以及其他类似的系统上面运行Pulsar,直连
brokers就基本上不可能了。

Pulsar proxy 为这个问题提供了一个解决方案, 为所有的broker提供了一个网关, 如果选择运行了Pulsar Proxy。所有的客户都会通过这个代理而不是直接与brokers通信。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
1. 环境准备 - Pulsar集群 - Java 8 - Spring Boot 2.x - Pulsar Java Client 2. 添加依赖 在`pom.xml`中添加以下依赖: ```xml <dependency> <groupId>org.apache.pulsar</groupId> <artifactId>pulsar-client</artifactId> <version>${pulsar.version}</version> </dependency> <dependency> <groupId>org.apache.pulsar</groupId> <artifactId>pulsar-spring-boot-starter</artifactId> <version>${pulsar.version}</version> </dependency> ``` 其中`${pulsar.version}`为Pulsar的版本号。 3. 配置Pulsar连接信息 在`application.yml`中添加以下配置: ```yaml pulsar: serviceUrl: pulsar://localhost:6650 authPluginClassName: org.apache.pulsar.client.impl.auth.AuthenticationToken authParams: token:eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c ``` 其中`serviceUrl`为Pulsar集群连接地址,`authPluginClassName`和`authParams`为认证信息,可以根据实际情况进行修改。 4. 发送消息 在Spring Boot中可以使用`PulsarTemplate`来发送消息,示例代码如下: ```java import org.apache.pulsar.client.api.MessageId; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.util.concurrent.ListenableFutureCallback; import org.springframework.util.concurrent.ListenableFutureTask; import org.springframework.util.concurrent.ListenableFutureTaskAdapter; @Service public class PulsarProducerService { @Autowired private PulsarTemplate<String> pulsarTemplate; public void sendMessage(String topic, String message) { ListenableFutureTask<MessageId> future = new ListenableFutureTaskAdapter<>(() -> pulsarTemplate.send(topic, message)); future.addCallback(new ListenableFutureCallback<MessageId>() { @Override public void onFailure(Throwable ex) { System.out.println("Send message failed: " + ex.getMessage()); } @Override public void onSuccess(MessageId result) { System.out.println("Send message success: " + result); } }); future.run(); } } ``` 在上述代码中,`PulsarTemplate`使用泛型`<String>`,表示发送的消息为字符串类型。`sendMessage`方法接收两个参数,分别为消息的主题和内容。发送消息的过程中,使用`ListenableFuture`来处理异步回调。在回调函数中,可以根据发送结果进行相应的处理。 5. 接收消息 在Spring Boot中可以使用`PulsarConsumerFactory`来创建消费者,示例代码如下: ```java import org.apache.pulsar.client.api.Consumer; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; @Service public class PulsarConsumerService { @Autowired private PulsarConsumerFactory pulsarConsumerFactory; public void receiveMessage(String topic, ConsumerMessageHandler<String> handler) throws Exception { Consumer<String> consumer = pulsarConsumerFactory.createConsumer(topic, "my-subscription", String.class); consumer.subscribe(); while (true) { String message = consumer.receive().getValue(); handler.handle(message); consumer.acknowledgeAsync(consumer.getLastMessageId()); } } } ``` 在上述代码中,`PulsarConsumerFactory`使用泛型`<String>`,表示接收消息的类型为字符串。`receiveMessage`方法接收两个参数,分别为消息的主题和消息处理器。在接收消息的过程中,使用`while`循环不断接收消息,并交给消息处理器进行处理。处理完成后,使用`acknowledgeAsync`方法对消息进行确认。 6. 运行测试 在完成上述步骤后,可以编写测试代码来测试消息的发送和接收。示例代码如下: ```java import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; @SpringBootTest class PulsarApplicationTests { @Autowired private PulsarProducerService pulsarProducerService; @Autowired private PulsarConsumerService pulsarConsumerService; @Test void sendMessage() { pulsarProducerService.sendMessage("my-topic", "Hello, Pulsar!"); } @Test void receiveMessage() throws Exception { pulsarConsumerService.receiveMessage("my-topic", message -> { System.out.println("Received message: " + message); }); } } ``` 在运行测试代码后,可以在控制台中看到消息发送和接收的相关信息。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

涂作权的博客

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值