Pulsar概述
Pulsar 是一个多租户,服务器到服务器消息的高性能解决方案。由Yahoo开发,现在由apache基金会管理。
Pulsar的关键特性如下:
- Pulsar实例原生支持多集群,能够无缝的基于地理位置 进行跨集群的备份.
- 非常低的消息发布和端到端的延迟.
- 无缝的扩展到超过一百万个topic.
- 一套简单的客户端API ,支持 Java, Python, 和 C++.
- Topic支持多种 订阅模式: 独占(exclusive), 共享(shared), and 备援(failover)
- 通过Apache BookKeeper提供的 持久化消息存储机制 保证消息的送达.
- 一个serverless的轻量级计算框架 Pulsar Functions 提供了原生的流数据处理
- 一个serverless的连接器框架Pulsar IO,构建于 Pulsar Functions之上,能够轻松的将数据从Apache Pulsar中移入和移出
- 当数据老化时,分层式存储 将数据从热存储卸载到冷存储中(比如S3、GCS等)
pulsar消息系统概念
pulsar采用了发布订阅模型,及pub-sub模型,生产者发布消息到topic,消费者从topic订阅消息。
Messages
Component | 作用 |
---|---|
Value / data payload | message携带的数据,pulsar的message携带的原生字节数组 |
Key | 消息可以被Key打标签。这对诸如topic压缩之类的事情有作用 |
Properties | 可选的,用户定义属性 的key/value map |
Producer名称 | 生产消息的producer名称(producer被自动赋予默认名称,但你也可以自己指定) |
序列ID | Topic中,每个Pulsar消息属于一个有序的序列。消息的序列ID是他在序列中的次序。 |
发布时间 | 消息发布的时间戳(producer自动附上) |
事件时间 | 可选的时间戳,应用可以附在消息上,代表某个事件发生的时间,例如,消息被处理时间。如果没有明确的设置,那么事件时间为0。 |
Producer
Producer生产数据支持压缩:LZ4, ZLIB, ZSTD,SAPPY。Producer可以以同步(sync)或者异步(async)的方式发布消息到broker。
Mode | 说明: |
---|---|
同步发送 | 发送消息后,producer等待broker的确认。如果没有收到确认,producer会认为发送失败。 |
异步发送 | Producer将会把消息放入blocking队列,然后马上返回。 然后,客户端将在后台将消息发送给broker。 如果队列满,生产者可以阻塞或者失败,如果响应和传递给producer的参数相关。 |
批处理
如果批处理开启,producer将会累积一批消息,然后通过一次请求发送出去。批处理的大小取决于最大的消息数量及最大的发布延迟。
Consumer
消费者订阅topic,消费topic的数据,有同步和异步两种方式。
Mode | 说明: |
---|---|
同步接收 | 同步接收将会阻塞,直到消息可用。 |
异步接收 | 异步接收立即返回future值—例如java中的 CompletableFuture ,一旦新消息可用,他即刻完成。 |
监听
客户端lib中提供了消费者的监听接口。例如, Java client 提供了MesssageListener 接口. 在这个接口中,一旦接受到新的消息,received
方法将被调用。
消费确认
消费者消费数据之后,会给broker发送一个确认请求,broker接受了确认请求之后,可以将message删除,否则,会存储消息。
消息的确认可以一个接一个,也可以累积一起。 累积确认时,消费者只需要确认最后一条他收到的消息。 所有之前(包含此条)的消息,都不会被再次重发给那个消费者。
注意:累加确认的方式不能再共享订阅模式中使用。