pulsar Documentation

Apache Pulsar - distributed pub-sub messaging system

15,310 stars Java Java 1 file ยท ~13,639 tokens #event-streaming#messaging#pubsub#pulsar#queuing#streaming
RAW Doc

1. Project Overview & Quickstart (apache/pulsar)

File: README.md






Pulsar is a distributed pub-sub messaging platform with a very
flexible messaging model and an intuitive client API.

Learn more about Pulsar at https://pulsar.apache.org

Main features

  • Horizontally scalable (Millions of independent topics and millions
    of messages published per second)
  • Strong ordering and consistency guarantees
  • Low latency durable storage
  • Topic and queue semantics
  • Load balancer
  • Designed for being deployed as a hosted service:
    • Multi-tenant
    • Authentication
    • Authorization
    • Quotas
    • Support mixing very different workloads
    • Optional hardware isolation
  • Keeps track of consumer cursor position
  • REST API for provisioning, admin and stats
  • Geo replication
  • Transparent handling of partitioned topics
  • Transparent batching of messages

Repositories

This repository is the main repository of Apache Pulsar. Pulsar PMC also maintains other repositories for
components in the Pulsar ecosystem, including connectors, adapters, and other language clients.

Helm Chart

Ecosystem

Clients

Dashboard & Management Tools

Website

CI/CD

Archived/Halted

Pulsar Runtime Java Version Recommendation

Note:

When using Java versions, it is recommended to
use a recent version of a particular Java release (17 or 21)
with the most recent bug fixes and security patches.
For example, the JVM bug JDK-8351933 can cause stability issues in
Pulsar.
JDK-8351933 was fixed in Java 17.0.17+ and Java 21.0.8+.
Pulsar Docker images come with the most recent Java version at the time of release.

When using the Pulsar Java client, it is recommended to set specific system properties and JVM options to allow optimal performance.

pulsar ver >= 4.1 and master branch

Component Java Version
Broker 21
Functions / IO 21
CLI 17 or 21
Java Client 17 or 21

Docker image Java runtime: 21

3.3 <= pulsar ver <= 4.0

Component Java Version
Broker 21
Functions / IO 21
CLI 17 or 21
Java Client 8, 11, 17 or 21

Docker image Java runtime: 21

2.10 <= pulsar ver <= 3.0

Component Java Version
Broker 17
Functions / IO 17
CLI 17
Java Client 8 or 11 or 17

Docker image Java runtime: 17

2.8 <= pulsar ver <= 2.10

Component Java Version
Broker 11
Functions / IO 11
CLI 8 or 11
Java Client 8 or 11

pulsar ver < 2.8

Component Java Version
All 8 or 11

Build Pulsar

The quick start below covers the essentials; see CONTRIBUTING.md โ†’ Building
for the full build and lint commands, and ARCHITECTURE.md โ†’ Build infrastructure
for the Gradle build infrastructure and how to change build files.

Requirements

There is also a guide for setting up the tooling for building Pulsar.

Note:

This project includes a Gradle Wrapper so no separate Gradle installation is needed.
Use ./gradlew on Linux/macOS and gradlew.bat on Windows.

For a better developer experience, install Gradle command-line completion (gradle-completion installation) for bash and zsh shells.

Build

bash
./gradlew assemble                                                       # compile and assemble
./gradlew :pulsar-client-original:test --tests "ConsumerBuilderImplTest" # run a single test
bin/pulsar standalone                                                    # run a standalone service
./gradlew quickCheck                                                     # license headers + checkstyle, no compile
./gradlew sanityCheck                                                    # quickCheck + compile main/test (pre-PR)

For the full build, lint, test, and PR workflow โ€” test groups, integration tests, Personal CI, and PR
conventions โ€” see CONTRIBUTING.md. For the module map and the Gradle build
infrastructure see ARCHITECTURE.md, and for coding conventions see
CODING.md. AI coding agents should start from AGENTS.md.

Check https://pulsar.apache.org for documentation and examples.

Build custom docker images

The commands used in the Apache Pulsar release process can be found in the release process documentation.

Here are some general instructions for building custom docker images:

  • Java 21 is the recommended JDK version since branch-4.0.

The following command builds the docker image apachepulsar/pulsar:latest:

bash
./gradlew docker

After the image is built, it can be tagged and pushed to your custom repository. Here's an example of a bash script that tags the docker image with the current version and git revision and pushes it to localhost:32000/apachepulsar.

bash
image_repo_and_project=localhost:32000/apachepulsar
pulsar_version=$(src/get-pulsar-version.sh)
gitrev=$(git rev-parse HEAD | colrm 10)
tag="${pulsar_version}-${gitrev}"
echo "Using tag $tag"
docker tag apachepulsar/pulsar:latest ${image_repo_and_project}/pulsar:$tag
docker push ${image_repo_and_project}/pulsar:$tag

Setting up your IDE

Read https://pulsar.apache.org/contribute/setup-ide for setting up IntelliJ IDEA or Eclipse for developing Pulsar.

Documentation

Note:

For how to make contributions to Pulsar documentation, see Pulsar Documentation Contribution Guide.

Contact

Mailing lists

  • The mailing lists are the primary contact for the Apache Pulsar project.
  • Your email to the mailing list might be placed in a moderation queue if you haven't joined the mailing list by subscribing before posting.

Note

Please note that security-related issues or concerns should not be reported in public channels.
Follow the instructions in the Security Policy to contact the ASF Security Team and the Apache Pulsar PMC directly.

Name Scope Subscribe Unsubscribe Archives
[email protected] User-related discussions Subscribe Unsubscribe Archives
[email protected] Development-related discussions Subscribe Unsubscribe Archives

Slack

Pulsar slack channel at https://apache-pulsar.slack.com/

You can self-register at https://communityinviter.com/apps/apache-pulsar/apache-pulsar

Security Policy

See the Pulsar security policy for the full policy. In short: never disclose a suspected vulnerability publicly (issue, PR, or discussion) before a fix is released, and a human must verify and take responsibility for a report โ€” autonomous agents must not file security reports on their own.

Reporting a security vulnerability

Report privately by email to the Apache Security Team at [email protected]; you may also copy the Apache Pulsar PMC's private list, [email protected]. See the Pulsar security policy for more detail.

Checking exposure to an already-public CVE

An already-public CVE is not a private disclosure. Search PRs and issues by the CVE id at https://github.com/apache/pulsar/pulls (including closed ones), then ask via a GitHub issue or the [email protected] mailing list if needed. Pulsar's supported versions are listed at https://pulsar.apache.org/contribute/release-policy/; upgrade to a supported version to receive security updates. See the Pulsar security policy.

License

Licensed under the Apache License, Version 2.0: http://www.apache.org/licenses/LICENSE-2.0

Crypto Notice

This distribution includes cryptographic software. The country in which you currently reside may have restrictions on the import, possession, use, and/or re-export to another country, of encryption software. BEFORE using any encryption software, please check your country's laws, regulations and policies concerning the import, possession, or use, and re-export of encryption software, to see if this is permitted. See The Wassenaar Arrangement for more information.

The U.S. Government Department of Commerce, Bureau of Industry and Security (BIS), has classified this software as Export Commodity Control Number (ECCN) 5D002.C.1, which includes information security software using or performing cryptographic functions with asymmetric algorithms. The form and manner of this Apache Software Foundation distribution makes it eligible for export under the License Exception ENC Technology Software Unrestricted (TSU) exception (see the BIS Export Administration Regulations, Section 740.13) for both object code and source code.

The following provides more details on the included cryptographic software: Pulsar uses the SSL library from Bouncy Castle written by http://www.bouncycastle.org.


File: deployment/kubernetes/helm/README.md

The Helm Chart is moved to pulsar-helm-chart.

Read Deploying Pulsar on Kubernetes for more details.


File: deployment/kubernetes/README.md

This directory contains the Kubernetes services definitions for all
the components required to do a complete Pulsar deployment.

Refer to Kubernetes.md document for instructions on
how to deploy Pulsar on a Kubernetes cluster.


File: docker/README.md

Apache Pulsar Docker Images

The Apache Pulsar community produces the apachepulsar/pulsar docker image with each official release.

Since the 2.10.0 release, these docker images run as an unnamed, non-root user that is also part of the root group, by
default. This was done to increase container security. The user is part of the root group to ensure that the container
image can easily run on OpenShift and to ensure that the Pulsar process can write to configuration files.

Development

You can build and test the docker image on your own machine by running the ./build.sh script in this directory.
Note that you first must build the project in order to have the right dependencies in your local environment.

Building Derivative Custom Images

If you want to use a connector, you can easily build an image with a curated list of connectors based on the official
Apache Pulsar image. For more information please see the
Pulsar Connectors repository.

Troubleshooting non-root containers

Troubleshooting is harder because the docker image runs as a non-root user. For example, a non-root user won't be able
to download arbitrary utilities. There are several ways to troubleshoot.

One option is to build a custom docker image that includes your preferred debugging tools. Here is an example of adding
some tools to an existing docker image.

dockerfile
FROM apachepulsar/pulsar:2.10.0

# Switch to root user to download tools
USER 0

# Install your preferred utilities
RUN apt-get update \
     && apt-get install -y vim net-tools unzip \
     && apt-get clean \
     && rm -rf /var/lib/apt/lists/*
     
# Assuming you still want to run as a non root user by default
USER 10000

The remaining debug options depend on your environment. For example, if you have access to the host running your
container, you might be able to use the docker exec command to shell into the container. By using the --user
argument, you can run as the root user.

If you're running your container on kubernetes, you can override the container's default user by setting the pod's
securityContext.

Bitnami provides a helpful guide here: https://engineering.bitnami.com/articles/running-non-root-containers-on-openshift.html.


File: docker-compose/kitchen-sink/README.MD

Apache Pulsar Docker Compose

In this folder path, run the following command to start the cluster.

text
docker-compose up

This command starts individual containers for the following services:

  • ZooKeeper (3)
  • BookKeeper (3)
  • Pulsar (3)
  • Proxy (1)
  • WebSocket (1)
  • Function (1)

Motivation

Most of what is available with Docker and Apache Pulsar uses the standalone version of Apache Pulsar, which is fantastic. But, users need to take care of all of the complexity of Apache Pulsar.

This aims to create a Docker implementation that allows each individual part to be exposed to learn how it all fits together.

URLs

Assume that localhost addresses for the following endpoints are available:

You can shut it down with the following command in the folder path:

text
docker-compose down

You may need to delete the ./data folder created by the Pulsar Manager.

Notes

Docker is notorious for being difficult to manage the startup order of containers. In Pulsar, startup order is very significant. This may cause some containers to fail and have to be restarted.

Generally speaking, everything should be started up successfully in about 2 minutes.

If you plan to use this in production, more care should be taken on restart policies, logging, configuration, etc.


File: grafana/README.md

Grafana Dashboards

In the dashboards directory, you can find sample grafana dashboards for several Pulsar components.


File: microbench/README.md

Microbenchmarks for Apache Pulsar

This module contains microbenchmarks for Apache Pulsar.

Running the benchmarks

The benchmarks are written using JMH. To compile & run the benchmarks, use the following command:

bash
# Compile everything including the shaded microbenchmarks jar
./gradlew :microbench:shadowJar

# run the benchmarks using the standalone shaded jar in any environment
java -jar microbench/build/libs/microbench-*-benchmarks.jar

Running specific benchmarks

Display help:

shell
java -jar microbench/build/libs/microbench-*-benchmarks.jar -h

Listing all benchmarks:

shell
java -jar microbench/build/libs/microbench-*-benchmarks.jar -l

Running specific benchmarks:

shell
java -jar microbench/build/libs/microbench-*-benchmarks.jar ".*BenchmarkName.*"

Running specific benchmarks with machine-readable output and saving the output to a file:

shell
java -jar microbench/build/libs/microbench-*-benchmarks.jar -rf json -rff jmh-result-$(date +%s).json ".*BenchmarkName.*" | tee jmh-result-$(date +%s).txt

The jmh-result-*.json file can be used to visualize the results using JMH Visualizer.

Checking what benchmarks match the pattern:

shell
java -jar microbench/build/libs/microbench-*-benchmarks.jar ".*BenchmarkName.*" -lp

Profiling benchmarks with async-profiler:

Set LIBASYNCPROFILER_PATH to the path of the async-profiler library.

Corretto JDK ships with async-profiler (asprof binary and libasyncProfiler dynamic library)

shell
LIBASYNCPROFILER_PATH=$(ls $JAVA_HOME/lib/libasyncProfiler.*)

Alternatively, download async-profiler from https://github.com/async-profiler/async-profiler/releases and install to ~/async-profiler directory.

Mac OS example:

shell
LIBASYNCPROFILER_PATH=$HOME/async-profiler/lib/libasyncProfiler.dylib

Linux example:

shell
# macos example
LIBASYNCPROFILER_PATH=$HOME/async-profiler/lib/libasyncProfiler.dylib

Then run the benchmarks with the -prof argument:

shell
java -jar microbench/build/libs/microbench-*-benchmarks.jar -prof async:libPath=$LIBASYNCPROFILER_PATH\;output=flamegraph\;dir=profile-results ".*BenchmarkName.*"

When profiling on Mac OS, you might need to add \;event=itimer to the -prof argument since it's the only async profiler CPU sampling engine that supports Mac OS. The default value for event is cpu.

It's possible to add options to the async-profiler that aren't supported by the JMH async-profiler plugin. This can be done by adding rawCommand option to the -prof argument. This example shows how to add all (new in Async Profiler 4.1), jfrsync (record JFR events such as garbage collection) and cstack=vmx options.

shell
java -jar microbench/build/libs/microbench-*-benchmarks.jar -prof async:libPath=$LIBASYNCPROFILER_PATH\;output=jfr\;dir=profile-results\;rawCommand=all,jfrsync,cstack=vmx ".*BenchmarkName.*"

File: pip/README.md

Pulsar Improvement Proposal (PIP)

What is a PIP?

The PIP is a "Pulsar Improvement Proposal" and it's the mechanism used to propose changes to the Apache Pulsar codebases.

The changes might be in terms of new features, large code refactoring, changes to APIs.

In practical terms, the PIP defines a process in which developers can submit a design doc, receive feedback and get the "go ahead" to execute.

What is the goal of a PIP?

There are several goals for the PIP process:

  1. Ensure community technical discussion of major changes to the Apache Pulsar codebase.

  2. Provide clear and thorough design documentation of the proposed changes. Make sure every Pulsar developer will have enough context to effectively perform a code review of the Pull Requests.

  3. Use the PIP document to serve as the baseline on which to create the documentation for the new feature.

  4. Have greater scrutiny to changes are affecting the public APIs (as defined below) to reduce chances of introducing breaking changes or APIs that are not expressing an ideal semantic.

It is not a goal for PIP to add undue process or slow-down the development.

When is a PIP required?

  • Any new feature for Pulsar brokers or client
  • Any change to the public APIs (Client APIs, REST APIs, Plugin APIs)
  • Any change to the wire protocol APIs
  • Any change to the API of Pulsar CLI tools (eg: new options)
  • Any change to the semantic of existing functionality, even when current behavior is incorrect.
  • Any large code change that will touch multiple components
  • Any changes to the metrics (metrics endpoint, topic stats, topics internal stats, broker stats, etc.)
  • Any change to the configuration

When is a PIP *not* required?

  • Bug-fixes
  • Simple enhancements that won't affect the APIs or the semantic
  • Small documentation changes
  • Small website changes
  • Build scripts changes (except: a complete rewrite)

Who can create a PIP?

Any person willing to contribute to the Apache Pulsar project is welcome to create a PIP.

How does the PIP process work?

A PIP proposal can be in these states:

  1. DRAFT: (Optional) This might be used for contributors to collaborate and to seek feedback on an incomplete version of the proposal.

  2. DISCUSSION: The proposal has been submitted to the community for feedback and approval.

  3. ACCEPTED: The proposal has been accepted by the Pulsar project.

  4. REJECTED: The proposal has not been accepted by the Pulsar project.

  5. IMPLEMENTED: The implementation of the proposed changes have been completed and everything has been merged.

  6. RELEASED: The proposed changes have been included in an official
    Apache Pulsar release.

The process works in the following way:

  1. Fork https://github.com/apache/pulsar repository (Using the fork button on GitHub).
  2. Clone the repository, and on it, copy the file pip/TEMPLATE.md and name it pip-xxx.md. The number xxx should be the next sequential number after the last contributed PIP. You view the list of contributed PIPs (at any status) as a list of Pull Requests having a "PIP" label. Use the link here as shortcut.
  3. Write the proposal following the section outlined by the template and the explanation for each section in the comment it contains (you can delete the comment once done).
    • If you need diagrams, avoid attaching large files. You can use MermaidJS as simple language to describe many types of diagrams.
  4. Create GitHub Pull request (PR). The PR title should be [improve][pip] PIP-xxx: {title}, where the xxx match the number given in previous step (file-name). Replace {title} with a short title to your proposal.
    Validate again that your number does not collide, by step (2) numbering check.
  5. The author(s) will email the [email protected] mailing list to kick off a discussion, using subject prefix [DISCUSS] PIP-xxx: {PIP TITLE}. The discussion will happen in broader context either on the mailing list or as general comments on the PR. Many of the discussion items will be on particular aspect of the proposal, hence they should be as comments in the PR to specific lines in the proposal file.
  6. Update file with a link to the discussion on the mailing. You can obtain it from Apache Pony Mail.
  7. Based on the discussion and feedback, some changes might be applied by authors to the text of the proposal. They will be applied as extra commits, making it easier to track the changes.
  8. Once some consensus is reached, there will be a vote to formally approve the proposal. The vote will be held on the [email protected] mailing list, by
    sending a message using subject [VOTE] PIP-xxx: {PIP TITLE}. Make sure to include a link to the PIP PR in the body of the message.
    Make sure to update the PIP with a link to the vote. You can obtain it from Apache Pony Mail.
    Everyone is welcome to vote on the proposal, though only the vote of the PMC members will be considered binding.
    The requirement is to have at least one binding +1 vote from a lazy majority if no binding -1 votes have been cast on the PIP.
    The vote should stay open for at least 48 hours.
  9. When the vote is closed, if the outcome is positive, ask a PMC member (using voting thread on mailing list) to merge the PR.
  10. If the outcome is negative, please close the PR (with a small comment that the close is a result of a vote).

All the future implementation Pull Requests that will be created, should always reference the PIP-XXX in the commit log message and the PR title.
It is advised to create a master GitHub issue to formulate the execution plan and track its progress.

Example

  • Eve ran into some issues with the client metrics - she needed a metric which was missing.
  • She read the code a bit, and has an idea what metrics she wishes to add.
  • She summarized her idea and direction in an email to the DEV mailing list (she located it on
    Discussions section on the website.
  • She didn't get any response from the community, so she joined the next
    community meeting. There Matteo Merli and Asaf helped
    setup a channel in Slack to brainstorm the idea and meet on Zoom with a few Pulsar contributors (e.g. Lari and Tison).
  • Once Eve had a good enough context, and good design outline, she opened a new branch in her Pulsar repository, duplicated
    TEMPLATE.md and created pip-xxx.MD (the number she will take later).
  • She followed the template and submitted the pip as a new PR to pulsar repository.
  • Once the PR was created, she modified the version to match the rules described at step 2, both for PR title and file name.
  • She sent an email to the DEV mailing list, titled "[DISCUSS] PIP-123: Adding metrics for ..." , described shortly in the
    email what the PIP was about and gave a link.
  • She got no response for anyone for 2 weeks, so she nudged the people that helped
    her brainstorm (e.g. Lary and Tison) and pinged in #dev that she needs more reviewers.
  • Once she got 3 reviews from PMC members and the community had at least a few days from the moment
    the PR was announceed on DEV, she sent a vote email to the DEV mailing list titled
    "[VOTE] PIP-123: Adding metrics for ...".
  • She nudged the reviewers to reply with a binding vote, waited for 2-3 days, and then
    concluded the vote by sending a reply tallying up the binding and non-binding votes.
  • She updated the PIP with links to discuss and vote emails, and then asked a PMC member
    who voted +1, to merge (using GitHub mentionon the PR).

List of PIPs

Current PIPs Table of Contents

The following table lists all current PIPs in this directory, sorted by PIP number:

PIP Number Title
PIP-1 Pulsar Proxy
PIP-2 Non Persistent topic
PIP-3 Message dispatch throttling
PIP-4 Pulsar End to End Encryption
PIP-5 Event time
PIP-6 Guaranteed Message Deduplication
PIP-7 Pulsar Failure domain and Anti affinity namespaces
PIP-8 Pulsar beyond 1M topics
PIP-9 Adding more Security checks to Pulsar Proxy
PIP-10 Remove cluster for namespace and topic names
PIP-11 Short topic names
PIP-12 Introduce builder for creating Producer Consumer Reader
PIP-13 Subscribe to topics represented by regular expressions
PIP-14 Topic compaction
PIP-15 Pulsar Functions
PIP-16 Pulsar "instance" terminology change
PIP-17 Tiered storage for Pulsar topics
PIP-18 Pulsar Replicator
PIP-19 Pulsar SQL
PIP-20 Mechanism to revoke TLS authentication
PIP-21 Pulsar Edge Component
PIP-22 Pulsar Dead Letter Topic
PIP-23 Message Tracing By Interceptors
PIP-24 Simplify memory settings
PIP-25 Token based authentication
PIP-26 Delayed Message Delivery
PIP-27 Add checklist in github pull request template
PIP-28 Pulsar Proxy Gateway Improvement
PIP-29 One package for both pulsar-client and pulsar-admin
PIP-30 change authentication provider API to support mutual authentication
PIP-31 Transaction Support
PIP-32 Go Function API, Instance and LocalRun
PIP-33 Replicated subscriptions
PIP-34 Add new subscribe type Key_shared
PIP-35 Improve topic lookup for topics that have high number of partitions
PIP-36 Max Message Size
PIP-37 Large message size handling in Pulsar
PIP-38 Batch Receiving Messages
PIP-39 Namespace Change Events
PIP-40 Pulsar Manager
PIP-41 Pluggable Protocol Handler
PIP-42 KoP - Kafka on Pulsar
PIP-43 producer send message with different schema
PIP-44 Separate schema compatibility checker for producer and consumer
PIP-45 Pluggable metadata interface
PIP-46 Next-gen Proxy
PIP-47 Time Based Release Plan
PIP-48 hierarchical admin api
PIP-49 Permission levels and inheritance
PIP-50 Package Management
PIP-51 Tenant policy support
PIP-52 Message dispatch throttling relative to publish rate
PIP-53 Contribute DotPulsar to Apache Pulsar
PIP-54 Support acknowledgement at batch index level
PIP-55 Refresh Authentication Credentials
PIP-56 Python3 Migration
PIP-57 Improve Broker's Zookeeper Session Timeout Handling
PIP-58 Support Consumers Set Custom Retry Delay
PIP-59 gPRC Protocol Handler
PIP-60 Support Proxy server with SNI routing
PIP-61 Advertised multiple addresses
PIP-62 Move connectors, adapters and Pulsar Presto to separate repositories
PIP-63 Readonly Topic Ownership Support
PIP-64 Introduce REST endpoints for producing, consuming and reading messages
PIP-65 Adapting Pulsar IO Sources to support Batch Sources
PIP-66 Pulsar Function Mesh
PIP-67 Pulsarctl - An alternative tools of pulsar-admin
PIP-68 Exclusive Producer
PIP-69 Schema design for Go client
PIP-70 Introduce lightweight broker entry metadata
PIP-71 Pulsar SQL migrate SchemaHandle to presto decoder
PIP-72 Introduce Pulsar Interface Taxonomy: Audience and Stability Classification
PIP-73 Configurable data source priority for message reading
PIP-74 Pulsar client memory limits
PIP-75 Replace protobuf code generator
PIP-76 Streaming Offload
PIP-77 Contribute Supernova to Apache Pulsar
PIP-78 Generate Docs from Code Automatically
PIP-79 Reduce redundant producers from partitioned producer
PIP-80 Unified namespace-level admin API
PIP-81 Split the individual acknowledgments into multiple entries
PIP-82 Tenant and namespace level rate limiting
PIP-83 Pulsar client: Message consumption with pooled buffer
PIP-84 Pulsar client: Redeliver command add epoch
PIP-85 Expose Pulsar-Client via Function/Connector BaseContext
PIP-86 Pulsar Functions: Preload and release external resources
PIP-87 Upgrade Pulsar Website Framework (Docusaurus)
PIP-88 Replicate schemas across multiple
PIP-89 Structured document logging
PIP-90 Expose broker entry metadata to the client
PIP-91 Separate lookup timeout from operation timeout
PIP-92 Topic policy across multiple clusters
PIP-93 Transaction performance tools
PIP-94 Message converter at broker level
PIP-95 Smart Listener Selection with Multiple Bind Addresses
PIP-96 Message payload processor for Pulsar client
PIP-97 Asynchronous Authentication Provider
PIP-98 Redesign Pulsar Information Architecture
PIP-99 Pulsar Proxy Extensions
PIP-100 Pulsar pluggable topic factory
PIP-101 Add seek by index feature for consumer
PIP-104 Add new consumer type: TableView
PIP-105 Support pluggable entry filter in Dispatcher
PIP-106 Negative acknowledgment backoff
PIP-107 Introduce the chunk message ID PIP
PIP-108 Pulsar Feature Matrix (Client and Function)
PIP-109 Introduce Bot to Improve Efficiency of Developing Docs
PIP-110 Topic metadata
PIP-111 Add messages produced by Protocol Handler When checking maxMessagePublishBufferSizeInMB
PIP-112 Generate Release Notes Automatically
PIP-116 Create Pulsar Writing Style Guide
PIP-117 Change Pulsar Standalone defaults
PIP-118 Do not restart brokers when ZooKeeper session expires
PIP-119 Enable consistent hashing by default on KeyShared dispatcher
PIP-120 Enable client memory limit by default
PIP-121 Pulsar cluster level auto failover
PIP-122 Change loadBalancer default loadSheddingStrategy to ThresholdShedder
PIP-123 Introduce Pulsar metadata CLI tool
PIP-124 Create init subscription before sending message to DLQ
PIP-129 Introduce intermediate state for ledger deletion
PIP-130 Apply redelivery backoff policy for ack timeout
PIP-131 Resolve produce chunk messages failed when topic level maxMessageSize is set
PIP-132 Include message header size when check maxMessageSize for non-batch message on the client side
PIP-135 Include MetadataStore backend for Etcd
PIP-136 Sync Pulsar policies across multiple clouds
PIP-137 Pulsar Client Shared State API
PIP-143 Support split bundle by specified boundaries
PIP-144 Making SchemaRegistry implementation configurable
PIP-146 ManagedCursorInfo compression
PIP-148 Create Pulsar client release notes
PIP-149 Making the REST Admin API fully async
PIP-152 Support subscription level dispatch rate limiter setting
PIP-154 Max active transaction limitation for transaction coordinator
PIP-155 Drop support for Python2
PIP-156 Build and Run Pulsar Server on Java 17
PIP-157 Bucketing topic metadata to allow more topics per namespace
PIP-160 Make transactions work more efficiently by aggregation operation for transaction log and pending ack store
PIP-161 Exclusive Producer: new mode ExclusiveWithFencing
PIP-162 LTS Releases
PIP-165 Auto release client useless connections
PIP-173 Create a built-in Function implementing the most common basic transformations
PIP-174 Provide new implementation for broker dispatch cache
PIP-175 Extend time based release process
PIP-176 Refactor Doc Bot
PIP-177 Add the classLoader field for SchemaDefinition
PIP-178 Multiple snapshots for transaction buffer
PIP-179 Support the admin API to check unknown request parameters
PIP-180 Shadow Topic, an alternative way to support readonly topic ownership
PIP-181 Pulsar Shell
PIP-182 Provide new load balance placement strategy implementation for ModularLoadManagerStrategy
PIP-183 Reduce unnecessary REST call in broker
PIP-184 Topic specific consumer priorityLevel
PIP-186 Introduce two phase deletion protocol based on system topic
PIP-187 Add API to analyse a subscription backlog and provide a accurate value
PIP-188 Cluster migration or Blue-Green cluster deployment support in Pulsar
PIP-189 No batching if only one message in batch
PIP-190 Simplify documentation release and maintenance strategy
PIP-191 Support batched message using entry filter
PIP-192 New Pulsar Broker Load Balancer
PIP-193 Sink preprocessing Function
PIP-194 Pulsar client: seek command add epoch
PIP-195 New bucket based delayed message tracker
PIP-198 Standardize PR Naming Convention using GitHub Actions
PIP-201 Extensions mechanism for Pulsar Admin CLI tools
PIP-204 Extensions for broker interceptor
PIP-205 Reactive Java client for Apache Pulsar
PIP-209 Separate C++/Python clients to own repositories
PIP-243 Register Jackson Java 8 support modules by default
PIP-249 Pulsar website redesign
PIP-259 Make the config httpMaxRequestHeaderSize of the pulsar web server to configurable
PIP-261 Restructure Getting Started section
PIP-264 Support OpenTelemetry metrics in Pulsar
PIP-265 PR-based system for managing and reviewing PIPs
PIP-275 Rename numWorkerThreadsForNonPersistentTopic to topicOrderedExecutorThreadNum
PIP-276 Add pulsar prefix to topic_load_times metric
PIP-277 Add current cluster marking to clusters list command
PIP-278 Pluggable topic compaction service
PIP-279 Support topic-level policies using TableView API
PIP-280 Refactor CLI Argument Parsing Logic for Measurement Units using JCommander's custom converter
PIP-281 Add notifyError method on PushSource
PIP-282 Add Key_Shared subscription initial position support
PIP-284 Migrate topic policies implementation to use TableView
PIP-286 Support get position based on timestamp with topic compaction
PIP-289 Secure Pulsar Connector Configuration
PIP-290 Support message encryption in WebSocket proxy
PIP-292 Enforce token expiration time in the Websockets plugin
PIP-293 Support reader to read compacted data
PIP-296 Add getLastMessageIds API for Reader
PIP-297 Support terminating Function & Connector with the fatal exception
PIP-298 Support read transaction buffer snapshot segments from earliest
PIP-299 Support setting max unacked messages at subscription level
PIP-300 Add RedeliverCount field to CommandAck
PIP-301 Separate load data storage from configuration metadata store
PIP-302 Support for TableView with strong read consistency
PIP-303 Support PartitionedTopicStats exclude publishers and subscriptions
PIP-305 Add OpAddEntry and pendingData statistics info in JVM metrics
PIP-306 Support subscribing multi topics for WebSocket
PIP-307 Optimize Bundle Unload(Transfer) Protocol for ExtensibleLoadManager
PIP-312 Use StateStoreProvider to manage state in Pulsar Functions endpoints
PIP-313 Support force unsubscribe using consumer api
PIP-315 Configurable max delay limit for delayed delivery
PIP-318 Don't retain null-key messages during topic compaction
PIP-320 OpenTelemetry Scaffolding
PIP-321 Split the responsibilities of namespace replication-clusters
PIP-322 Pulsar Rate Limiting Refactoring
PIP-323 Complete Backlog Quota Telemetry
PIP-324 Switch to Alpine Linux base Docker images
PIP-325 Support reading from transaction buffer for pending transaction
PIP-326 Create a BOM to ease dependency management
PIP-327 Support force topic loading for unrecoverable errors
PIP-329 Strategy for maintaining the latest tag to Pulsar docker images
PIP-330 getMessagesById gets all messages
PIP-335 Support Oxia metadata store plugin
PIP-337 SSL Factory Plugin to customize SSLContext/SSLEngine generation
PIP-339 Introducing the --log-topic Option for Pulsar Sinks and Sources
PIP-342 Support OpenTelemetry metrics in Pulsar client
PIP-343 Use picocli instead of jcommander
PIP-344 Correct the behavior of the public API pulsarClient.getPartitionsForTopic(topicName)
PIP-347 add role field in consumer's stat
PIP-348 Trigger offload on topic load stage
PIP-349 Add additionalSystemCursorNames ignore list for ttl check
PIP-350 Allow to disable the managedLedgerOffloadDeletionLagInMillis
PIP-351 Additional options for Pulsar-Test client to support KeyStore based TLS
PIP-352 Event time based topic compactor
PIP-353 Improve transaction message visibility for peek-messages cli
PIP-354 apply topK mechanism to ModularLoadManagerImpl
PIP-355 Enhancing Broker-Level Metrics for Pulsar
PIP-356 Support Geo-Replication starts at earliest position
PIP-357 Correct the conf name in load balance module.
PIP-358 let resource weight work for OverloadShedder, LeastLongTermMessageRate, ModularLoadManagerImpl.
PIP-359 Support custom message listener executor for specific subscription
PIP-360 Admin API to display Schema metadata
PIP-363 Add callback parameters to the method: org.apache.pulsar.client.impl.SendCallback.sendComplete.
PIP-364 Introduce a new load balance algorithm AvgShedder
PIP-366 Support to specify different config for Configuration and Local Metadata Store
PIP-367 Propose a Contributor Repository for Pulsar
PIP-368 Support lookup based on the lookup properties
PIP-369 Flag based selective unload on changing ns-isolation-policy
PIP-370 configurable remote topic creation in geo-replication
PIP-373 Add a topic's system prop that indicates whether users have published TXN messages in before.
PIP-374 Visibility of messages in receiverQueue for the consumers
PIP-376 Make Topic Policies Service Pluggable
PIP-378 Add ServiceUnitStateTableView abstraction (ExtensibleLoadMangerImpl only)
PIP-379 Key_Shared Draining Hashes for Improved Message Ordering
PIP-380 Support setting up specific namespaces to skipping the load-shedding
PIP-381 Handle large PositionInfo state
PIP-383 Support granting/revoking permissions for multiple topics
PIP-384 ManagedLedger interface decoupling
PIP-389 Add Producer config compressMinMsgBodySize to improve compression performance
PIP-391 Improve Batch Messages Acknowledgment
PIP-392 Add configuration to enable consistent hashing to select active consumer for partitioned topic
PIP-393 Improve performance of Negative Acknowledgement
PIP-395 Add Proxy configuration to support configurable response headers for http reverse-proxy
PIP-396 Align WindowFunction's WindowContext with BaseContext
PIP-399 Fix Metric Name for Delayed Queue
PIP-401 Support set batching configurations for Pulsar Functions&Sources
PIP-402 Role Anonymizer for Pulsar Logging
PIP-404 Introduce per-ledger properties
PIP-406 Introduce metrics related to dispatch throttled events
PIP-407 Add a newMessage API to create a message with a schema and transaction
PIP-409 support producer configuration for retry/dead letter topic producer
PIP-412 Support setting messagePayloadProcessor in Pulsar Functions and Sinks
PIP-414 Enforce topic consistency check
PIP-415 Support getting message ID by index
PIP-416 Add a new topic method to implement trigger offload by size threshold
PIP-420 Provides an ability for Pulsar clients to integrate with third-party schema registry service
PIP-421 Require Java 17 as the minimum for Pulsar Java client SDK
PIP-422 Support global topic-level policy: replicated clusters and new API to delete topic-level policies
PIP-425 Support connecting with next available endpoint for multi-endpoint serviceUrls
PIP-427 Align pulsar-admin Default for Mark-Delete Rate with Broker Configuration
PIP-428 Change TopicPoliciesService interface to fix consistency issues
PIP-429 Optimize Handling of Compacted Last Entry by Skipping Payload Buffer Parsing
PIP-430 Pulsar Broker cache improvements: refactoring eviction and adding a new cache strategy based on expected read count
PIP-431 Add Creation and Last Publish Timestamps to Topic Stats
PIP-432 Add isEncrypted field to EncryptionContext
PIP-433 Optimize the conflicts of the replication and automatic creation mechanisms, including the automatic creation of topics and schemas
PIP-435 Add startTimestamp and endTimestamp for consuming messages in client cli
PIP-436 Add decryptFailListener to Consumer

Additional Information

  1. You can view all PIPs (besides the historical ones) as the list of Pull Requests having title starting with [improve][pip] PIP-. Here is the link for it.
    • Merged PR means the PIP was accepted.
    • Closed PR means the PIP was rejected.
    • Open PR means the PIP was submitted and is in the process of discussion.
  2. All PIP files in the pip folder follow the naming convention pip-xxx.md where xxx is the PIP number.

2. Official Technical Reference & Guides (apache/pulsar-site)

Apache Pulsar Website and Documentation

This repository contains the Apache Pulsar website source code and Apache Pulsar documentation.

Apache Pulsar is an open-source, distributed messaging and streaming platform built for the cloud.

Quick start: Updating documentation and previewing changes

Make changes to the documentation in the docs directory.

To preview the changes, run the following command (prerequisites):

shell
./preview.sh

This command starts a local web server on port 3000 and opens a browser window pointing to the website.

Updating versioned docs

When your documentation changes apply to existing supported versions, you should update both the versioned documentation in the versioned_docs directory and the documentation in the docs directory.

shell
# List all supported major.minor.x versions
./scripts/docs-tool.sh supported_versions

After committing the changes for the docs directory, you can use the docs-tool to apply the changes to the versioned docs. This tool is a wrapper around git diff and patch. If the patch is not applied correctly, you will have to manually apply the changes to the versioned docs.

shell
./scripts/docs-tool.sh apply_changes_to_versioned_docs

Markdown placeholders

Markdown files under docs/ and versioned_docs/version-*/ are run through
two preprocessors at build time:

  • @pulsar:version@, @pulsar:rpm:client@, @pulsar:apidoc:python@, etc. โ€”
    version-aware tokens. The values come from versions.json, site-baseurls.js,
    and data/release-*.js. See src/config/pulsarVariables.ts for the full list.
  • {@inject:javadoc:Name:org/...}, {@inject:endpoint|GET|/admin/...} โ€” link
    expansion for Javadoc, GitHub, REST endpoints. See
    src/server/markdownPreprocessors/inject.ts.

To reference the same values from React components, import from
@site/src/config/pulsarVariables โ€” no placeholder is needed in .js/.tsx.

More information

Website not getting updated?

If the https://pulsar.apache.org website doesn't get updated, check the latest GitHub Actions workflow run for the main branch. If it succeeded, the problem could be that the git history for the asf-site-next branch is too large and needs to be truncated. Here are the commands to perform that task:

shell
git clone --depth 1 -b asf-site-next https://github.com/apache/pulsar-site pulsar-site-static
cd pulsar-site-static
git checkout --orphan asf-site-next-truncated
git add -A
git commit -m "History truncated"
git push -f origin HEAD:asf-site-next

Contact information