文章目录
引言
今天一起来看看Pulsar服务端消息相关最重要的一个类PersistentTopic,看看它都负责哪些事情以及是如何设计的
正文
在Topic被创建时,Pulsar集群中会有一台Broker维护这个Topic,在实现上就是维护一个PersistentTopic对象,这个PersistentTopic对象处理针对该Topic相关的一切操作,具体负责的相关操作如下
- 处理订阅以及下线订阅
- 新增生产者对象以及下线生产者对象
- 处理消息写入
- 进行跨集群复制
- 记录Topic度量状态以及做Topic限流
- 检查消息的TTL、积压、压缩、配置策略更新
绘成表格的形式如下图
本篇文章不会深入讲解每一项,主要是大概过下这个类都做了哪些事情以及大致逻辑,因为服务端的代码会经常跟这个类打交道,因此专门弄清楚这个类的相关知识还是很有必要的。接下来就让我们带着以下三个疑问去看下面的内容
- PersistentTopic在什么时候会被创建?都有哪些重要的成员变量?
- PersistentTopic的创建流程都会发生什么?
- 上面那些相关操作大概是什么实现的?
一、何时创建
以下列出创建的时机,基本上流程都是发起创建Topic的时候会通过一致性哈希计算出这个Topic所归属的Bundle,然后去zookeeper获取这个Bundle所归属的Broker机器,最后请求这台Broker节点创建对应的PersistentTopic对象
- 管理流创建
- cli管理命令行
- 多语言Client
- Http方式
- 写入流创建
- 生产者写入流
- 消费者写入流
接下来看看这个类的主要成员变量,重要的一些已经加上注释解释了
public class PersistentTopic extends AbstractTopic implements Topic, AddEntryCallback {
// 管理Bookkeeper的Ledger,在做消息读取或者写入时会通过该对象
protected final ManagedLedger ledger;
// 存储订阅当前Topic的所有订阅对象,key是订阅名,value是订阅对象
private final ConcurrentOpenHashMap<String, PersistentSubscription> subscriptions;
// 管理对端集群,负责做跨集群数据复制
private final ConcurrentOpenHashMap<String/*RemoteCluster*/, Replicator> replicators;
//跟replicators类似
private final ConcurrentOpenHashMap<String/*ShadowTopic*/, Replicator> shadowReplicators;
@Getter
private volatile List<String> shadowTopics;
private final TopicName shadowSourceTopic;
//调度限流器
private Optional<DispatchRateLimiter> dispatchRateLimiter = Optional.empty();
//调度限流锁
private final Object dispatchRateLimiterLock = new Object();
//订阅限流器
private Optional<SubscribeRateLimiter> subscribeRateLimiter = Optional.empty();
//积压游标阈值条数
private final long backloggedCursorThresholdEntries;
public static final int MESSAGE_RATE_BACKOFF_MS = 1000;
//处理消息重复情况
protected final MessageDeduplication messageDeduplication;
//处理消息压缩服务
private TopicCompactionService topicCompactionService;
// 在对外开放压缩策略配置时,根据用户配置创建对应的压缩策略
private static Map<String, TopicCompactionStrategy> strategicCompactionMap = Map.of(
ServiceUnitStateChannelImpl.TOPIC,
new ServiceUnitStateCompactionStrategy());
//未知
private CompletableFuture<MessageIdImpl> currentOffload = CompletableFuture.completedFuture(
(MessageIdImpl) MessageId.earliest);
//负责跨集群复制时订阅相关事项
private volatile Optional<ReplicatedSubscriptionsController> replicatedSubscriptionsController = Optional.empty();
//记录Topic度量相关信息,如这个Topic的写入速率、消费速率等
private static final FastThreadLocal<TopicStatsHelper> threadLocalTopicStats =
new FastThreadLocal