blob: 0e2793741ab64b168ca1ab6200dd040608fb5881 [file] [log] [blame]
<!doctype html>
<html lang="en" dir="ltr" class="blog-wrapper blog-post-page plugin-blog plugin-id-default">
<head>
<meta charset="UTF-8">
<meta name="generator" content="Docusaurus v2.4.0">
<title data-rh="true">Apache Pulsar 2.4.2 | Apache Pulsar</title><meta data-rh="true" name="viewport" content="width=device-width,initial-scale=1"><meta data-rh="true" name="twitter:card" content="summary_large_image"><meta data-rh="true" property="og:image" content="https://pulsar.apache.org/img/pulsar-social-media-card.png"><meta data-rh="true" name="twitter:image" content="https://pulsar.apache.org/img/pulsar-social-media-card.png"><meta data-rh="true" property="og:url" content="https://pulsar.apache.org/blog/2019/12/04/Apache-Pulsar-2-4-2/"><meta data-rh="true" name="docusaurus_locale" content="en"><meta data-rh="true" name="docusaurus_tag" content="default"><meta data-rh="true" name="docsearch:language" content="en"><meta data-rh="true" name="docsearch:docusaurus_tag" content="default"><meta data-rh="true" property="og:title" content="Apache Pulsar 2.4.2 | Apache Pulsar"><meta data-rh="true" name="description" content="We are proud to publish Apache Pulsar 2.4.2. Thank the great efforts from Apache Pulsar community with over 110 commits, covering improvements and bug fixes."><meta data-rh="true" property="og:description" content="We are proud to publish Apache Pulsar 2.4.2. Thank the great efforts from Apache Pulsar community with over 110 commits, covering improvements and bug fixes."><meta data-rh="true" property="og:type" content="article"><meta data-rh="true" property="article:published_time" content="2019-12-04T00:00:00.000Z"><meta data-rh="true" property="article:author" content="https://twitter.com/wolf4j1"><link data-rh="true" rel="icon" href="/img/favicon.ico"><link data-rh="true" rel="canonical" href="https://pulsar.apache.org/blog/2019/12/04/Apache-Pulsar-2-4-2/"><link data-rh="true" rel="alternate" href="https://pulsar.apache.org/blog/2019/12/04/Apache-Pulsar-2-4-2/" hreflang="en"><link data-rh="true" rel="alternate" href="https://pulsar.apache.org/blog/2019/12/04/Apache-Pulsar-2-4-2/" hreflang="x-default"><link data-rh="true" rel="preconnect" href="https://WK2YL0SALL-dsn.algolia.net" crossorigin="anonymous"><link rel="alternate" type="application/rss+xml" href="/blog/rss.xml" title="Apache Pulsar RSS Feed">
<link rel="alternate" type="application/atom+xml" href="/blog/atom.xml" title="Apache Pulsar Atom Feed">
<link rel="search" type="application/opensearchdescription+xml" title="Apache Pulsar" href="/opensearch.xml">
<link rel="stylesheet" href="/css/katex-0.13.24.min.css" media="print" onload="this.media=&#39;all&#39;">
<script src="/js/sine-waves.min.js" async></script>
<script src="/js/matomo-agent.js"></script><link rel="stylesheet" href="/assets/css/styles.b0f65ef3.css">
<link rel="preload" href="/assets/js/runtime~main.1d0ed2a7.js" as="script">
<link rel="preload" href="/assets/js/main.e07a0c68.js" as="script">
</head>
<body class="navigation-with-keyboard">
<script>!function(){function t(t){document.documentElement.setAttribute("data-theme",t)}var e=function(){var t=null;try{t=new URLSearchParams(window.location.search).get("docusaurus-theme")}catch(t){}return t}()||function(){var t=null;try{t=localStorage.getItem("theme")}catch(t){}return t}();t(null!==e?e:"light")}(),document.documentElement.setAttribute("data-announcement-bar-initially-dismissed",function(){try{return"true"===localStorage.getItem("docusaurus.announcement.dismiss")}catch(t){}return!1}())</script><div id="__docusaurus">
<div role="region" aria-label="Skip to main content"><a class="skipToContent_fXgn" href="#docusaurus_skipToContent_fallback">Skip to main content</a></div><div class="announcementBar_mb4j" style="background-color:#282826;color:#fff" role="banner"><div class="content_knG7 announcementBarContent_xLdY">
<a class="announcement-bar" href="https://registration.socio.events/e/pulsarvirtualsummiteurope2024" target="_blank">
<div class="announcement-bar__content">
<svg class="announcement-bar__icon">
<svg viewBox="0 0 33 32" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M6.5 19.6001H16.1L15.3 29.2001L26.5 12.4H17.06L18.1 2.80005L6.5 19.6001Z" stroke="#F7F7F7" stroke-width="1.5" stroke-linejoin="round"/>
</svg>
</svg>
<span>
Get your free pass for Pulsar Virtual Summit Europe 2024 on May 14, 2024 ๐Ÿ—“๏ธ
</span>
<svg class="announcement-bar__icon">
<svg viewBox="0 0 32 32" fill="none" xmlns="http://www.w3.org/2000/svg">
<rect width="20" height="20" transform="translate(6 6)" fill="white" fill-opacity="0.01"/>
<path d="M17.6667 10.1667L23.5 16.0001M23.5 16.0001L17.6667 21.8334M23.5 16.0001L8.5 16.0001" stroke="white" stroke-linecap="round" stroke-linejoin="round"/>
<rect x="0.5" y="0.5" width="31" height="31" rx="15.5" stroke="white"/>
</svg>
</svg>
</div>
</a>
</div></div><nav aria-label="Main" class="navbar navbar--fixed-top"><div class="navbar__inner"><div class="navbar__items"><button aria-label="Toggle navigation bar" aria-expanded="false" class="navbar__toggle clean-btn" type="button"><svg width="30" height="30" viewBox="0 0 30 30" aria-hidden="true"><path stroke="currentColor" stroke-linecap="round" stroke-miterlimit="10" stroke-width="2" d="M4 7h22M4 15h22M4 23h22"></path></svg></button><a class="navbar__brand" href="/"><div class="navbar__logo"><img src="/img/logo-black.svg" alt="Apache Pulsar logo" class="themedImage_ToTc themedImage--light_HNdA" height="25" width="127"><img src="/img/logo-black.svg" alt="Apache Pulsar logo" class="themedImage_ToTc themedImage--dark_i4oU" height="25" width="127"></div><b class="navbar__title text--truncate"></b></a><div class="navbar__item dropdown dropdown--hoverable"><a href="#" aria-haspopup="true" aria-expanded="false" role="button" class="navbar__link">Get Started</a><ul class="dropdown__menu"><li><a class="dropdown__link" href="/docs/3.2.x/concepts-overview/">Concepts</a></li><li><a class="dropdown__link" href="/docs/3.2.x/">Quickstart</a></li><li><a class="dropdown__link" href="/ecosystem/">Ecosystem</a></li></ul></div><a class="navbar__item navbar__link" href="/docs/3.2.x/">Docs</a><a class="navbar__item navbar__link" href="/features/">Features</a><a class="navbar__item navbar__link" href="/use-cases/">Use Cases</a><div class="navbar__item dropdown dropdown--hoverable"><a href="#" aria-haspopup="true" aria-expanded="false" role="button" class="navbar__link community-dropdown">Community</a><ul class="dropdown__menu"><li><a class="dropdown__link scroll-link scroll-welcome" id="scroll-welcome" href="/community/">Welcome</a></li><li><a class="dropdown__link scroll-link scroll-discussions" id="scroll-discussions" href="/community/#section-discussions">Discussions</a></li><li><a class="dropdown__link scroll-link" id="scroll-governance" href="/community/#section-governance">Governance</a></li><li><a class="dropdown__link scroll-link" id="scroll-community" href="/community/#section-community">Meet the Community</a></li><li><a class="dropdown__link scroll-link" id="scroll-contribute" href="/community/#section-contribute">Contribute</a></li><li><a class="dropdown__link" href="/contribute/">Contribution Guide</a></li><li><a href="https://github.com/apache/pulsar/wiki" target="_blank" rel="noopener noreferrer" class="dropdown__link">Wiki</a></li><li><a href="https://github.com/apache/pulsar/issues" target="_blank" rel="noopener noreferrer" class="dropdown__link">Issue Tracking</a></li></ul></div><div class="navbar__item dropdown dropdown--hoverable"><a href="#" aria-haspopup="true" aria-expanded="false" role="button" class="navbar__link">Learn</a><ul class="dropdown__menu"><li><a aria-current="page" class="dropdown__link dropdown__link--active" href="/blog/">Blog</a></li><li><a class="dropdown__link" href="/books/">Books</a></li><li><a class="dropdown__link" href="/case-studies/">Case Studies</a></li><li><a class="dropdown__link" href="/articles/">Articles</a></li><li><a class="dropdown__link" href="/presentations/">Presentations</a></li><li><a class="dropdown__link" href="/events/">Events</a></li></ul></div></div><div class="navbar__items navbar__items--right"><a class="navbar__item navbar__link navbar_download_button" href="/download/">Download</a><div class="searchBox_ZlJk"><button type="button" class="DocSearch DocSearch-Button" aria-label="Search"><span class="DocSearch-Button-Container"><svg width="20" height="20" class="DocSearch-Search-Icon" viewBox="0 0 20 20" aria-hidden="true"><path d="M14.386 14.386l4.0877 4.0877-4.0877-4.0877c-2.9418 2.9419-7.7115 2.9419-10.6533 0-2.9419-2.9418-2.9419-7.7115 0-10.6533 2.9418-2.9419 7.7115-2.9419 10.6533 0 2.9419 2.9418 2.9419 7.7115 0 10.6533z" stroke="currentColor" fill="none" fill-rule="evenodd" stroke-linecap="round" stroke-linejoin="round"></path></svg><span class="DocSearch-Button-Placeholder">Search</span></span><span class="DocSearch-Button-Keys"></span></button></div></div></div><div role="presentation" class="navbar-sidebar__backdrop"></div></nav><div id="docusaurus_skipToContent_fallback" class="main-wrapper mainWrapper_z2l0"><div class="container margin-top--lg"><div class="row"><main class="col col--12" itemscope="" itemtype="https://schema.org/Blog"><article class="BlogContainerPost_N_n1" itemprop="blogPost" itemscope="" itemtype="https://schema.org/BlogPosting"><header><div><h1 class="title_xvU1" itemprop="headline">Apache Pulsar 2.4.2</h1><div class="row"><div class="col authorCol_q4o9"><div class="avatar"><div class="avatar__intro" itemprop="author" itemscope="" itemtype="https://schema.org/Person"><div class="avatar__name"><a href="https://twitter.com/wolf4j1" target="_blank" rel="noopener noreferrer" itemprop="url"><span itemprop="name">Xiaolong Ran</span></a></div></div></div></div></div><div class="container_iJTo"><time datetime="2019-12-04T00:00:00.000Z" itemprop="datePublished">December 4, 2019</time> ยท <!-- -->6 min read</div></div></header><div id="post-content" class="markdown" itemprop="articleBody"><p>We are proud to publish Apache Pulsar 2.4.2. Thank the great efforts from Apache Pulsar community with over 110 commits, covering improvements and bug fixes.</p><p>For detailed changes related to 2.4.2 release, refer to <b><a href="/release-notes/#2.4.2">release notes</a></b>.</p><p>I will highlight some improvements and bug fixes in this blog.</p><h2 class="anchor anchorWithStickyNavbar_LWe7" id="use-classloaders-to-load-java-functions">Use classLoaders to load Java functions<a href="#use-classloaders-to-load-java-functions" class="hash-link" aria-label="Direct link to Use classLoaders to load Java functions" title="Direct link to Use classLoaders to load Java functions">โ€‹</a></h2><p>In Pulsar 2.4.2, windowed functions can work well whether Java Functions instances use shaded JAR or classLoaders, and functionClassLoader is set correctly when the <code>--output-serde-classname</code> option is enabled.</p><p>Before Pulsar 2.4.2, Java Functions instances are started with a shaded JAR, and different classLoaders are used to load the internal Pulsar code, user code, and the interfaces that the two interacts with each other. This change results in two issues:</p><ul><li>The windowed functions do not work well if Java Functions instances use classLoaders. </li><li>When using the <code>--output-serde-classname</code> option, functionClassLoader is not set correctly. </li></ul><h2 class="anchor anchorWithStickyNavbar_LWe7" id="start-broker-with-functions-worker">Start Broker with Functions worker<a href="#start-broker-with-functions-worker" class="hash-link" aria-label="Direct link to Start Broker with Functions worker" title="Direct link to Start Broker with Functions worker">โ€‹</a></h2><p>In Pulsar 2.4.2, we can start Broker with Functions worker when broker client is enabled with TLS. Before Pulsar 2.4.2, when we run Functions worker with the broker, it checks whether TLS is enabled in the <code>function_worker.yml</code> file. If TLS is enabled, it uses TLS port. However, when TLS is enabled on Functions worker, it checks the <code>broker.conf</code>. Since Functions worker runs with the broker, it makes sense to check the <code>broker.conf</code> as the single source of truth about whether or not to use TLS. </p><h2 class="anchor anchorWithStickyNavbar_LWe7" id="add-error-code-and-error-message-when-a-key-does-not-exist">Add error code and error message when a key does not exist<a href="#add-error-code-and-error-message-when-a-key-does-not-exist" class="hash-link" aria-label="Direct link to Add error code and error message when a key does not exist" title="Direct link to Add error code and error message when a key does not exist">โ€‹</a></h2><p>In Pulsar Functions, BookKeeper is supported to store the state of Functions. When users attempt to fetch a key that does not exist from function state, an NPE(NullPointerException) error occurs. In Pulsar 2.4.2, we add error code and error message for the case when a key does not exist.</p><h2 class="anchor anchorWithStickyNavbar_LWe7" id="deduplication">Deduplication<a href="#deduplication" class="hash-link" aria-label="Direct link to Deduplication" title="Direct link to Deduplication">โ€‹</a></h2><p>Deduplication removes messages based on the the largest sequence ID that pre-persisted. If an error is persisted to BookKeeper, a retry attempt is &quot;deduplicated&quot; with no message ever getting persisted. In version 2.4.2, we fix the issue from the following two aspects: </p><ul><li>Double check the pending messages and return error to the producer when the duplication status is uncertain. For example, when a message is still pending.</li><li>Sync back the lastPushed map with the lastStored map after failures.</li></ul><h2 class="anchor anchorWithStickyNavbar_LWe7" id="consume-data-from-the-earliest-location">Consume data from the earliest location<a href="#consume-data-from-the-earliest-location" class="hash-link" aria-label="Direct link to Consume data from the earliest location" title="Direct link to Consume data from the earliest location">โ€‹</a></h2><p>In Pulsar 2.4.2, we add <code>--subs-position</code> for Pulsar Sinks, so users can consume data from the latest and earliest locations. Before 2.4.2 release, data in topics is consumed from the latest location in Pulsar Sinks by default, and users can not consume the earliest data in sink topic. </p><h2 class="anchor anchorWithStickyNavbar_LWe7" id="close-previous-dispatcher-when-the-subscription-type-changes">Close previous dispatcher when the subscription type changes<a href="#close-previous-dispatcher-when-the-subscription-type-changes" class="hash-link" aria-label="Direct link to Close previous dispatcher when the subscription type changes" title="Direct link to Close previous dispatcher when the subscription type changes">โ€‹</a></h2><p>In Pulsar 2.4.2, when the type of a subscription changes, a new dispatcher is created, and the old dispatcher is closed, thus avoiding memory leaks. Before 2.4.2, when the subscription type of a topic changes, a new dispatcher is created and the old one is discarded, yet not closed, which causes memory leaks. If the cursor is not durable, the subscription is closed and removed from the topic when all consumers are removed. The dispatcher should be closed at this time. Otherwise, RateLimiter instances are not garbage collected, which results in a memory leak. </p><h2 class="anchor anchorWithStickyNavbar_LWe7" id="select-an-active-consumer-based-on-the-subscription-order">Select an active consumer based on the subscription order<a href="#select-an-active-consumer-based-on-the-subscription-order" class="hash-link" aria-label="Direct link to Select an active consumer based on the subscription order" title="Direct link to Select an active consumer based on the subscription order">โ€‹</a></h2><p>In Pulsar 2.4.2, the active consumer is selected based on the subscription order. The first consumer in the consumer list is selected as an active consumer without sorting. Before 2.4.2, the active consumer is selected based on the priority level and consumer name. In this case, the active consumer joins and leaves, and no consumer is actually elected as &quot;active&quot; or consumes messages. </p><h2 class="anchor anchorWithStickyNavbar_LWe7" id="remove-failed-stale-producer-from-the-connection">Remove failed stale producer from the connection<a href="#remove-failed-stale-producer-from-the-connection" class="hash-link" aria-label="Direct link to Remove failed stale producer from the connection" title="Direct link to Remove failed stale producer from the connection">โ€‹</a></h2><p>In Pulsar 2.4.2, failed producer is removed correctly from the connection. Before Pulsar 2.4.2, broker cannot clean up the old failed producer correctly from the connection. When broker tries to clean up <code>producer-future</code> in the failed producer, it removes the newly created <code>producer-future</code> rather than the old failed producer, and the following error occurs in broker.</p><div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">17:22:00.700 [pulsar-io-21-26] WARN org.apache.pulsar.broker.service.ServerCnx - [/1.1.1.1:1111][453] Producer with id persistent://prop/cluster/ns/topic is already present on the connection</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg class="copyButtonIcon_y97N" viewBox="0 0 24 24"><path d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg class="copyButtonSuccessIcon_LjdS" viewBox="0 0 24 24"><path d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div><h2 class="anchor anchorWithStickyNavbar_LWe7" id="add-new-apis-for-schema">Add new APIs for schema<a href="#add-new-apis-for-schema" class="hash-link" aria-label="Direct link to Add new APIs for schema" title="Direct link to Add new APIs for schema">โ€‹</a></h2><p>In Pulsar 2.4.2, we add the following APIs for schema:</p><ul><li><code>getAllVersions</code>: return the list of schema versions for a given topic.</li><li><code>testCompatibility</code>: be able to test the compatibility for a schema without registering it.</li><li><code>getVersionBySchema</code>: provide a schema definition and provide the schema version for it.</li></ul><h2 class="anchor anchorWithStickyNavbar_LWe7" id="expose-getlastmessageid-method-in-consumerimpl">Expose <code>getLastMessageId()</code> method in consumerImpl<a href="#expose-getlastmessageid-method-in-consumerimpl" class="hash-link" aria-label="Direct link to expose-getlastmessageid-method-in-consumerimpl" title="Direct link to expose-getlastmessageid-method-in-consumerimpl">โ€‹</a></h2><p>In Pulsar 2.4.2, we expose <code>getLastMessageId()</code> method in consumerImpl. It benefits users when they want to know the lag messages, or only consume messages before the current time. </p><h2 class="anchor anchorWithStickyNavbar_LWe7" id="add-new-send-interface-in-cgo">Add new <code>send()</code> interface in C++/Go<a href="#add-new-send-interface-in-cgo" class="hash-link" aria-label="Direct link to add-new-send-interface-in-cgo" title="Direct link to add-new-send-interface-in-cgo">โ€‹</a></h2><p>In Pulsar 2.4.2, we add new <code>send()</code> interface in C++/Go, so the <code>MessageID</code> will be returned to users. The logic is consistent with that in Java. In Java client, the <code>MessageId send(byte[] message)</code> returns <code>MessageId</code> for users.</p><h2 class="anchor anchorWithStickyNavbar_LWe7" id="consumer-background-tasks-are-cancelled-after-subscription-failures">Consumer background tasks are cancelled after subscription failures<a href="#consumer-background-tasks-are-cancelled-after-subscription-failures" class="hash-link" aria-label="Direct link to Consumer background tasks are cancelled after subscription failures" title="Direct link to Consumer background tasks are cancelled after subscription failures">โ€‹</a></h2><p>In Pulsar 2.4.2, we ensure that consumer background tasks are cancelled after subscription failures. Before 2.4.2, some background consumer tasks are started in the ConsumerImpl constructor though these tasks are not cancelled if the consumer creation fails, leaving active references to these objects. </p><h2 class="anchor anchorWithStickyNavbar_LWe7" id="delete-topics-attached-with-regex-consumers">Delete topics attached with regex consumers<a href="#delete-topics-attached-with-regex-consumers" class="hash-link" aria-label="Direct link to Delete topics attached with regex consumers" title="Direct link to Delete topics attached with regex consumers">โ€‹</a></h2><p>In Pulsar 2.4.2, we can delete topics attached with a regex consumer. The followings are detailed methods.</p><ul><li>Add a flag in CommandSubscribe so that a regex consumer will never trigger the creation of a topic.</li><li>Subscribe to a non-existing topic. When a specific error occurs, the consumer is interpreted as a permanent failure and thus stopping retrying.</li></ul><p>Before 2.4.2, it&#x27;s not possible to delete topics when there is a regex consumer attached to them. The reason is that the regex consumer will immediately reconnect and re-create the topic. </p><h2 class="anchor anchorWithStickyNavbar_LWe7" id="reference">Reference<a href="#reference" class="hash-link" aria-label="Direct link to Reference" title="Direct link to Reference">โ€‹</a></h2><p>Download Pulsar 2.4.2 <a href="https://pulsar.apache.org/download/" target="_blank" rel="noopener noreferrer">here</a>. </p><p>If you have any questions or suggestions, contact us with mailing lists or slack. </p><ul><li><a href="mailto:users@pulsar.apache.org" target="_blank" rel="noopener noreferrer">users@pulsar.apache.org</a> </li><li><a href="mailto:dev@pulsar.apache.org" target="_blank" rel="noopener noreferrer">dev@pulsar.apache.org</a> </li><li>Pulsar slack channel: <a href="https://apache-pulsar.slack.com/" target="_blank" rel="noopener noreferrer">https://apache-pulsar.slack.com/</a></li><li>You can self-register at <a href="https://apache-pulsar.herokuapp.com/" target="_blank" rel="noopener noreferrer">https://apache-pulsar.herokuapp.com/</a></li></ul><p>Looking forward to your contributions to <a href="https://github.com/apache/pulsar" target="_blank" rel="noopener noreferrer">Pulsar</a>.</p></div><footer class="row docusaurus-mt-lg blogPostFooterDetailsFull_Wr5y"><div class="col margin-top--sm"><a href="https://github.com/apache/pulsar-site/edit/main/blog/2019-12-04-Apache-Pulsar-2-4-2.md" target="_blank" rel="noreferrer noopener" class="theme-edit-this-page"><svg fill="currentColor" height="20" width="20" viewBox="0 0 40 40" class="iconEdit_Z9Sw" aria-hidden="true"><g><path d="m34.5 11.7l-3 3.1-6.3-6.3 3.1-3q0.5-0.5 1.2-0.5t1.1 0.5l3.9 3.9q0.5 0.4 0.5 1.1t-0.5 1.2z m-29.5 17.1l18.4-18.5 6.3 6.3-18.4 18.4h-6.3v-6.2z"></path></g></svg>Edit this page</a></div></footer></article><nav class="pagination-nav blog-post-pagination-nav docusaurus-mt-lg" aria-label="Blog post page navigation"><div><a class="pagination-nav__link pagination-nav__link--prev" href="/blog/2019/12/18/Pulsar-summit-cfp/"><div class="pagination-nav__sublabel">Newer Post</div><div class="pagination-nav__label">Pulsar Summit San Francisco 2020 CFP is now open</div></a><a class="pagination-nav__link pagination-nav__link--next" href="/blog/2019/07/05/Apache-Pulsar-2-4-0/"><div class="pagination-nav__sublabel">Older Post</div><div class="pagination-nav__label">Apache Pulsar 2.4.0</div></a><div class="blog-post-pagination-nav-more"><a href="/blog">Show All</a></div></div></nav></main></div></div></div><footer class="footer"><div class="container container-fluid"><div class="row footer__links"><div class="col footer__col"><div class="footer__title"></div><ul class="footer__items clean-list"><li class="footer__item"><a href="https://www.apache.org/" target="_blank" rel="noopener noreferrer" class="footer__link-item">Foundation<svg width="13.5" height="13.5" aria-hidden="true" viewBox="0 0 24 24" class="iconExternalLink_nPIU"><path fill="currentColor" d="M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"></path></svg></a></li><li class="footer__item"><a href="https://www.apache.org/events/current-event.html" target="_blank" rel="noopener noreferrer" class="footer__link-item">Events<svg width="13.5" height="13.5" aria-hidden="true" viewBox="0 0 24 24" class="iconExternalLink_nPIU"><path fill="currentColor" d="M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"></path></svg></a></li></ul></div><div class="col footer__col"><div class="footer__title"></div><ul class="footer__items clean-list"><li class="footer__item"><a href="https://www.apache.org/licenses/" target="_blank" rel="noopener noreferrer" class="footer__link-item">License<svg width="13.5" height="13.5" aria-hidden="true" viewBox="0 0 24 24" class="iconExternalLink_nPIU"><path fill="currentColor" d="M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"></path></svg></a></li><li class="footer__item"><a href="https://www.apache.org/foundation/thanks" target="_blank" rel="noopener noreferrer" class="footer__link-item">Thanks<svg width="13.5" height="13.5" aria-hidden="true" viewBox="0 0 24 24" class="iconExternalLink_nPIU"><path fill="currentColor" d="M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"></path></svg></a></li><li class="footer__item"><a href="https://www.apache.org/foundation/sponsorship" target="_blank" rel="noopener noreferrer" class="footer__link-item">Sponsorship<svg width="13.5" height="13.5" aria-hidden="true" viewBox="0 0 24 24" class="iconExternalLink_nPIU"><path fill="currentColor" d="M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"></path></svg></a></li></ul></div><div class="col footer__col"><div class="footer__title"></div><ul class="footer__items clean-list"><li class="footer__item"><a class="footer__link-item" href="/security/">Security</a></li><li class="footer__item"><a href="https://www.apache.org/foundation/policies/privacy.html" target="_blank" rel="noopener noreferrer" class="footer__link-item">Privacy<svg width="13.5" height="13.5" aria-hidden="true" viewBox="0 0 24 24" class="iconExternalLink_nPIU"><path fill="currentColor" d="M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"></path></svg></a></li><li class="footer__item"><a class="footer__link-item" href="/contact/">Contact</a></li></ul></div><div class="col footer__col"><div class="footer__title"></div><ul class="footer__items clean-list"><li class="footer__item">
<div class="social-icons">
<a target="_blank" href="https://communityinviter.com/apps/apache-pulsar/apache-pulsar" aria-label="Join the Apache Pulsar Slack workspace">
<img alt="Slack logo" src="/img/slack-white.svg" width="26">
</a>
<a target="_blank" href="https://github.com/apache/pulsar/" aria-label="View the Apache Pulsar project on GitHub">
<img alt="GitHub logo" src="/img/github-white.svg" width="26">
</a>
</div>
</li></ul></div></div><div class="footer__bottom text--center"><div class="margin-bottom--sm"><a class="footerLogoLink_BH7S" href="/"><img src="/img/pulsar-white.svg" alt="Pulsar Logo" class="themedImage_ToTc themedImage--light_HNdA footer__logo"><img src="/img/pulsar-white.svg" alt="Pulsar Logo" class="themedImage_ToTc themedImage--dark_i4oU footer__logo"></a></div><div class="footer__copyright">
<div>
<img class="footer-apache-logo" src="/img/feather-logo-white.svg" alt="" width="20">
The Apache Software Foundation
</div>
<p>Apache Pulsar is available under the Apache License, version 2.0. Apache Pulsar is an open-source, distributed messaging and streaming platform built for the cloud.</p>
<p>Copyright ยฉ 2024 The Apache Software Foundation. All Rights Reserved. Apache, Pulsar, Apache Pulsar, and the Apache feather logo are trademarks or registered trademarks of The Apache Software Foundation.</p>
</div></div></div></footer></div>
<script src="/assets/js/runtime~main.1d0ed2a7.js"></script>
<script src="/assets/js/main.e07a0c68.js"></script>
</body>
</html>