From bfb326eafa25a0cf0e17a813b00c3ec051d554fc Mon Sep 17 00:00:00 2001 From: Matteo Merli Date: Mon, 22 Jun 2026 11:39:41 -0700 Subject: [PATCH 01/10] Add Pulsar 5.0.0-M1 preview release blog post --- ...6-06-22-announcing-apache-pulsar-5-0-m1.md | 73 +++++++++++++++++++ 1 file changed, 73 insertions(+) create mode 100644 blog/2026-06-22-announcing-apache-pulsar-5-0-m1.md diff --git a/blog/2026-06-22-announcing-apache-pulsar-5-0-m1.md b/blog/2026-06-22-announcing-apache-pulsar-5-0-m1.md new file mode 100644 index 000000000000..de2c88166d48 --- /dev/null +++ b/blog/2026-06-22-announcing-apache-pulsar-5-0-m1.md @@ -0,0 +1,73 @@ +--- +title: "Apache Pulsar 5.0.0-M1: A Preview of the Next Major Release" +author: Matteo Merli +date: 2026-06-22 +--- + +The Apache Pulsar community is voting on **Apache Pulsar 5.0.0-M1**, the first milestone of the upcoming Pulsar 5.0. This is a **preview release**: it bundles the major new features of 5.0 so the community can try them, run them against real workloads, and send feedback well before the general-availability release. It is **not intended for production**. + +5.0 is a big release. Its headline is **Scalable Topics** — a new kind of topic that grows and shrinks on its own — and the elevation of **Oxia** to the recommended metadata store. This post walks through what's in M1 and how to try it. + + + +## A preview, built for feedback + +5.0.0-M1 is a milestone build, not a final release. We're shipping it early, while the community votes on it, for one reason: the changes in 5.0 are significant enough that we want real-world feedback before they're locked in for the GA release, which is targeted for later in 2026. + +Please run it on **non-production** clusters, exercise the new APIs, and tell us what works and what doesn't — file issues on [GitHub](https://github.com/apache/pulsar/issues) or discuss on the [dev@pulsar.apache.org](https://pulsar.apache.org/contact/) mailing list. Your testing now directly shapes what 5.0 becomes at GA. + +## Scalable Topics: topics that size themselves + +For its entire history, Pulsar has scaled a topic's throughput with **partitions** — a count you fix when you create the topic. That model has well-known limits: you have to guess the right number up front, you can never decrease it, and changing it breaks per-key ordering. + +**Scalable topics** remove those limits. A scalable topic — addressed with the new `topic://` scheme — is internally a set of **key-range segments** that the broker **splits** when part of the keyspace gets hot and **merges** when it goes cold: at runtime, with no downtime, and without ever breaking the ordering of any individual key. You never choose a partition count; the topic sizes itself to the load. + +Scalable topics are delivered by a family of proposals in 5.0: + +- **[PIP-460](https://github.com/apache/pulsar/blob/master/pip/pip-460.md): Scalable Topics (Topics v5)** — the overall model: the segment DAG, range-based key routing, and design principles. +- **[PIP-468](https://github.com/apache/pulsar/blob/master/pip/pip-468.md): Scalable Topic Controller** — the broker-side controller that runs split/merge, assigns consumers, and pushes the live topology to clients. +- **[PIP-483](https://github.com/apache/pulsar/blob/master/pip/pip-483.md): Auto Split/Merge** — splits hot segments and merges cold ones automatically, tunable per broker, namespace, and topic. +- **[PIP-466](https://github.com/apache/pulsar/blob/master/pip/pip-466.md): New Java Client API (V5)** — a modern, sync-first Java client built for scalable topics. +- **[PIP-473](https://github.com/apache/pulsar/blob/master/pip/pip-473.md): Metadata-Driven Transactions** — transactions that survive segment splits and merges. +- **[PIP-475](https://github.com/apache/pulsar/blob/master/pip/pip-475.md): Regular-to-Scalable Migration** — convert an existing topic to a scalable topic in place, with no data copy. + +### A new client API + +Scalable topics are served by a new **V5 Java client** (`pulsar-client-v5`) that replaces the four classic subscription types with three purpose-built consumers: + +- **Stream consumer** — ordered, cumulative-ack consumption. +- **Queue consumer** — parallel, individually-acked work-queue consumption with dead-letter support. +- **Checkpoint consumer** — for stream processors (Flink, Spark) that track their own position. + +The V5 client also works against your existing partitioned and non-partitioned topics, so you can adopt the new API before migrating any topic — and a consumer can now subscribe to an entire **namespace**, filtered by topic properties. In M1 the V5 client is available for Java; the other language SDKs will follow before GA. + +Start here: [Scalable topics concepts](https://pulsar.apache.org/docs/next/concepts-scalable-topics), the [V5 Java client](https://pulsar.apache.org/docs/client-libraries/java-v5), and the [migration guide](https://pulsar.apache.org/docs/client-libraries/java-migrate-to-v5). + +## Oxia is now the recommended metadata store + +[Oxia](https://github.com/oxia-db/oxia) is a scalable metadata store and coordination system. In 5.0 it becomes the **recommended metadata store** for new Pulsar clusters, and it is the preferred backend for scalable topics, whose lookups rely on its streaming watch sessions. + +ZooKeeper remains fully supported, and 5.0 makes the transition painless: + +- **[PIP-454](https://github.com/apache/pulsar/blob/master/pip/pip-454.md): Metadata Store Migration Framework** — a live, **zero-downtime** migration from ZooKeeper to Oxia. The data plane keeps publishing and consuming while metadata is copied. See [Migrate metadata store](https://pulsar.apache.org/docs/next/administration-metadata-store-migration). +- **[PIP-469](https://github.com/apache/pulsar/blob/master/pip/pip-469.md): Metadata-store topic policies** — topic policies can be stored directly in the metadata store, with legacy-aware routing for clusters still on system-topic policies. + +5.0 also **removes the etcd metadata store backend** ([PIP-462](https://github.com/apache/pulsar/blob/master/pip/pip-462.md)). ZooKeeper and Oxia are the supported backends going forward; etcd users should migrate before upgrading. + +## Other notable changes + +- **IO connectors moved to a dedicated repository** ([PIP-465](https://github.com/apache/pulsar/blob/master/pip/pip-465.md)) — the built-in connectors now live and release independently of Pulsar core. +- **`javax.*` → `jakarta.*`** ([PIP-472](https://github.com/apache/pulsar/blob/master/pip/pip-472.md)) — Pulsar moves to the Jakarta EE namespace; a breaking change for code that touches the affected APIs. +- **Gradle build** ([PIP-463](https://github.com/apache/pulsar/blob/master/pip/pip-463.md)) — Pulsar's build moves from Maven to Gradle, speeding up builds for contributors. +- **Structured logging** ([PIP-467](https://github.com/apache/pulsar/blob/master/pip/pip-467.md)) — Pulsar adopts structured (slog-style) logging for richer, machine-parseable logs. +- **Flexible networking** — multiple advertised addresses and smarter listener selection ([PIP-61](https://github.com/apache/pulsar/blob/master/pip/pip-61.md), [PIP-95](https://github.com/apache/pulsar/blob/master/pip/pip-95.md)) for multi-network deployments. + +## Try it and tell us what you think + +Once the vote passes and the artifacts are published, download 5.0.0-M1 and try it on a test cluster. Because this is a preview, we especially want to hear about: + +- creating and operating **scalable topics** with the V5 client; +- migrating a cluster's metadata store from **ZooKeeper to Oxia**; +- adopting the **V5 Java client** in an existing application. + +Share feedback on [GitHub](https://github.com/apache/pulsar/issues) or the [dev mailing list](https://pulsar.apache.org/contact/). Thank you for helping shape Apache Pulsar 5.0. From 45f53f6f83eee162eddaedb7f0588c1a502a4bdb Mon Sep 17 00:00:00 2001 From: Matteo Merli Date: Mon, 22 Jun 2026 12:25:02 -0700 Subject: [PATCH 02/10] Expand scalable topics motivation and the V5 API redesign in the blog --- blog/2026-06-22-announcing-apache-pulsar-5-0-m1.md | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/blog/2026-06-22-announcing-apache-pulsar-5-0-m1.md b/blog/2026-06-22-announcing-apache-pulsar-5-0-m1.md index de2c88166d48..a94f7950a8b4 100644 --- a/blog/2026-06-22-announcing-apache-pulsar-5-0-m1.md +++ b/blog/2026-06-22-announcing-apache-pulsar-5-0-m1.md @@ -18,9 +18,13 @@ Please run it on **non-production** clusters, exercise the new APIs, and tell us ## Scalable Topics: topics that size themselves -For its entire history, Pulsar has scaled a topic's throughput with **partitions** — a count you fix when you create the topic. That model has well-known limits: you have to guess the right number up front, you can never decrease it, and changing it breaks per-key ordering. +A topic should be a **logical concept** — a named stream you publish to and consume from. As an application developer, you shouldn't have to reason about the infrastructure that makes that stream fast. Yet for its entire history, Pulsar has asked you to answer an infrastructure question up front that has nothing to do with your application: **how many partitions?** -**Scalable topics** remove those limits. A scalable topic — addressed with the new `topic://` scheme — is internally a set of **key-range segments** that the broker **splits** when part of the keyspace gets hot and **merges** when it goes cold: at runtime, with no downtime, and without ever breaking the ordering of any individual key. You never choose a partition count; the topic sizes itself to the load. +That single number is a guess that's easy to get wrong and hard to undo. Too few and you cap your throughput; too many and you carry overhead a quiet topic never needed. You can raise the count later but never lower it, and changing it breaks per-key ordering. It forces an infrastructure decision into application design — before you even know how the topic will be used. + +**Scalable topics** take that decision away. A scalable topic — addressed with the new `topic://` scheme — is a single logical stream that Pulsar sizes to its actual load. Internally it is a set of **key-range segments** that the broker **splits** when part of the keyspace gets hot and **merges** when it goes cold: at runtime, with no downtime, and without ever breaking the ordering of any individual key. + +The aim is for one topic type to be the right choice in every situation, **transparently and out of the box** — from a single firehose carrying tens of gigabytes per second to millions of tiny topics each with a trickle of traffic. You model your application around the topics that fit your domain, and the system continuously adapts to how they are actually used. No capacity planning, no re-sharding, no hard decisions to push onto developers. Scalable topics are delivered by a family of proposals in 5.0: @@ -33,13 +37,15 @@ Scalable topics are delivered by a family of proposals in 5.0: ### A new client API -Scalable topics are served by a new **V5 Java client** (`pulsar-client-v5`) that replaces the four classic subscription types with three purpose-built consumers: +The V5 client is groundbreaking work in its own right. Over more than a decade, Pulsar's client API grew one feature at a time, accumulating options, overloads, and subtle inconsistencies along the way. The **V5 client** is a clean-slate redesign that distills those years of lessons — learned from real users running Pulsar in production — into a focused API: it surfaces the capabilities that matter and sheds the noise and rough edges that accumulated along the road. + +Consumption is the clearest example. The classic client offers a single `Consumer` shaped by one of four subscription types — Exclusive, Failover, Shared, Key_Shared — plus a separate `Reader`, with behavior that shifts subtly as you combine options. The V5 client replaces all of it with three **purpose-built** consumers, each exposing exactly the operations that make sense for it: - **Stream consumer** — ordered, cumulative-ack consumption. - **Queue consumer** — parallel, individually-acked work-queue consumption with dead-letter support. - **Checkpoint consumer** — for stream processors (Flink, Spark) that track their own position. -The V5 client also works against your existing partitioned and non-partitioned topics, so you can adopt the new API before migrating any topic — and a consumer can now subscribe to an entire **namespace**, filtered by topic properties. In M1 the V5 client is available for Java; the other language SDKs will follow before GA. +The V5 client (`pulsar-client-v5`) also works against your existing partitioned and non-partitioned topics, so you can adopt the new API before migrating any topic — and a consumer can now subscribe to an entire **namespace**, filtered by topic properties. In M1 the V5 client is available for Java; the other language SDKs will follow before GA. Start here: [Scalable topics concepts](https://pulsar.apache.org/docs/next/concepts-scalable-topics), the [V5 Java client](https://pulsar.apache.org/docs/client-libraries/java-v5), and the [migration guide](https://pulsar.apache.org/docs/client-libraries/java-migrate-to-v5). From 930796e506b0c2e799187e4699a32ecd809b81d7 Mon Sep 17 00:00:00 2001 From: Matteo Merli Date: Mon, 22 Jun 2026 13:47:49 -0700 Subject: [PATCH 03/10] Set publish date and co-author for the 5.0.0-M1 blog post --- ...-0-m1.md => 2026-06-23-announcing-apache-pulsar-5-0-m1.md} | 4 ++-- node_modules | 1 + 2 files changed, 3 insertions(+), 2 deletions(-) rename blog/{2026-06-22-announcing-apache-pulsar-5-0-m1.md => 2026-06-23-announcing-apache-pulsar-5-0-m1.md} (99%) create mode 120000 node_modules diff --git a/blog/2026-06-22-announcing-apache-pulsar-5-0-m1.md b/blog/2026-06-23-announcing-apache-pulsar-5-0-m1.md similarity index 99% rename from blog/2026-06-22-announcing-apache-pulsar-5-0-m1.md rename to blog/2026-06-23-announcing-apache-pulsar-5-0-m1.md index a94f7950a8b4..86d0939c08ac 100644 --- a/blog/2026-06-22-announcing-apache-pulsar-5-0-m1.md +++ b/blog/2026-06-23-announcing-apache-pulsar-5-0-m1.md @@ -1,7 +1,7 @@ --- title: "Apache Pulsar 5.0.0-M1: A Preview of the Next Major Release" -author: Matteo Merli -date: 2026-06-22 +author: Matteo Merli, Lari Hotari +date: 2026-06-23 --- The Apache Pulsar community is voting on **Apache Pulsar 5.0.0-M1**, the first milestone of the upcoming Pulsar 5.0. This is a **preview release**: it bundles the major new features of 5.0 so the community can try them, run them against real workloads, and send feedback well before the general-availability release. It is **not intended for production**. diff --git a/node_modules b/node_modules new file mode 120000 index 000000000000..e776bc5daadc --- /dev/null +++ b/node_modules @@ -0,0 +1 @@ +/Users/mmerli/prg/pulsar-site/node_modules \ No newline at end of file From c254b02769c756cf61397a17d76210715e6f1198 Mon Sep 17 00:00:00 2001 From: Matteo Merli Date: Mon, 22 Jun 2026 13:50:14 -0700 Subject: [PATCH 04/10] Remove accidentally committed node_modules symlink --- node_modules | 1 - 1 file changed, 1 deletion(-) delete mode 120000 node_modules diff --git a/node_modules b/node_modules deleted file mode 120000 index e776bc5daadc..000000000000 --- a/node_modules +++ /dev/null @@ -1 +0,0 @@ -/Users/mmerli/prg/pulsar-site/node_modules \ No newline at end of file From cb2687d5bf2a816f58a8bec91310a6af3c40c6ed Mon Sep 17 00:00:00 2001 From: Matteo Merli Date: Mon, 22 Jun 2026 14:05:54 -0700 Subject: [PATCH 05/10] Close the blog post with the milestone roadmap to 5.0.0 GA --- blog/2026-06-23-announcing-apache-pulsar-5-0-m1.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/blog/2026-06-23-announcing-apache-pulsar-5-0-m1.md b/blog/2026-06-23-announcing-apache-pulsar-5-0-m1.md index 86d0939c08ac..d13feabf5d9b 100644 --- a/blog/2026-06-23-announcing-apache-pulsar-5-0-m1.md +++ b/blog/2026-06-23-announcing-apache-pulsar-5-0-m1.md @@ -76,4 +76,6 @@ Once the vote passes and the artifacts are published, download 5.0.0-M1 and try - migrating a cluster's metadata store from **ZooKeeper to Oxia**; - adopting the **V5 Java client** in an existing application. -Share feedback on [GitHub](https://github.com/apache/pulsar/issues) or the [dev mailing list](https://pulsar.apache.org/contact/). Thank you for helping shape Apache Pulsar 5.0. +Share feedback on [GitHub](https://github.com/apache/pulsar/issues) or the [dev mailing list](https://pulsar.apache.org/contact/). + +5.0.0-M1 is the first of several milestone releases on the road to **Pulsar 5.0.0**, which we expect to ship this fall. Each milestone builds on the feedback from the one before it — so the more you put these previews through their paces, the stronger the final release will be. Thank you for helping shape Apache Pulsar 5.0. From 88d4b62e4bd0de3a6d0ab5f46239841d1392ec23 Mon Sep 17 00:00:00 2001 From: Matteo Merli Date: Mon, 22 Jun 2026 14:43:20 -0700 Subject: [PATCH 06/10] Editorial revision: tighten language, flow, and tone --- ...6-06-23-announcing-apache-pulsar-5-0-m1.md | 46 +++++++++---------- 1 file changed, 23 insertions(+), 23 deletions(-) diff --git a/blog/2026-06-23-announcing-apache-pulsar-5-0-m1.md b/blog/2026-06-23-announcing-apache-pulsar-5-0-m1.md index d13feabf5d9b..3c31bb91a64e 100644 --- a/blog/2026-06-23-announcing-apache-pulsar-5-0-m1.md +++ b/blog/2026-06-23-announcing-apache-pulsar-5-0-m1.md @@ -4,27 +4,27 @@ author: Matteo Merli, Lari Hotari date: 2026-06-23 --- -The Apache Pulsar community is voting on **Apache Pulsar 5.0.0-M1**, the first milestone of the upcoming Pulsar 5.0. This is a **preview release**: it bundles the major new features of 5.0 so the community can try them, run them against real workloads, and send feedback well before the general-availability release. It is **not intended for production**. +The Apache Pulsar community is voting on **Apache Pulsar 5.0.0-M1**, the first milestone on the road to Pulsar 5.0. It is a **preview**: an early build that puts the major new features of 5.0 in your hands so you can try them against real workloads and send feedback well ahead of the general-availability (GA) release. It is **not meant for production**. -5.0 is a big release. Its headline is **Scalable Topics** — a new kind of topic that grows and shrinks on its own — and the elevation of **Oxia** to the recommended metadata store. This post walks through what's in M1 and how to try it. +5.0 is a major release, and two changes stand out: **Scalable Topics** — a new kind of topic that grows and shrinks on its own — and the promotion of **Oxia** to Pulsar's recommended metadata store. This post walks through what's in M1 and how to try it. ## A preview, built for feedback -5.0.0-M1 is a milestone build, not a final release. We're shipping it early, while the community votes on it, for one reason: the changes in 5.0 are significant enough that we want real-world feedback before they're locked in for the GA release, which is targeted for later in 2026. +M1 is a milestone build, not a final release. We're publishing it early, during the community vote, for one reason: the changes in 5.0 are far-reaching, and we want real-world feedback before they're finalized for GA. -Please run it on **non-production** clusters, exercise the new APIs, and tell us what works and what doesn't — file issues on [GitHub](https://github.com/apache/pulsar/issues) or discuss on the [dev@pulsar.apache.org](https://pulsar.apache.org/contact/) mailing list. Your testing now directly shapes what 5.0 becomes at GA. +So please run it on **non-production** clusters, exercise the new APIs, and tell us what works and what doesn't — open issues on [GitHub](https://github.com/apache/pulsar/issues) or start a thread on the [dev@pulsar.apache.org](https://pulsar.apache.org/contact/) mailing list. The feedback you give now directly shapes what 5.0 becomes at GA. ## Scalable Topics: topics that size themselves -A topic should be a **logical concept** — a named stream you publish to and consume from. As an application developer, you shouldn't have to reason about the infrastructure that makes that stream fast. Yet for its entire history, Pulsar has asked you to answer an infrastructure question up front that has nothing to do with your application: **how many partitions?** +A topic should be a **logical concept** — a named stream you publish to and consume from. As an application developer, you shouldn't have to think about the infrastructure that makes that stream fast. Yet for its entire history, Pulsar has asked you to answer an infrastructure question up front that has nothing to do with your application: **how many partitions?** -That single number is a guess that's easy to get wrong and hard to undo. Too few and you cap your throughput; too many and you carry overhead a quiet topic never needed. You can raise the count later but never lower it, and changing it breaks per-key ordering. It forces an infrastructure decision into application design — before you even know how the topic will be used. +That single number is a guess that's easy to get wrong and hard to undo. Choose too few and you cap your throughput; choose too many and you pay for overhead a quiet topic never needed. You can raise the count later but never lower it, and changing it breaks per-key ordering. The decision pulls infrastructure concerns into application design — and demands them before you even know how the topic will be used. -**Scalable topics** take that decision away. A scalable topic — addressed with the new `topic://` scheme — is a single logical stream that Pulsar sizes to its actual load. Internally it is a set of **key-range segments** that the broker **splits** when part of the keyspace gets hot and **merges** when it goes cold: at runtime, with no downtime, and without ever breaking the ordering of any individual key. +**Scalable topics** take that decision away. A scalable topic — addressed with the new `topic://` scheme — is a single logical stream that Pulsar sizes to its actual load. Internally, it's a set of **key-range segments** that the broker **splits** when part of the keyspace gets hot and **merges** when it goes cold: at runtime, with no downtime, and without ever breaking the ordering of an individual key. -The aim is for one topic type to be the right choice in every situation, **transparently and out of the box** — from a single firehose carrying tens of gigabytes per second to millions of tiny topics each with a trickle of traffic. You model your application around the topics that fit your domain, and the system continuously adapts to how they are actually used. No capacity planning, no re-sharding, no hard decisions to push onto developers. +The goal is for one topic type to be the right choice in every situation, **transparently and out of the box** — from a single firehose pushing tens of gigabytes per second to millions of tiny topics that each carry a trickle of traffic. You model your application around the topics that fit your domain, and the system adapts continuously to how they're actually used. No capacity planning, no re-sharding, no hard decisions forced on developers. Scalable topics are delivered by a family of proposals in 5.0: @@ -37,45 +37,45 @@ Scalable topics are delivered by a family of proposals in 5.0: ### A new client API -The V5 client is groundbreaking work in its own right. Over more than a decade, Pulsar's client API grew one feature at a time, accumulating options, overloads, and subtle inconsistencies along the way. The **V5 client** is a clean-slate redesign that distills those years of lessons — learned from real users running Pulsar in production — into a focused API: it surfaces the capabilities that matter and sheds the noise and rough edges that accumulated along the road. +The V5 client is groundbreaking work in its own right. Over more than a decade, Pulsar's client API grew one feature at a time, accumulating options, overloads, and subtle inconsistencies along the way. The V5 client is a clean-slate redesign that distills those years of lessons — learned from users running Pulsar in production — into a focused API: it keeps the capabilities that matter and sheds the noise and rough edges that built up over time. -Consumption is the clearest example. The classic client offers a single `Consumer` shaped by one of four subscription types — Exclusive, Failover, Shared, Key_Shared — plus a separate `Reader`, with behavior that shifts subtly as you combine options. The V5 client replaces all of it with three **purpose-built** consumers, each exposing exactly the operations that make sense for it: +Consumption is the clearest example. The classic client offers a single `Consumer` shaped by one of four subscription types — Exclusive, Failover, Shared, Key_Shared — plus a separate `Reader`, with behavior that shifts subtly as you combine options. The V5 client replaces all of that with three **purpose-built** consumers, each exposing exactly the operations that make sense for it: -- **Stream consumer** — ordered, cumulative-ack consumption. -- **Queue consumer** — parallel, individually-acked work-queue consumption with dead-letter support. -- **Checkpoint consumer** — for stream processors (Flink, Spark) that track their own position. +- **Stream consumer** — ordered consumption with cumulative acknowledgment. +- **Queue consumer** — parallel, individually-acknowledged work-queue consumption with dead-letter support. +- **Checkpoint consumer** — for stream processors such as Flink and Spark that track their own position. -The V5 client (`pulsar-client-v5`) also works against your existing partitioned and non-partitioned topics, so you can adopt the new API before migrating any topic — and a consumer can now subscribe to an entire **namespace**, filtered by topic properties. In M1 the V5 client is available for Java; the other language SDKs will follow before GA. +The V5 client (`pulsar-client-v5`) also works against your existing partitioned and non-partitioned topics, so you can adopt the new API before migrating a single topic — and a consumer can now subscribe to an entire **namespace**, filtered by topic properties. In M1 the V5 client ships for Java; the other language SDKs will follow before GA. Start here: [Scalable topics concepts](https://pulsar.apache.org/docs/next/concepts-scalable-topics), the [V5 Java client](https://pulsar.apache.org/docs/client-libraries/java-v5), and the [migration guide](https://pulsar.apache.org/docs/client-libraries/java-migrate-to-v5). ## Oxia is now the recommended metadata store -[Oxia](https://github.com/oxia-db/oxia) is a scalable metadata store and coordination system. In 5.0 it becomes the **recommended metadata store** for new Pulsar clusters, and it is the preferred backend for scalable topics, whose lookups rely on its streaming watch sessions. +[Oxia](https://github.com/oxia-db/oxia) is a scalable metadata store and coordination system. In 5.0 it becomes the **recommended metadata store** for new Pulsar clusters, and it is the backend of choice for scalable topics, whose lookups build on its streaming watch sessions. -ZooKeeper remains fully supported, and 5.0 makes the transition painless: +ZooKeeper remains fully supported, and 5.0 makes moving to Oxia straightforward: - **[PIP-454](https://github.com/apache/pulsar/blob/master/pip/pip-454.md): Metadata Store Migration Framework** — a live, **zero-downtime** migration from ZooKeeper to Oxia. The data plane keeps publishing and consuming while metadata is copied. See [Migrate metadata store](https://pulsar.apache.org/docs/next/administration-metadata-store-migration). -- **[PIP-469](https://github.com/apache/pulsar/blob/master/pip/pip-469.md): Metadata-store topic policies** — topic policies can be stored directly in the metadata store, with legacy-aware routing for clusters still on system-topic policies. +- **[PIP-469](https://github.com/apache/pulsar/blob/master/pip/pip-469.md): Metadata-store topic policies** — topic policies can be stored directly in the metadata store, with legacy-aware routing for clusters still using system-topic policies. -5.0 also **removes the etcd metadata store backend** ([PIP-462](https://github.com/apache/pulsar/blob/master/pip/pip-462.md)). ZooKeeper and Oxia are the supported backends going forward; etcd users should migrate before upgrading. +5.0 also **removes the etcd metadata store backend** ([PIP-462](https://github.com/apache/pulsar/blob/master/pip/pip-462.md)). ZooKeeper and Oxia are the supported backends going forward, so etcd users should migrate before upgrading. ## Other notable changes - **IO connectors moved to a dedicated repository** ([PIP-465](https://github.com/apache/pulsar/blob/master/pip/pip-465.md)) — the built-in connectors now live and release independently of Pulsar core. -- **`javax.*` → `jakarta.*`** ([PIP-472](https://github.com/apache/pulsar/blob/master/pip/pip-472.md)) — Pulsar moves to the Jakarta EE namespace; a breaking change for code that touches the affected APIs. -- **Gradle build** ([PIP-463](https://github.com/apache/pulsar/blob/master/pip/pip-463.md)) — Pulsar's build moves from Maven to Gradle, speeding up builds for contributors. +- **`javax.*` → `jakarta.*`** ([PIP-472](https://github.com/apache/pulsar/blob/master/pip/pip-472.md)) — Pulsar adopts the Jakarta EE namespace, a breaking change for code that touches the affected APIs. +- **Gradle build** ([PIP-463](https://github.com/apache/pulsar/blob/master/pip/pip-463.md)) — the build moves from Maven to Gradle, speeding up the development cycle for contributors. - **Structured logging** ([PIP-467](https://github.com/apache/pulsar/blob/master/pip/pip-467.md)) — Pulsar adopts structured (slog-style) logging for richer, machine-parseable logs. - **Flexible networking** — multiple advertised addresses and smarter listener selection ([PIP-61](https://github.com/apache/pulsar/blob/master/pip/pip-61.md), [PIP-95](https://github.com/apache/pulsar/blob/master/pip/pip-95.md)) for multi-network deployments. ## Try it and tell us what you think -Once the vote passes and the artifacts are published, download 5.0.0-M1 and try it on a test cluster. Because this is a preview, we especially want to hear about: +Once the vote passes and the artifacts are published, download 5.0.0-M1 and put it on a test cluster. Because this is a preview, we're especially keen to hear about: - creating and operating **scalable topics** with the V5 client; - migrating a cluster's metadata store from **ZooKeeper to Oxia**; - adopting the **V5 Java client** in an existing application. -Share feedback on [GitHub](https://github.com/apache/pulsar/issues) or the [dev mailing list](https://pulsar.apache.org/contact/). +Share your experience on [GitHub](https://github.com/apache/pulsar/issues) or the [dev mailing list](https://pulsar.apache.org/contact/). -5.0.0-M1 is the first of several milestone releases on the road to **Pulsar 5.0.0**, which we expect to ship this fall. Each milestone builds on the feedback from the one before it — so the more you put these previews through their paces, the stronger the final release will be. Thank you for helping shape Apache Pulsar 5.0. +5.0.0-M1 is the first of several milestones on the road to **Pulsar 5.0.0**, which we expect to ship this fall. Each milestone builds on the feedback from the one before it, so the more you put these previews through their paces, the stronger the final release will be. Thank you for helping shape Apache Pulsar 5.0. From 42190fc957cd73a289971860e8bc58fb59c21006 Mon Sep 17 00:00:00 2001 From: Matteo Merli Date: Tue, 23 Jun 2026 11:20:38 -0700 Subject: [PATCH 07/10] Address review: drop voting language, V5-only scalable topics note, networking framing, local testing links --- blog/2026-06-23-announcing-apache-pulsar-5-0-m1.md | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/blog/2026-06-23-announcing-apache-pulsar-5-0-m1.md b/blog/2026-06-23-announcing-apache-pulsar-5-0-m1.md index 3c31bb91a64e..acdfa677567d 100644 --- a/blog/2026-06-23-announcing-apache-pulsar-5-0-m1.md +++ b/blog/2026-06-23-announcing-apache-pulsar-5-0-m1.md @@ -4,7 +4,7 @@ author: Matteo Merli, Lari Hotari date: 2026-06-23 --- -The Apache Pulsar community is voting on **Apache Pulsar 5.0.0-M1**, the first milestone on the road to Pulsar 5.0. It is a **preview**: an early build that puts the major new features of 5.0 in your hands so you can try them against real workloads and send feedback well ahead of the general-availability (GA) release. It is **not meant for production**. +The Apache Pulsar community is pleased to announce **Apache Pulsar 5.0.0-M1**, the first milestone on the road to Pulsar 5.0. It is a **preview**: an early build that puts the major new features of 5.0 in your hands so you can try them against real workloads and send feedback well ahead of the general-availability (GA) release. It is **not meant for production**. 5.0 is a major release, and two changes stand out: **Scalable Topics** — a new kind of topic that grows and shrinks on its own — and the promotion of **Oxia** to Pulsar's recommended metadata store. This post walks through what's in M1 and how to try it. @@ -12,7 +12,7 @@ The Apache Pulsar community is voting on **Apache Pulsar 5.0.0-M1**, the first m ## A preview, built for feedback -M1 is a milestone build, not a final release. We're publishing it early, during the community vote, for one reason: the changes in 5.0 are far-reaching, and we want real-world feedback before they're finalized for GA. +M1 is a milestone build, not a final release. We're publishing it early, for one reason: the changes in 5.0 are far-reaching, and we want real-world feedback before they're finalized for GA. So please run it on **non-production** clusters, exercise the new APIs, and tell us what works and what doesn't — open issues on [GitHub](https://github.com/apache/pulsar/issues) or start a thread on the [dev@pulsar.apache.org](https://pulsar.apache.org/contact/) mailing list. The feedback you give now directly shapes what 5.0 becomes at GA. @@ -45,7 +45,7 @@ Consumption is the clearest example. The classic client offers a single `Consume - **Queue consumer** — parallel, individually-acknowledged work-queue consumption with dead-letter support. - **Checkpoint consumer** — for stream processors such as Flink and Spark that track their own position. -The V5 client (`pulsar-client-v5`) also works against your existing partitioned and non-partitioned topics, so you can adopt the new API before migrating a single topic — and a consumer can now subscribe to an entire **namespace**, filtered by topic properties. In M1 the V5 client ships for Java; the other language SDKs will follow before GA. +The classic client API remains fully supported and is the right choice for applications that don't need scalable topics — but scalable topics themselves are available only through the V5 API. The V5 client (`pulsar-client-v5`) also works against your existing partitioned and non-partitioned topics, so you can adopt the new API before migrating a single topic — and a consumer can now subscribe to an entire **namespace**, filtered by topic properties. In M1 the V5 client ships for Java; the other language SDKs will follow before GA. Start here: [Scalable topics concepts](https://pulsar.apache.org/docs/next/concepts-scalable-topics), the [V5 Java client](https://pulsar.apache.org/docs/client-libraries/java-v5), and the [migration guide](https://pulsar.apache.org/docs/client-libraries/java-migrate-to-v5). @@ -66,11 +66,11 @@ ZooKeeper remains fully supported, and 5.0 makes moving to Oxia straightforward: - **`javax.*` → `jakarta.*`** ([PIP-472](https://github.com/apache/pulsar/blob/master/pip/pip-472.md)) — Pulsar adopts the Jakarta EE namespace, a breaking change for code that touches the affected APIs. - **Gradle build** ([PIP-463](https://github.com/apache/pulsar/blob/master/pip/pip-463.md)) — the build moves from Maven to Gradle, speeding up the development cycle for contributors. - **Structured logging** ([PIP-467](https://github.com/apache/pulsar/blob/master/pip/pip-467.md)) — Pulsar adopts structured (slog-style) logging for richer, machine-parseable logs. -- **Flexible networking** — multiple advertised addresses and smarter listener selection ([PIP-61](https://github.com/apache/pulsar/blob/master/pip/pip-61.md), [PIP-95](https://github.com/apache/pulsar/blob/master/pip/pip-95.md)) for multi-network deployments. +- **Flexible networking** — 5.0 improves multiple advertised addresses ([PIP-61](https://github.com/apache/pulsar/blob/master/pip/pip-61.md), since 2.6) and smart listener selection ([PIP-95](https://github.com/apache/pulsar/blob/master/pip/pip-95.md), since 2.9) for multi-network deployments. ## Try it and tell us what you think -Once the vote passes and the artifacts are published, download 5.0.0-M1 and put it on a test cluster. Because this is a preview, we're especially keen to hear about: +Deploy Pulsar 5.0 to a test cluster, or try it locally with [Docker Compose](https://pulsar.apache.org/docs/next/getting-started-docker-compose) — which runs Pulsar on Oxia out of the box — or [Pulsar Standalone](https://pulsar.apache.org/docs/next/getting-started-standalone). Because this is a preview, we're especially keen to hear about: - creating and operating **scalable topics** with the V5 client; - migrating a cluster's metadata store from **ZooKeeper to Oxia**; From 1cce4867cf09e68691d527ed37c59781b93b7098 Mon Sep 17 00:00:00 2001 From: Matteo Merli Date: Tue, 23 Jun 2026 11:25:27 -0700 Subject: [PATCH 08/10] Convey the long-term direction: scalable topics for all use cases, classic APIs to be deprecated --- blog/2026-06-23-announcing-apache-pulsar-5-0-m1.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/blog/2026-06-23-announcing-apache-pulsar-5-0-m1.md b/blog/2026-06-23-announcing-apache-pulsar-5-0-m1.md index acdfa677567d..fbe50b99d81d 100644 --- a/blog/2026-06-23-announcing-apache-pulsar-5-0-m1.md +++ b/blog/2026-06-23-announcing-apache-pulsar-5-0-m1.md @@ -45,7 +45,9 @@ Consumption is the clearest example. The classic client offers a single `Consume - **Queue consumer** — parallel, individually-acknowledged work-queue consumption with dead-letter support. - **Checkpoint consumer** — for stream processors such as Flink and Spark that track their own position. -The classic client API remains fully supported and is the right choice for applications that don't need scalable topics — but scalable topics themselves are available only through the V5 API. The V5 client (`pulsar-client-v5`) also works against your existing partitioned and non-partitioned topics, so you can adopt the new API before migrating a single topic — and a consumer can now subscribe to an entire **namespace**, filtered by topic properties. In M1 the V5 client ships for Java; the other language SDKs will follow before GA. +For now, the classic client API remains fully supported, and existing applications keep working unchanged; scalable topics, however, are available only through the V5 API. Longer term, scalable topics are designed to cover **all** of Pulsar's use cases, and the V5 API is the direction Pulsar is heading. As that vision is realized, the classic topics and client API will be deprecated and, eventually, removed — so new applications are encouraged to build on scalable topics and the V5 client today. + +The V5 client (`pulsar-client-v5`) also works against your existing partitioned and non-partitioned topics, so you can adopt the new API before migrating a single topic — and a consumer can now subscribe to an entire **namespace**, filtered by topic properties. In M1 the V5 client ships for Java; the other language SDKs will follow before GA. Start here: [Scalable topics concepts](https://pulsar.apache.org/docs/next/concepts-scalable-topics), the [V5 Java client](https://pulsar.apache.org/docs/client-libraries/java-v5), and the [migration guide](https://pulsar.apache.org/docs/client-libraries/java-migrate-to-v5). From 70969034d7955fd52aeaf8734d2fe2d3a3fb1303 Mon Sep 17 00:00:00 2001 From: Matteo Merli Date: Tue, 23 Jun 2026 11:32:39 -0700 Subject: [PATCH 09/10] Expand structured logging: JSON fields, easy filtering, attribute propagation to BookKeeper --- blog/2026-06-23-announcing-apache-pulsar-5-0-m1.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/blog/2026-06-23-announcing-apache-pulsar-5-0-m1.md b/blog/2026-06-23-announcing-apache-pulsar-5-0-m1.md index fbe50b99d81d..ff0c794ef53c 100644 --- a/blog/2026-06-23-announcing-apache-pulsar-5-0-m1.md +++ b/blog/2026-06-23-announcing-apache-pulsar-5-0-m1.md @@ -67,7 +67,7 @@ ZooKeeper remains fully supported, and 5.0 makes moving to Oxia straightforward: - **IO connectors moved to a dedicated repository** ([PIP-465](https://github.com/apache/pulsar/blob/master/pip/pip-465.md)) — the built-in connectors now live and release independently of Pulsar core. - **`javax.*` → `jakarta.*`** ([PIP-472](https://github.com/apache/pulsar/blob/master/pip/pip-472.md)) — Pulsar adopts the Jakarta EE namespace, a breaking change for code that touches the affected APIs. - **Gradle build** ([PIP-463](https://github.com/apache/pulsar/blob/master/pip/pip-463.md)) — the build moves from Maven to Gradle, speeding up the development cycle for contributors. -- **Structured logging** ([PIP-467](https://github.com/apache/pulsar/blob/master/pip/pip-467.md)) — Pulsar adopts structured (slog-style) logging for richer, machine-parseable logs. +- **Structured logging** ([PIP-467](https://github.com/apache/pulsar/blob/master/pip/pip-467.md)) — Pulsar moves to structured (slog-style) logging. Log attributes are emitted as discrete JSON fields rather than crammed into a line of free text, so exporting logs to JSON and filtering on a specific property — a single topic, a subscription — becomes straightforward. Those attributes also propagate down the stack: BookKeeper operations are tagged with the originating Pulsar topic, letting you follow one topic's activity end to end. - **Flexible networking** — 5.0 improves multiple advertised addresses ([PIP-61](https://github.com/apache/pulsar/blob/master/pip/pip-61.md), since 2.6) and smart listener selection ([PIP-95](https://github.com/apache/pulsar/blob/master/pip/pip-95.md), since 2.9) for multi-network deployments. ## Try it and tell us what you think From eb8cc755e06091d95cf86c52e536eb88ae647c0a Mon Sep 17 00:00:00 2001 From: Matteo Merli Date: Tue, 23 Jun 2026 11:34:27 -0700 Subject: [PATCH 10/10] Lead the notable-changes list with structured logging --- blog/2026-06-23-announcing-apache-pulsar-5-0-m1.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/blog/2026-06-23-announcing-apache-pulsar-5-0-m1.md b/blog/2026-06-23-announcing-apache-pulsar-5-0-m1.md index ff0c794ef53c..6844a0ef2da2 100644 --- a/blog/2026-06-23-announcing-apache-pulsar-5-0-m1.md +++ b/blog/2026-06-23-announcing-apache-pulsar-5-0-m1.md @@ -64,10 +64,10 @@ ZooKeeper remains fully supported, and 5.0 makes moving to Oxia straightforward: ## Other notable changes +- **Structured logging** ([PIP-467](https://github.com/apache/pulsar/blob/master/pip/pip-467.md)) — Pulsar moves to structured (slog-style) logging. Log attributes are emitted as discrete JSON fields rather than crammed into a line of free text, so exporting logs to JSON and filtering on a specific property — a single topic, a subscription — becomes straightforward. Those attributes also propagate down the stack: BookKeeper operations are tagged with the originating Pulsar topic, letting you follow one topic's activity end to end. - **IO connectors moved to a dedicated repository** ([PIP-465](https://github.com/apache/pulsar/blob/master/pip/pip-465.md)) — the built-in connectors now live and release independently of Pulsar core. - **`javax.*` → `jakarta.*`** ([PIP-472](https://github.com/apache/pulsar/blob/master/pip/pip-472.md)) — Pulsar adopts the Jakarta EE namespace, a breaking change for code that touches the affected APIs. - **Gradle build** ([PIP-463](https://github.com/apache/pulsar/blob/master/pip/pip-463.md)) — the build moves from Maven to Gradle, speeding up the development cycle for contributors. -- **Structured logging** ([PIP-467](https://github.com/apache/pulsar/blob/master/pip/pip-467.md)) — Pulsar moves to structured (slog-style) logging. Log attributes are emitted as discrete JSON fields rather than crammed into a line of free text, so exporting logs to JSON and filtering on a specific property — a single topic, a subscription — becomes straightforward. Those attributes also propagate down the stack: BookKeeper operations are tagged with the originating Pulsar topic, letting you follow one topic's activity end to end. - **Flexible networking** — 5.0 improves multiple advertised addresses ([PIP-61](https://github.com/apache/pulsar/blob/master/pip/pip-61.md), since 2.6) and smart listener selection ([PIP-95](https://github.com/apache/pulsar/blob/master/pip/pip-95.md), since 2.9) for multi-network deployments. ## Try it and tell us what you think