You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@pulsar.apache.org by ur...@apache.org on 2022/09/16 06:20:09 UTC

[pulsar-site] branch main updated: Docs sync done from apache/pulsar(#878372c)

This is an automated email from the ASF dual-hosted git repository.

urfree pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/pulsar-site.git


The following commit(s) were added to refs/heads/main by this push:
     new 570d7aa47e7 Docs sync done from apache/pulsar(#878372c)
570d7aa47e7 is described below

commit 570d7aa47e7f61fef171494559bfe53ee63ac316
Author: Pulsar Site Updater <de...@pulsar.apache.org>
AuthorDate: Fri Sep 16 06:20:03 2022 +0000

    Docs sync done from apache/pulsar(#878372c)
---
 .../blog/2022-09-09-Apache-Pulsar-2-7-5.md         |  63 +++++
 site2/website-next/docs/about.md                   |   2 +-
 site2/website-next/docs/client-libraries-cpp.md    | 290 ++++-----------------
 site2/website-next/docs/cookbooks-message-queue.md |  59 +++--
 site2/website-next/docs/developers-landing.md      |  12 +
 .../docs/getting-started-standalone.md             |  34 +--
 site2/website-next/releases.json                   |   1 +
 7 files changed, 185 insertions(+), 276 deletions(-)

diff --git a/site2/website-next/blog/2022-09-09-Apache-Pulsar-2-7-5.md b/site2/website-next/blog/2022-09-09-Apache-Pulsar-2-7-5.md
new file mode 100644
index 00000000000..0a9dadf2ec8
--- /dev/null
+++ b/site2/website-next/blog/2022-09-09-Apache-Pulsar-2-7-5.md
@@ -0,0 +1,63 @@
+---
+title: "What’s New in Apache Pulsar 2.7.5"
+date: 2022-09-09
+author: "Jason918, momo-jun"
+---
+
+The Apache Pulsar community releases version 2.7.5! 23 contributors provided improvements and bug fixes that delivered 89 commits. Thanks for all your contributions.
+
+The highlight of the 2.7.5 release is that it fixes some critical bugs on broker, proxy, and storage, including message/data loss, broker deadlock, and connection leak. Note that 2.7.5 is the last release of 2.7.x.
+
+This blog walks through the most noteworthy changes. For the complete list, including all feature enhancements and bug fixes, check out the [Pulsar 2.7.5 Release Notes](https://pulsar.apache.org/release-notes/versioned/pulsar-2.7.5/).
+
+### Fixed the deadlock on metadata cache missing while checking replications. [PR-16889](https://github.com/apache/pulsar/pull/16889)
+
+#### Issue
+After the changes in [#12340](https://github.com/apache/pulsar/pull/12340), there are still a couple of places making blocking calls. These calls occupy all the ordered scheduler threads preventing the callbacks from completing until the 30 seconds timeout expires.
+
+#### Resolution
+Change the blocking calls to async mode on the metadata callback thread.
+
+
+### Fixed the deadlock when using the key_shared mode. [PR-11965](https://github.com/apache/pulsar/pull/11965)
+
+#### Issue
+When the key_shared mode is used in consumers, deadlock may happen in the broker due to some race conditions and result in a lot of `CLOSE_WAIT` status connections.
+
+#### Resolution
+Change unlock before the callback in the `asyncDelete` function of `ManagedCursorImpl`.
+
+### Fixed the message loss issue due to ledger rollover. [PR-14703](https://github.com/apache/pulsar/pull/14703)
+
+#### Issue
+If users config `managedLedgerMaxLedgerRolloverTimeMinutes > 0`, and the rollover happens when the ManagedLedger state is `CreatingLedger`, the messages written during that time are lost.
+
+#### Resolution
+Rollover only when the ledger state is `LedgerOpened`. 
+ 
+### Fixed the port exhaustion and connection issues in Pulsar Proxy. [PR-14078](https://github.com/apache/pulsar/pull/14078)
+
+#### Issue
+Pulsar Proxy can get into a state where it stops proxying Broker connections while Admin API proxying keeps working.
+
+#### Resolution
+Optimize the proxy connection to fail-fast when the target broker isn't active.
+Fix the race conditions in Pulsar Proxy when establishing a connection, leading to invalid states and hanging connections.
+Add connection timeout handling to proxy connections. 
+Add read timeout handling to incoming connections and proxied connections.
+
+
+### Fixed the compaction data loss due to missed compaction properties during cursor reset. [PR-16404](https://github.com/apache/pulsar/pull/16404)
+
+#### Issue
+The compaction reader seeks the earliest position to read data from the topic, but the compaction properties are missed during cursor reset, which leads to the initialized compaction subscribe without a compaction horizon, so the compaction reader skips the last compacted data. It only happens when initializing the compaction subscription and can be introduced by the load balance or topic unloading manually.
+
+#### Resolution
+Keep the properties for resetting the cursor while the cursor is for data compaction.
+Copy the properties to the new mark delete entry while advancing the cursor, which is triggered by the managed ledger internal. It's not only for the compacted topic, and the internal task should not lose the properties when trimming the cursor.
+
+# What’s Next?
+
+If you are interested in learning more about Pulsar 2.7.5, you can [download](https://pulsar.apache.org/en/versions/) and try it out now! 
+
+For more information about the Apache Pulsar project and current progress, visit the [Pulsar website](https://pulsar.apache.org), follow the project on Twitter [@apache_pulsar](https://twitter.com/apache_pulsar), and join [Pulsar Slack](https://apache-pulsar.herokuapp.com/)!
\ No newline at end of file
diff --git a/site2/website-next/docs/about.md b/site2/website-next/docs/about.md
index 9faaf7ec0b7..17927aa6e3d 100644
--- a/site2/website-next/docs/about.md
+++ b/site2/website-next/docs/about.md
@@ -28,7 +28,7 @@ Select one of the content blocks below to begin your Pulsar journey. If you ...
     <BlockLink title="About Pulsar" url="/docs/next/concepts-overview/" />
     <BlockLink title="Get Started" url="/docs/next/getting-started-home/" />
     <BlockLink title="Install, Deploy, Upgrade" url="/docs/next/deploy-aws/" />
-    <BlockLink title="Pulsar for Developers" url="/docs/next/develop-tools/" />
+    <BlockLink title="Pulsar for Developers" url="/docs/next/developers-landing/" />
     <BlockLink title="How To" url="/docs/next/functions-develop/" />
     <BlockLink title="Reference" url="/docs/next/reference-terminology/" />
 </BlockLinks>
diff --git a/site2/website-next/docs/client-libraries-cpp.md b/site2/website-next/docs/client-libraries-cpp.md
index 27c679ab06f..05c24a17d2b 100644
--- a/site2/website-next/docs/client-libraries-cpp.md
+++ b/site2/website-next/docs/client-libraries-cpp.md
@@ -4,298 +4,111 @@ title: Pulsar C++ client
 sidebar_label: "C++"
 ---
 
-You can use Pulsar C++ client to create Pulsar producers and consumers in C++.
+````mdx-code-block
+import Tabs from '@theme/Tabs';
+import TabItem from '@theme/TabItem';
+````
 
-All the methods in producer, consumer, and reader of a C++ client are thread-safe.
+You can use a Pulsar C++ client to create producers, consumers, and readers.
 
-## Supported platforms
+All the methods in producer, consumer, and reader of a C++ client are thread-safe. You can read the Doxygen-generated [API docs](/api/cpp) for the C++ client
 
-Pulsar C++ client is supported on **Linux**, **macOS** and **Windows** platforms.
+## Installation
 
-Doxygen-generated API docs for the C++ client are available [here](/api/cpp).
+Use one of the following methods to install a Pulsar C++ client.
 
-## Linux
+### Brew
 
-:::note
-
-You can choose one of the following installation methods based on your needs: Compilation, Install RPM or Install Debian.
-
-:::
-
-### Compilation
-
-#### System requirements
-
-You need to install the following components before using the C++ client:
-
-* [CMake](https://cmake.org/)
-* [Boost](http://www.boost.org/)
-* [Protocol Buffers](https://developers.google.com/protocol-buffers/) >= 3
-* [libcurl](https://curl.se/libcurl/)
-* [Google Test](https://github.com/google/googletest)
-
-1. Clone the Pulsar repository.
-
-```shell
-git clone https://github.com/apache/pulsar
-```
-
-2. Install all necessary dependencies.
-
-```shell
-apt-get install cmake libssl-dev libcurl4-openssl-dev liblog4cxx-dev \
-libprotobuf-dev protobuf-compiler libboost-all-dev google-mock libgtest-dev libjsoncpp-dev
-```
-
-3. Compile and install [Google Test](https://github.com/google/googletest).
-
-```shell
-# libgtest-dev version is 1.18.0 or above
-cd /usr/src/googletest
-sudo cmake .
-sudo make
-sudo cp ./googlemock/libgmock.a ./googlemock/gtest/libgtest.a /usr/lib/
-
-# less than 1.18.0
-cd /usr/src/gtest
-sudo cmake .
-sudo make
-sudo cp libgtest.a /usr/lib
-
-cd /usr/src/gmock
-sudo cmake .
-sudo make
-sudo cp libgmock.a /usr/lib
-```
-
-4. Compile the Pulsar client library for C++ inside the Pulsar repository.
-
-```shell
-cd pulsar-client-cpp
-cmake .
-make
-```
-
-After you install the components successfully, the files `libpulsar.so` and `libpulsar.a` are in the `lib` folder of the repository. The tools `perfProducer` and `perfConsumer` are in the `perf` directory.
-
-### Install Dependencies
-
-> Since 2.1.0 release, Pulsar ships pre-built RPM and Debian packages. You can download and install those packages directly.
-
-After you download and install RPM or DEB, the `libpulsar.so`, `libpulsarnossl.so`, `libpulsar.a`, and `libpulsarwithdeps.a` libraries are in your `/usr/lib` directory.
-
-By default, they are built-in code path `${PULSAR_HOME}/pulsar-client-cpp`. You can build with the command below.
-
- ```bash
- cmake . -DBUILD_TESTS=OFF -DLINK_STATIC=ON && make pulsarShared pulsarSharedNossl pulsarStatic pulsarStaticWithDeps -j 3
- ```
-
-These libraries rely on some other libraries. If you want to get a detailed version of dependencies, see [RPM](https://github.com/apache/pulsar/blob/master/pulsar-client-cpp/pkg/rpm/Dockerfile) or [DEB](https://github.com/apache/pulsar/blob/master/pulsar-client-cpp/pkg/deb/Dockerfile) files.
-
-1. `libpulsar.so` is a shared library, containing statically linked `boost` and `openssl`. It also dynamically links all other necessary libraries. You can use this Pulsar library with the command below.
+Use [Homebrew](http://brew.sh/) to install the latest tagged version with the library and headers:
 
 ```bash
- g++ --std=c++11  PulsarTest.cpp -o test /usr/lib/libpulsar.so -I/usr/local/ssl/include
-```
-
-2. `libpulsarnossl.so` is a shared library, similar to `libpulsar.so` except that the libraries `openssl` and `crypto` are dynamically linked. You can use this Pulsar library with the command below.
-
-```bash
- g++ --std=c++11  PulsarTest.cpp -o test /usr/lib/libpulsarnossl.so -lssl -lcrypto -I/usr/local/ssl/include -L/usr/local/ssl/lib
+brew install libpulsar
 ```
 
-3. `libpulsar.a` is a static library. You need to load dependencies before using this library. You can use this Pulsar library with the command below.
+### Deb
 
-```bash
- g++ --std=c++11  PulsarTest.cpp -o test /usr/lib/libpulsar.a -lssl -lcrypto -ldl -lpthread  -I/usr/local/ssl/include -L/usr/local/ssl/lib -lboost_system -lboost_regex -lcurl -lprotobuf -lzstd -lz
-```
+1. Download any one of the Deb packages:
 
-4. `libpulsarwithdeps.a` is a static library, based on `libpulsar.a`. It is archived in the dependencies of `libboost_regex`, `libboost_system`, `libcurl`, `libprotobuf`, `libzstd` and `libz`. You can use this Pulsar library with the command below.
+<Tabs>
+<TabItem value="client">
 
 ```bash
- g++ --std=c++11  PulsarTest.cpp -o test /usr/lib/libpulsarwithdeps.a -lssl -lcrypto -ldl -lpthread  -I/usr/local/ssl/include -L/usr/local/ssl/lib
+wget @pulsar:deb:client@
 ```
 
-The `libpulsarwithdeps.a` does not include library openssl related libraries `libssl` and `libcrypto`, because these two libraries are related to security. It is more reasonable and easier to use the versions provided by the local system to handle security issues and upgrade libraries.
-
-### Install RPM
-
-1. Download an RPM package from the links in the table. 
+This package contains shared libraries `libpulsar.so` and `libpulsarnossl.so`.
 
-| Link | Crypto files |
-|------|--------------|
-| [client](@pulsar:dist_rpm:client@) | [asc](@pulsar:dist_rpm:client@.asc), [sha512](@pulsar:dist_rpm:client@.sha512) |
-| [client-debuginfo](@pulsar:dist_rpm:client-debuginfo@) | [asc](@pulsar:dist_rpm:client-debuginfo@.asc),  [sha512](@pulsar:dist_rpm:client-debuginfo@.sha512) |
-| [client-devel](@pulsar:dist_rpm:client-devel@) | [asc](@pulsar:dist_rpm:client-devel@.asc),  [sha512](@pulsar:dist_rpm:client-devel@.sha512) |
-
-2. Install the package using the following command.
+</TabItem>
+<TabItem value="client-devel">
 
 ```bash
-rpm -ivh apache-pulsar-client*.rpm
+wget @pulsar:deb:client-devel@
 ```
 
-After you install RPM successfully, Pulsar libraries are in the `/usr/lib` directory, for example:
+This package contains static libraries: `libpulsar.a`, `libpulsarwithdeps.a` and C/C++ headers.
 
-```bash
-lrwxrwxrwx 1 root root 18 Dec 30 22:21 libpulsar.so -> libpulsar.so.2.9.1
-lrwxrwxrwx 1 root root 23 Dec 30 22:21 libpulsarnossl.so -> libpulsarnossl.so.2.9.1
-```
-
-:::note
+</TabItem>
+</Tabs>
 
-If you get the error that `libpulsar.so: cannot open shared object file: No such file or directory` when starting Pulsar client, you may need to run `ldconfig` first.
-
-:::
-
-2. Install the GCC and g++ using the following command, otherwise errors would occur in installing Node.js.
-
-```bash
-sudo yum -y install gcc automake autoconf libtool make
-sudo yum -y install gcc-c++
-```
-
-### Install Debian
-
-1. Download a Debian package from the links in the table.
-
-| Link | Crypto files |
-|------|--------------|
-| [client](@pulsar:deb:client@) | [asc](@pulsar:dist_deb:client@.asc), [sha512](@pulsar:dist_deb:client@.sha512) |
-| [client-devel](@pulsar:deb:client-devel@) | [asc](@pulsar:dist_deb:client-devel@.asc),  [sha512](@pulsar:dist_deb:client-devel@.sha512) |
-
-2. Install the package using the following command.
+2. Install the package using the following command:
 
 ```bash
 apt install ./apache-pulsar-client*.deb
 ```
 
-After you install DEB successfully, Pulsar libraries are in the `/usr/lib` directory.
-
-### Build
-
-If you want to build RPM and Debian packages from the latest master, follow the instructions below. You must run all the instructions at the root directory of your cloned Pulsar repository.
-
-There are recipes that build RPM and Debian packages containing a
-statically linked `libpulsar.so` / `libpulsarnossl.so` / `libpulsar.a` / `libpulsarwithdeps.a` with all required dependencies.
-
-To build the C++ library packages, you need to build the Java packages first.
-
-```shell
-mvn install -DskipTests
-```
-
-#### RPM
-
-To build the RPM inside a Docker container, use the command below. The RPMs are in the `pulsar-client-cpp/pkg/rpm/RPMS/x86_64/` path.
+Now, you can see Pulsar C++ client libraries installed under the `/usr/lib` directory.
 
-```shell
-pulsar-client-cpp/pkg/rpm/docker-build-rpm.sh
-```
-
-| Package name | Content |
-|-----|-----|
-| pulsar-client | Shared library `libpulsar.so` and `libpulsarnossl.so` |
-| pulsar-client-devel | Static library `libpulsar.a`, `libpulsarwithdeps.a`and C++ and C headers |
-| pulsar-client-debuginfo | Debug symbols for `libpulsar.so` |
-
-#### Debian
-
-To build Debian packages, enter the following command.
-
-```shell
-pulsar-client-cpp/pkg/deb/docker-build-deb.sh
-```
+### RPM
 
-Debian packages are created in the `pulsar-client-cpp/pkg/deb/BUILD/DEB/` path.
+1. Download any one of the RPM packages:
 
-| Package name | Content |
-|-----|-----|
-| pulsar-client | Shared library `libpulsar.so` and `libpulsarnossl.so` |
-| pulsar-client-dev | Static library `libpulsar.a`, `libpulsarwithdeps.a` and C++ and C headers |
+<Tabs>
+<TabItem value="client">
 
-## MacOS
-
-### Compilation
-
-1. Clone the Pulsar repository.
-
-```shell
-git clone https://github.com/apache/pulsar
+```bash
+wget @pulsar:dist_rpm:client@
 ```
 
-2. Install all necessary dependencies.
-
-```shell
-# OpenSSL installation
-brew install openssl
-export OPENSSL_INCLUDE_DIR=/usr/local/opt/openssl/include/
-export OPENSSL_ROOT_DIR=/usr/local/opt/openssl/
+This package contains shared libraries: `libpulsar.so` and `libpulsarnossl.so`.
 
-# Protocol Buffers installation
-brew install protobuf boost boost-python log4cxx
-# If you are using python3, you need to install boost-python3 
+</TabItem>
+<TabItem value="client-debuginfo">
 
-# Google Test installation
-git clone https://github.com/google/googletest.git
-cd googletest
-git checkout release-1.12.1
-cmake .
-make install
-```
-
-3. Compile the Pulsar client library in the repository that you cloned.
-
-```shell
-cd pulsar-client-cpp
-cmake .
-make
+```bash
+wget @pulsar:dist_rpm:client-debuginfo@
 ```
 
-### Install `libpulsar`
+This package contains debug symbols for `libpulsar.so`
 
-Pulsar releases are available in the [Homebrew](https://brew.sh/) core repository. You can install the C++ client library with the following command. The package is installed with the library and headers.
+</TabItem>
+<TabItem value="client-devel">
 
-```shell
-brew install libpulsar
+```bash
+wget @pulsar:dist_rpm:client-devel@
 ```
 
-## Windows (64-bit)
+This package contains static libraries: `libpulsar.a`, `libpulsarwithdeps.a` and C/C++ headers.
 
-### Compilation
+</TabItem>
+</Tabs>
 
-1. Clone the Pulsar repository.
+2. Install the package using the following command:
 
-```shell
-git clone https://github.com/apache/pulsar
-```
-
-2. Install all necessary dependencies.
-
-```shell
-cd ${PULSAR_HOME}/pulsar-client-cpp
-vcpkg install --feature-flags=manifests --triplet x64-windows
+```bash
+rpm -ivh apache-pulsar-client*.rpm
 ```
 
-3. Build C++ libraries.
-
-```shell
-cmake -B ./build -A x64 -DBUILD_PYTHON_WRAPPER=OFF -DBUILD_TESTS=OFF -DVCPKG_TRIPLET=x64-windows -DCMAKE_BUILD_TYPE=Release -S .
-cmake --build ./build --config Release
-```
+Now, you can see Pulsar C++ client libraries installed under the `/usr/lib` directory.
 
 :::note
 
-* For Windows 32-bit, you need to use `-A Win32` and `-DVCPKG_TRIPLET=x86-windows`.
-* For MSVC Debug mode, you need to replace `Release` with `Debug` for both `CMAKE_BUILD_TYPE` variable and `--config` option.
+If you get an error like "libpulsar.so: cannot open shared object file: No such file or directory" when starting a Pulsar client, you need to run `ldconfig` first.
 
 :::
 
-4. Client libraries are available in the following places.
+### Source
 
-```
-${PULSAR_HOME}/pulsar-client-cpp/build/lib/Release/pulsar.lib
-${PULSAR_HOME}/pulsar-client-cpp/build/lib/Release/pulsar.dll
-```
+For how to build Pulsar C++ client on different platforms from source code, see [compliation](https://github.com/apache/pulsar/tree/master/pulsar-client-cpp#compilation).
 
 ## Connection URLs
 
@@ -677,4 +490,3 @@ The following example shows how to create a producer and a consumer with a Proto
    User user2;
    user2.ParseFromArray(msg.getData(), msg.getLength());
    ```
-
diff --git a/site2/website-next/docs/cookbooks-message-queue.md b/site2/website-next/docs/cookbooks-message-queue.md
index 50d1b67eabd..fca9b7218e2 100644
--- a/site2/website-next/docs/cookbooks-message-queue.md
+++ b/site2/website-next/docs/cookbooks-message-queue.md
@@ -1,31 +1,52 @@
 ---
 id: cookbooks-message-queue
-title: Using Pulsar as a message queue
+title: Use Pulsar as a message queue
 sidebar_label: "Message queue"
 ---
 
-Message queues are essential components of many large-scale data architectures. If every single work object that passes through your system absolutely *must* be processed despite the slowness or downright failure of this or that system component, there's a good chance that you'll need a message queue to step in and ensure that unprocessed data is retained---with correct ordering---until the required actions are taken.
+````mdx-code-block
+import Tabs from '@theme/Tabs';
+import TabItem from '@theme/TabItem';
+````
+
+Message queues are essential components of many large-scale data architectures. If every single work object that passes through your system absolutely *must* be processed in spite of the slowness or downright failure of this or that system component, there's a good chance that you'll need a message queue to step in and ensure that unprocessed data is retained---with correct ordering---until the required actions are taken.
 
 Pulsar is a great choice for a message queue because:
 
 * it was built with [persistent message storage](concepts-architecture-overview.md#persistent-storage) in mind
 * it offers automatic load balancing across [consumers](reference-terminology.md#consumer) for messages on a topic (or custom load balancing if you wish)
 
-> You can use the same Pulsar installation to act as a real-time message bus and as a message queue if you wish (or just one or the other). You can set aside some topics for real-time purposes and other topics for message queue purposes (or use specific namespaces for either purpose if you wish).
+:::tip
+
+You can use the same Pulsar installation to act as a real-time message bus and as a message queue if you wish (or just one or the other). You can set aside some topics for real-time purposes and other topics for message queue purposes (or use specific namespaces for either purpose if you wish).
+
+:::
+
+## Client configuration changes
+
+To use a Pulsar [topic](reference-terminology.md#topic) as a message queue, you should distribute the receiver load on that topic across several consumers (the optimal number of consumers depends on the load). 
 
+Each consumer must establish a [shared subscription](concepts-messaging.md#shared) and use the same subscription name as the other consumers (otherwise the subscription is not shared and the consumers can't act as a processing ensemble).
 
-# Client configuration changes
+If you'd like to have tight control over message dispatching across consumers, set the consumers' **receiver queue** size very low (potentially even to 0 if necessary). Each consumer has a receiver queue that determines how many messages the consumer attempts to fetch at a time. For example, a receiver queue of 1000 (the default) means that the consumer attempts to process 1000 messages from the topic's backlog upon connection. Setting the receiver queue to 0 essentially means ensuring t [...]
 
-To use a Pulsar [topic](reference-terminology.md#topic) as a message queue, you should distribute the receiver load on that topic across several consumers (the optimal number of consumers will depend on the load). Each consumer must:
+:::tip
 
-* Establish a [shared subscription](concepts-messaging.md#shared) and use the same subscription name as the other consumers (otherwise the subscription is not shared and the consumers can't act as a processing ensemble)
-* If you'd like to have tight control over message dispatching across consumers, set the consumers' **receiver queue** size very low (potentially even to 0 if necessary). Each Pulsar [consumer](reference-terminology.md#consumer) has a receiver queue that determines how many messages the consumer will attempt to fetch at a time. A receiver queue of 1000 (the default), for example, means that the consumer will attempt to process 1000 messages from the topic's backlog upon connection. Setti [...]
+The receiver queue size of a partitioned topic consumer adopts the minimum one of the following two values:
+* `receiver_queue_size`
+* `max_total_receiver_queue_size_across_partitions`/`NumPartitions`
 
-   The downside to restricting the receiver queue size of consumers is that that limits the potential throughput of those consumers and cannot be used with [partitioned topics](reference-terminology.md#partitioned-topic). Whether the performance/control trade-off is worthwhile will depend on your use case.
+:::
 
-## Java clients
+## Example
 
-Here's an example Java consumer configuration that uses a shared subscription:
+Here's an example that uses a shared subscription.
+
+````mdx-code-block
+<Tabs groupId="lang-choice"
+  defaultValue="Java"
+  values={[{"label":"Java","value":"Java"},{"label":"Python","value":"Python"},{"label":"C++","value":"C++"},{"label":"Go","value":"Go"}]}>
+<TabItem value="Java">
 
 ```java
 import org.apache.pulsar.client.api.Consumer;
@@ -49,9 +70,8 @@ Consumer consumer = client.newConsumer()
         .subscribe();
 ```
 
-## Python clients
-
-Here's an example Python consumer configuration that uses a shared subscription:
+</TabItem>
+<TabItem value="Python">
 
 ```python
 from pulsar import Client, ConsumerType
@@ -69,9 +89,8 @@ consumer = client.subscribe(
     consumer_type=ConsumerType.Shared)
 ```
 
-## C++ clients
-
-Here's an example C++ consumer configuration that uses a shared subscription:
+</TabItem>
+<TabItem value="C++">
 
 ```cpp
 #include <pulsar/Client.h>
@@ -92,9 +111,8 @@ Consumer consumer;
 Result result = client.subscribe(topic, subscription, consumerConfig, consumer);
 ```
 
-## Go clients
-
-Here is an example of a Go consumer configuration that uses a shared subscription:
+</TabItem>
+<TabItem value="Go">
 
 ```go
 import "github.com/apache/pulsar-client-go/pulsar"
@@ -116,3 +134,6 @@ if err != nil {
 }
 ```
 
+</TabItem>
+</Tabs>
+````
\ No newline at end of file
diff --git a/site2/website-next/docs/developers-landing.md b/site2/website-next/docs/developers-landing.md
new file mode 100644
index 00000000000..df03e4fe318
--- /dev/null
+++ b/site2/website-next/docs/developers-landing.md
@@ -0,0 +1,12 @@
+---
+id: developers-landing
+title: Pulsar for Developers
+sidebar_label: "get started"
+---
+
+Developing applications for Pulsar can be a fun and rewarding experience. With Pulsar, you can quickly create, deploy, and manage your services using a powerful CLI tool and a comprehensive set of libraries. The topics below will get you started!
+
+- [Simulation tools](develop-tools.md)
+- [Developing binary protocol](developing-binary-protocol.md)
+- [Modular load manager](develop-load-manager.md)
+- [Pulsar plugin development](develop-plugin.md)
diff --git a/site2/website-next/docs/getting-started-standalone.md b/site2/website-next/docs/getting-started-standalone.md
index 5cba7f981b9..30f687a7d17 100644
--- a/site2/website-next/docs/getting-started-standalone.md
+++ b/site2/website-next/docs/getting-started-standalone.md
@@ -16,7 +16,7 @@ If you're looking to run a full production Pulsar installation, see the [Deployi
 
 - JRE (64-bit). Different Pulsar versions rely on different JRE versions. For how to choose the JRE version, see [Pulsar Runtime Java Version Recommendation](https://github.com/apache/pulsar/blob/master/README.md#pulsar-runtime-java-version-recommendation).
 
-## Step 1. Download Pulsar distribution
+## Download Pulsar distribution
 
 Download the official Apache Pulsar distribution:
 
@@ -42,7 +42,7 @@ List the contents by executing:
 ls -1F
 ```
 
-You may want to note that:
+The following directories are created:
 
 | Directory     | Description                                                                                         |
 | ------------- | --------------------------------------------------------------------------------------------------- |
@@ -52,7 +52,7 @@ You may want to note that:
 | **examples**  | [Pulsar Functions](functions-overview.md) examples                                                  |
 | **instances** | Artifacts for [Pulsar Functions](functions-overview.md)                                             |
 
-## Step 2. Start a Pulsar standalone cluster
+## Start a Pulsar standalone cluster
 
 Run this command to start a standalone Pulsar cluster:
 
@@ -60,7 +60,7 @@ Run this command to start a standalone Pulsar cluster:
 bin/pulsar standalone
 ```
 
-These directories are created once you started the Pulsar cluster:
+When the Pulsar cluster starts, the following directories are created:
 
 | Directory | Description                                |
 | --------- | ------------------------------------------ |
@@ -74,7 +74,7 @@ These directories are created once you started the Pulsar cluster:
 
 :::
 
-## Step 3. Create a topic
+## Create a topic
 
 Pulsar stores messages in topics. It's a good practice to explicitly create topics before using them, even if Pulsar can automatically create topics when they are referenced.
 
@@ -84,7 +84,7 @@ To create a new topic, run this command:
 bin/pulsar-admin topics create persistent://public/default/my-topic
 ```
 
-## Step 4. Write messages to the topic
+## Write messages to the topic
 
 You can use the `pulsar` command line tool to write messages to a topic. This is useful for experimentation, but in practice you'll use the Producer API in your application code, or Pulsar IO connectors for pulling data in from other systems to Pulsar.
 
@@ -94,7 +94,7 @@ Run this command to produce a message:
 bin/pulsar-client produce my-topic --messages 'Hello Pulsar!'
 ```
 
-## Step 5. Read messages from the topic
+## Read messages from the topic
 
 Now that some messages have been written to the topic, run this command to launch the consumer and read those messages back:
 
@@ -104,20 +104,20 @@ bin/pulsar-client consume my-topic -s 'my-subscription' -p Earliest -n 0
 
 Earliest means consuming from the earliest **unconsumed** message. `-n` configures the number of messages to consume, 0 means to consume forever.
 
-As before, this is useful for trialling things on the command line, but in practice you'll use the Consumer API in your application code, or Pulsar IO connectors for reading data from Pulsar to push to other systems.
+As before, this is useful for experimenting with messages, but in practice you'll use the Consumer API in your application code, or Pulsar IO connectors for reading data from Pulsar to push to other systems.
 
-You'll see the messages that you produce in the previous step:
+You'll see the messages you produce in the previous step:
 
 ```text
 ----- got message -----
 key:[null], properties:[], content:Hello Pulsar!
 ```
 
-## Step 6. Write some more messages
+## Write some more messages
 
 Leave the consume command from the previous step running. If you've already closed it, just re-run it.
 
-Now open a new terminal window and produce more messages, the default message separator is `,`:
+Now open a new terminal window and produce more messages. The default message separator is `,`:
 
 ```bash
 bin/pulsar-client produce my-topic --messages "$(seq -s, -f 'Message NO.%g' -t '\n' 1 10)"
@@ -125,13 +125,13 @@ bin/pulsar-client produce my-topic --messages "$(seq -s, -f 'Message NO.%g' -t '
 
 Note how they are displayed almost instantaneously in the consumer terminal.
 
-## Step 7. Stop the Pulsar cluster
+## Stop the Pulsar cluster
 
 Once you've finished you can shut down the Pulsar cluster. Press **Ctrl-C** in the terminal window in which you started the cluster.
 
-## Further readings
+## Related Topics
 
-* Read [Pulsar Concepts and Architecture](concepts-architecture-overview.md) to learn more about Pulsar fundamentals.
-* Read [Pulsar Client Libraries](client-libraries.md) to connect Pulsar with your application.
-* Read [Pulsar Connectors](io-overview.md) to connect Pulsar with your existing data pipelines.
-* Read [Pulsar Functions](functions-overview.md) to run serverless computations against Pulsar.
+- [Pulsar Concepts and Architecture](concepts-architecture-overview.md)
+- [Pulsar Client Libraries](client-libraries.md)
+- [Pulsar Connectors](io-overview.md)
+- [Pulsar Functions](functions-overview.md)
diff --git a/site2/website-next/releases.json b/site2/website-next/releases.json
index 7947e72e06b..a57a75134fe 100644
--- a/site2/website-next/releases.json
+++ b/site2/website-next/releases.json
@@ -5,6 +5,7 @@
   "2.9.2",
   "2.9.1",
   "2.9.0",
+  "2.8.4",
   "2.8.3",
   "2.8.2",
   "2.8.1",