blob: 3b474cdca298f1f4298410adce4e8ac4c16dedd5 [file] [log] [blame]
<!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta http-equiv="X-UA-Compatible" content="IE=edge"/><title>Blog · Apache Pulsar</title><meta name="viewport" content="width=device-width, initial-scale=1.0"/><meta name="generator" content="Docusaurus"/><meta name="description" content=""/><meta name="docsearch:language" content="en"/><meta property="og:title" content="Blog · Apache Pulsar"/><meta property="og:type" content="website"/><meta property="og:url" content="https://pulsar.apache.org/"/><meta property="og:description" content=""/><meta name="twitter:card" content="summary"/><meta name="twitter:image" content="https://pulsar.apache.org/img/pulsar.svg"/><link rel="shortcut icon" href="/img/pulsar.ico"/><link rel="stylesheet" href="//cdnjs.cloudflare.com/ajax/libs/highlight.js/9.12.0/styles/atom-one-dark.min.css"/><link rel="alternate" type="application/atom+xml" href="https://pulsar.apache.org/blog/atom.xml" title="Apache Pulsar Blog ATOM Feed"/><link rel="alternate" type="application/rss+xml" href="https://pulsar.apache.org/blog/feed.xml" title="Apache Pulsar Blog RSS Feed"/><link rel="stylesheet" href="/css/code-blocks-buttons.css"/><script type="text/javascript" src="https://buttons.github.io/buttons.js"></script><script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/clipboard.js/2.0.0/clipboard.min.js"></script><script type="text/javascript" src="/js/custom.js"></script><script src="/js/scrollSpy.js"></script><link rel="stylesheet" href="/css/main.css"/><script src="/js/codetabs.js"></script></head><body class="blog"><div class="fixedHeaderContainer"><div class="headerWrapper wrapper"><header><a href="/en"><img class="logo" src="/img/pulsar.svg" alt="Apache Pulsar"/></a><a href="/en/versions"><h3>2.10.0</h3></a><div class="navigationWrapper navigationSlider"><nav class="slidingNav"><ul class="nav-site nav-site-internal"><li class=""><a href="/docs/en/getting-started-standalone" target="_self">Docs</a></li><li class=""><a href="/en/download" target="_self">Download</a></li><li class=""><a href="/docs/en/client-libraries" target="_self">Clients</a></li><li class=""><a href="#restapis" target="_self">REST APIs</a></li><li class=""><a href="#cli" target="_self">Cli</a></li><li class="siteNavGroupActive siteNavItemActive"><a href="/blog/" target="_self">Blog</a></li><li class=""><a href="#community" target="_self">Community</a></li><li class=""><a href="#apache" target="_self">Apache</a></li><li class=""><a href="https://pulsar-next.staged.apache.org/" target="_self">New Website (Beta)</a></li><span><li><a id="languages-menu" href="#"><img class="languages-icon" src="/img/language.svg" alt="Languages icon"/>English</a><div id="languages-dropdown" class="hide"><ul id="languages-dropdown-items"><li><a href="/ja">日本語</a></li><li><a href="/fr">Français</a></li><li><a href="/ko">한국어</a></li><li><a href="/zh-CN">中文</a></li><li><a href="/zh-TW">繁體中文</a></li><li><a href="https://crowdin.com/project/apache-pulsar" target="_blank" rel="noreferrer noopener">Help Translate</a></li></ul></div></li><script>
const languagesMenuItem = document.getElementById("languages-menu");
const languagesDropDown = document.getElementById("languages-dropdown");
languagesMenuItem.addEventListener("click", function(event) {
event.preventDefault();
if (languagesDropDown.className == "hide") {
languagesDropDown.className = "visible";
} else {
languagesDropDown.className = "hide";
}
});
</script></span></ul></nav></div></header></div></div><div class="navPusher"><div class="docMainWrapper wrapper"><div class="docsNavContainer" id="docsNav"><nav class="toc"><div class="toggleNav"><section class="navWrapper wrapper"><div class="navBreadcrumb wrapper"><div class="navToggle" id="navToggler"><div class="hamburger-menu"><div class="line1"></div><div class="line2"></div><div class="line3"></div></div></div><h2><i></i><span>Recent Posts</span></h2><div class="tocToggler" id="tocToggler"><i class="icon-toc"></i></div></div><div class="navGroups"><div class="navGroup"><h3 class="navGroupCategoryTitle">Recent Posts</h3><ul class=""><li class="navListItem"><a class="navItem" href="/blog/2022/05/11/whats-new-in-pulsar-210">What’s New in Apache Pulsar 2.10</a></li><li class="navListItem"><a class="navItem" href="/blog/2022/05/11/apache-pulsar-community-welcomes-500th-contributor">The Apache Pulsar Community Welcomes 500th Contributor!</a></li><li class="navListItem"><a class="navItem" href="/blog/2022/04/08/Apache-Pulsar-2-9-2">What’s New in Apache Pulsar 2.9.2</a></li><li class="navListItem"><a class="navItem" href="/blog/2021/12/14/Apache-Pulsar-2-7-4">What’s New in Apache Pulsar 2.7.4</a></li><li class="navListItem"><a class="navItem" href="/blog/2021/12/11/Log4j-CVE">Log4j2 Zero Day vulnerability (CVE-2021-44228)</a></li></ul></div></div></section></div><script>
var coll = document.getElementsByClassName('collapsible');
var checkActiveCategory = true;
for (var i = 0; i < coll.length; i++) {
var links = coll[i].nextElementSibling.getElementsByTagName('*');
if (checkActiveCategory){
for (var j = 0; j < links.length; j++) {
if (links[j].classList.contains('navListItemActive')){
coll[i].nextElementSibling.classList.toggle('hide');
coll[i].childNodes[1].classList.toggle('rotate');
checkActiveCategory = false;
break;
}
}
}
coll[i].addEventListener('click', function() {
var arrow = this.childNodes[1];
arrow.classList.toggle('rotate');
var content = this.nextElementSibling;
content.classList.toggle('hide');
});
}
document.addEventListener('DOMContentLoaded', function() {
createToggler('#navToggler', '#docsNav', 'docsSliderActive');
createToggler('#tocToggler', 'body', 'tocActive');
var headings = document.querySelector('.toc-headings');
headings && headings.addEventListener('click', function(event) {
var el = event.target;
while(el !== headings){
if (el.tagName === 'A') {
document.body.classList.remove('tocActive');
break;
} else{
el = el.parentNode;
}
}
}, false);
function createToggler(togglerSelector, targetSelector, className) {
var toggler = document.querySelector(togglerSelector);
var target = document.querySelector(targetSelector);
if (!toggler) {
return;
}
toggler.onclick = function(event) {
event.preventDefault();
target.classList.toggle(className);
};
}
});
</script></nav></div><div class="container mainContainer postContainer blogContainer"><div class="wrapper"><div class="posts"><div class="post"><header class="postHeader"><h1 class="postHeaderTitle"><a href="/blog/2022/05/11/whats-new-in-pulsar-210">What’s New in Apache Pulsar 2.10</a></h1><p class="post-meta">May 11, 2022</p><div class="authorBlock"><p class="post-authorName"><a target="_blank" rel="noreferrer noopener">Penghui Li, Dave Duggins</a></p></div></header><article class="post-content"><div><span><p>The Apache Pulsar community releases version 2.10. 99 contributors provided improvements and bug fixes that delivered over 800 commits.</p>
</span></div><div class="read-more"><a class="button" href="/blog/2022/05/11/whats-new-in-pulsar-210">Read More</a></div></article></div><div class="post"><header class="postHeader"><h1 class="postHeaderTitle"><a href="/blog/2022/05/11/apache-pulsar-community-welcomes-500th-contributor">The Apache Pulsar Community Welcomes 500th Contributor!</a></h1><p class="post-meta">May 11, 2022</p><div class="authorBlock"><p class="post-authorName"><a target="_blank" rel="noreferrer noopener">Matteo Merli, Karin Landers, Alice Bi</a></p></div></header><article class="post-content"><div><span><p>Apache Pulsar is one of the fastest growing, most engaged open source projects, recognized by the <a href="https://thestack.technology/top-apache-projects-in-2021-from-superset-to-nuttx/">Apache Software Foundation</a> as a Top 5 Project based on engagement in 2021. The vitality of any open source project relies on continued community growth and engagement, and this month, the Apache Pulsar community hit another major milestone: <strong>welcoming its 500th contributor!</strong></p>
</span></div><div class="read-more"><a class="button" href="/blog/2022/05/11/apache-pulsar-community-welcomes-500th-contributor">Read More</a></div></article></div><div class="post"><header class="postHeader"><h1 class="postHeaderTitle"><a href="/blog/2022/04/08/Apache-Pulsar-2-9-2">What’s New in Apache Pulsar 2.9.2</a></h1><p class="post-meta">April 8, 2022</p><div class="authorBlock"><p class="post-authorName"><a target="_blank" rel="noreferrer noopener">gaoran10, Anonymitaet</a></p></div></header><article class="post-content"><div><span><p>The Apache Pulsar community releases version 2.9.2! 60 contributors provided improvements and bug fixes that delivered 317 commits.</p>
<p>Highlights of this release are as below:</p>
<ul>
<li><p>Transactions performance test tool is available. <a href="https://github.com/apache/pulsar/pull/11933">PR-11933</a></p></li>
<li><p>Brokers decrease the number of unacked messages. <a href="https://github.com/apache/pulsar/pull/13383">PR-13383</a></p></li>
<li><p>Readers continue to read data from the compacted ledgers. <a href="https://github.com/apache/pulsar/pull/13629">PR-13629</a></p></li>
</ul>
<p>This blog walks through the most noteworthy changes grouped by the affected functionalities. For the complete list including all features, enhancements, and bug fixes, check out the <a href="https://github.com/apache/pulsar/releases/tag/v2.9.2">Pulsar 2.9.2 Release Notes</a>.</p>
<h1><a class="anchor" aria-hidden="true" id="notable-bug-fixes-and-enhancements"></a><a href="#notable-bug-fixes-and-enhancements" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"></path></svg></a>Notable bug fixes and enhancements</h1>
<h3><a class="anchor" aria-hidden="true" id="readers-continue-to-read-data-from-the-compacted-ledgers-pr-13629httpsgithubcomapachepulsarpull13629"></a><a href="#readers-continue-to-read-data-from-the-compacted-ledgers-pr-13629httpsgithubcomapachepulsarpull13629" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"></path></svg></a>Readers continue to read data from the compacted ledgers. <a href="https://github.com/apache/pulsar/pull/13629">PR-13629</a></h3>
<h4><a class="anchor" aria-hidden="true" id="issue"></a><a href="#issue" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"></path></svg></a>Issue</h4>
<p>Previously, when topics were unloaded, some data was lost to be read by readers if they have consumed some messages from some compacted ledgers.</p>
<h4><a class="anchor" aria-hidden="true" id="resolution"></a><a href="#resolution" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"></path></svg></a>Resolution</h4>
<p>Rewound the reader cursor to the next message of the mark delete position if <code>readCompacted = true</code>.</p>
<h3><a class="anchor" aria-hidden="true" id="brokers-decrease-the-number-of-unacked-messages-pr-13383httpsgithubcomapachepulsarpull13383"></a><a href="#brokers-decrease-the-number-of-unacked-messages-pr-13383httpsgithubcomapachepulsarpull13383" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"></path></svg></a>Brokers decrease the number of unacked messages. <a href="https://github.com/apache/pulsar/pull/13383">PR-13383</a></h3>
<h4><a class="anchor" aria-hidden="true" id="issue-1"></a><a href="#issue-1" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"></path></svg></a>Issue</h4>
<p>Previously, brokers did not decrease the number of unacked messages if batch ack was enabled. Consequently, consumers were blocked if they reached <code>maxUnackedMessagesPerConsumer</code> limit.</p>
<h4><a class="anchor" aria-hidden="true" id="resolution-1"></a><a href="#resolution-1" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"></path></svg></a>Resolution</h4>
<p>Decreased the number of unacked messages when <code>individualAckNormal</code> was called.</p>
<h3><a class="anchor" aria-hidden="true" id="chunked-messages-can-be-queried-through-pulsar-sql-pr-12720httpsgithubcomapachepulsarpull12720"></a><a href="#chunked-messages-can-be-queried-through-pulsar-sql-pr-12720httpsgithubcomapachepulsarpull12720" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"></path></svg></a>Chunked messages can be queried through Pulsar SQL. <a href="https://github.com/apache/pulsar/pull/12720">PR-12720</a></h3>
<h4><a class="anchor" aria-hidden="true" id="issue-2"></a><a href="#issue-2" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"></path></svg></a>Issue</h4>
<p>Previously, chunked messages could not be queried through Pulsar SQL.</p>
<h4><a class="anchor" aria-hidden="true" id="resolution-2"></a><a href="#resolution-2" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"></path></svg></a>Resolution</h4>
<p>Add a chunked message map in <code>PulsarRecordCursor</code> to maintain incomplete chunked messages. If one chunked message was received completely, it would be offered in the message queue to wait for deserialization.</p>
<h3><a class="anchor" aria-hidden="true" id="support-enable-or-disable-schema-upload-at-the-broker-level-pr-12786httpsgithubcomapachepulsarpull12786"></a><a href="#support-enable-or-disable-schema-upload-at-the-broker-level-pr-12786httpsgithubcomapachepulsarpull12786" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"></path></svg></a>Support enable or disable schema upload at the broker level. <a href="https://github.com/apache/pulsar/pull/12786">PR-12786</a></h3>
<h4><a class="anchor" aria-hidden="true" id="issue-3"></a><a href="#issue-3" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"></path></svg></a>Issue</h4>
<p>Previously, Pulsar didn't support enabling or disabling schema upload at the broker level.</p>
<h4><a class="anchor" aria-hidden="true" id="resolution-3"></a><a href="#resolution-3" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"></path></svg></a>Resolution</h4>
<p>Added the configuration <code>isSchemaAutoUploadEnabled</code> on the broker side.</p>
<h3><a class="anchor" aria-hidden="true" id="readers-can-read-the-latest-messages-in-compacted-topics-pr-14449httpsgithubcomapachepulsarpull14449"></a><a href="#readers-can-read-the-latest-messages-in-compacted-topics-pr-14449httpsgithubcomapachepulsarpull14449" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"></path></svg></a>Readers can read the latest messages in compacted topics. <a href="https://github.com/apache/pulsar/pull/14449">PR-14449</a></h3>
<h4><a class="anchor" aria-hidden="true" id="issue-4"></a><a href="#issue-4" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"></path></svg></a>Issue</h4>
<p>Previously, readers were not able to read the latest messages in compacted topics if readers enabled <code>readCompacted</code> and all the data of topics has been compacted to compacted ledgers.</p>
<h4><a class="anchor" aria-hidden="true" id="resolution-4"></a><a href="#resolution-4" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"></path></svg></a>Resolution</h4>
<p>Added the <code>forceReset</code> configuration for the managed cursor, so that the cursor could be reset to a given position and readers can read data from compacted ledgers.</p>
<h3><a class="anchor" aria-hidden="true" id="transaction-sequenceid-can-be-recovered-correctly-pr-13209httpsgithubcomapachepulsarpull13209"></a><a href="#transaction-sequenceid-can-be-recovered-correctly-pr-13209httpsgithubcomapachepulsarpull13209" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"></path></svg></a>Transaction sequenceId can be recovered correctly. <a href="https://github.com/apache/pulsar/pull/13209">PR-13209</a></h3>
<h4><a class="anchor" aria-hidden="true" id="issue-5"></a><a href="#issue-5" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"></path></svg></a>Issue</h4>
<p>Previously, the wrong transaction sequenceId was recovered due to incorrect <code>managedLedger</code> properties.</p>
<h4><a class="anchor" aria-hidden="true" id="resolution-5"></a><a href="#resolution-5" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"></path></svg></a>Resolution</h4>
<p>Used <code>ManagedLedgerInterceptor</code> to update current sequenceId to <code>managedLedger</code> properties and more.</p>
<h3><a class="anchor" aria-hidden="true" id="transactions-performance-test-tool-is-available-pr-11933httpsgithubcomapachepulsarpull11933"></a><a href="#transactions-performance-test-tool-is-available-pr-11933httpsgithubcomapachepulsarpull11933" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"></path></svg></a>Transactions performance test tool is available. <a href="https://github.com/apache/pulsar/pull/11933">PR-11933</a></h3>
<h4><a class="anchor" aria-hidden="true" id="issue-6"></a><a href="#issue-6" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"></path></svg></a>Issue</h4>
<p>Previously, it was hard to test transaction performance (such as the delay and rate of sending and consuming messages) when opening a transaction.</p>
<h4><a class="anchor" aria-hidden="true" id="resolution-6"></a><a href="#resolution-6" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"></path></svg></a>Resolution</h4>
<p>Added <code>PerformanceTransaction</code> class to support this enhancement.</p>
<h3><a class="anchor" aria-hidden="true" id="port-exhaustion-and-connection-issues-no-longer-exist-in-pulsar-proxy-pr-14078httpsgithubcomapachepulsarpull14078"></a><a href="#port-exhaustion-and-connection-issues-no-longer-exist-in-pulsar-proxy-pr-14078httpsgithubcomapachepulsarpull14078" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"></path></svg></a>Port exhaustion and connection issues no longer exist in Pulsar Proxy. <a href="https://github.com/apache/pulsar/pull/14078">PR-14078</a></h3>
<h4><a class="anchor" aria-hidden="true" id="issue-7"></a><a href="#issue-7" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"></path></svg></a>Issue</h4>
<p>Previously, Pulsar proxy would get into a state where it stopped proxying broker connections while Admin API proxying kept working.</p>
<h4><a class="anchor" aria-hidden="true" id="resolution-7"></a><a href="#resolution-7" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"></path></svg></a>Resolution</h4>
<p>Optimized the proxy connection to fail-fast if the target broker was not active, added connect timeout handling to proxy connection, and more.</p>
<h3><a class="anchor" aria-hidden="true" id="no-race-condition-in-opsendmsgqueue-when-publishing-messages-pr-14231httpsgithubcomapachepulsarpull14231"></a><a href="#no-race-condition-in-opsendmsgqueue-when-publishing-messages-pr-14231httpsgithubcomapachepulsarpull14231" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"></path></svg></a>No race condition in <code>OpSendMsgQueue</code> when publishing messages. <a href="https://github.com/apache/pulsar/pull/14231">PR-14231</a></h3>
<h4><a class="anchor" aria-hidden="true" id="issue-8"></a><a href="#issue-8" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"></path></svg></a>Issue</h4>
<p>After the method <code>getPendingQueueSize()</code> was called and the send receipt came back, the peek from the <code>pendingMessages</code> might get NPE during the process.</p>
<h4><a class="anchor" aria-hidden="true" id="resolution-8"></a><a href="#resolution-8" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"></path></svg></a>Resolution</h4>
<p>Added a thread-safe message count object in <code>OpSendMsgQueue</code> for each compute process.</p>
<h3><a class="anchor" aria-hidden="true" id="change-contextclassloader-to-narclassloader-in-additionalservlet-pr-13501httpsgithubcomapachepulsarpull13501"></a><a href="#change-contextclassloader-to-narclassloader-in-additionalservlet-pr-13501httpsgithubcomapachepulsarpull13501" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"></path></svg></a>Change <code>ContextClassLoader</code> to <code>NarClassLoader</code> in AdditionalServlet. <a href="https://github.com/apache/pulsar/pull/13501">PR-13501</a></h3>
<h4><a class="anchor" aria-hidden="true" id="issue-9"></a><a href="#issue-9" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"></path></svg></a>Issue</h4>
<p>Previously, if a class was dynamically loaded by <code>NarClassLoader</code>, <code>ClassNotFoundException</code> occurred when it was used by the default class load.</p>
<h4><a class="anchor" aria-hidden="true" id="resolution-9"></a><a href="#resolution-9" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"></path></svg></a>Resolution</h4>
<p>Changed context class loader through <code>Thread.currentThread().setContextClassLoader(classLoader)</code> before every plugin calling back and changed the context class loader back to original class loader afterwards.</p>
<h1><a class="anchor" aria-hidden="true" id="whats-next"></a><a href="#whats-next" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"></path></svg></a>What’s Next?</h1>
<p>If you are interested in learning more about Pulsar 2.9.2, you can <a href="https://pulsar.apache.org/en/versions/">download</a> and try it out now!</p>
<p><strong>Pulsar Summit San Francisco 2022</strong> will take place on August 18th, 2022. <a href="https://pulsar-summit.org/">Register now</a> and help us make it an even bigger success by spreading the word on social media!</p>
<p>For more information about the Apache Pulsar project and current progress, visit
the <a href="https://pulsar.apache.org">Pulsar website</a>, follow the project on Twitter
<a href="https://twitter.com/apache_pulsar">@apache_pulsar</a>, and join <a href="https://apache-pulsar.herokuapp.com/">Pulsar Slack</a>!</p>
</span></div></article></div><div class="post"><header class="postHeader"><h1 class="postHeaderTitle"><a href="/blog/2021/12/14/Apache-Pulsar-2-7-4">What’s New in Apache Pulsar 2.7.4</a></h1><p class="post-meta">December 14, 2021</p><div class="authorBlock"><p class="post-authorName"><a target="_blank" rel="noreferrer noopener">Technoboy-, Anonymitaet</a></p></div></header><article class="post-content"><div><span><p>The Apache Pulsar community releases version 2.7.4! 32 contributors provided improvements and bug fixes that delivered 98 commits.</p>
<p>Highlights of this release are as below:</p>
<ul>
<li><p>Upgrade Log4j to 2.17.0 - <a href="https://pulsar.apache.org/blog/2021/12/11/Log4j-CVE/">CVE-2021-45105</a>. <a href="https://github.com/apache/pulsar/pull/13392">PR-13392</a></p></li>
<li><p><code>ManagedLedger</code> can be referenced correctly when <code>OpAddEntry</code> is recycled. <a href="https://github.com/apache/pulsar/pull/12103">PR-12103</a></p></li>
<li><p>NPE does not occur on <code>OpAddEntry</code> while ManagedLedger is closing. <a href="https://github.com/apache/pulsar/pull/12364">PR-12364</a></p></li>
</ul>
<p>This blog walks through the most noteworthy changes grouped by the affected functionalities. For the complete list including all enhancements and bug fixes, check out the <a href="https://pulsar.apache.org/en/release-notes/#274">Pulsar 2.7.4 Release Notes</a>.</p>
<h1><a class="anchor" aria-hidden="true" id="notable-bug-fixes-and-enhancements"></a><a href="#notable-bug-fixes-and-enhancements" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"></path></svg></a>Notable bug fixes and enhancements</h1>
<h3><a class="anchor" aria-hidden="true" id="upgrade-log4j-to-2170---cve-2021-45105httpspulsarapacheorgblog20211211log4j-cve-pr-13392httpsgithubcomapachepulsarpull13392"></a><a href="#upgrade-log4j-to-2170---cve-2021-45105httpspulsarapacheorgblog20211211log4j-cve-pr-13392httpsgithubcomapachepulsarpull13392" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"></path></svg></a>Upgrade Log4j to 2.17.0 - <a href="https://pulsar.apache.org/blog/2021/12/11/Log4j-CVE/">CVE-2021-45105</a>. <a href="https://github.com/apache/pulsar/pull/13392">PR-13392</a></h3>
<ul>
<li><p><strong>Issue</strong></p>
<p>A serious vulnerability was reported regarding Log4j that can allow remote execution for attackers. The vulnerability issue is described and tracked under <a href="https://nvd.nist.gov/vuln/detail/CVE-2021-44228">CVE-2021-44228</a>.</p></li>
<li><p><strong>Resolution</strong></p>
<p>Pulsar 2.7.4 upgraded Log4j to 2.17.0.</p></li>
</ul>
<h3><a class="anchor" aria-hidden="true" id="managedledger-can-be-referenced-correctly-when-opaddentry-is-recycled-pr-12103httpsgithubcomapachepulsarpull12103"></a><a href="#managedledger-can-be-referenced-correctly-when-opaddentry-is-recycled-pr-12103httpsgithubcomapachepulsarpull12103" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"></path></svg></a><code>ManagedLedger</code> can be referenced correctly when <code>OpAddEntry</code> is recycled. <a href="https://github.com/apache/pulsar/pull/12103">PR-12103</a></h3>
<ul>
<li><p><strong>Issue</strong></p>
<p>Previously, after a write failure, a task was scheduled in the background to force close the ledger and trigger the creation of a new ledger. If the <code>OpAddEntry</code> instance was already recycled, that could lead to either an NPE or undefined behavior.</p></li>
<li><p><strong>Resolution</strong></p>
<p>The <code>ManagedLedgerImpl</code> object reference is copied to a final variable so the background task will not be dependent on the lifecycle of the <code>OpAddEntry</code> instance.</p></li>
</ul>
<h3><a class="anchor" aria-hidden="true" id="no-potential-race-condition-in-the-blobstorebackedreadhandler-pr-12123httpsgithubcomapachepulsarpull12123"></a><a href="#no-potential-race-condition-in-the-blobstorebackedreadhandler-pr-12123httpsgithubcomapachepulsarpull12123" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"></path></svg></a>No potential race condition in the <code>BlobStoreBackedReadHandler</code>. <a href="https://github.com/apache/pulsar/pull/12123">PR-12123</a></h3>
<ul>
<li><p><strong>Issue</strong></p>
<p>Previously, <code>BlobStoreBackedReadHandler</code> entered an infinite loop when reading an offload ledger. There was a race condition between the operation of reading entries and closing BlobStoreBackedReadHandler.</p></li>
<li><p><strong>Resolution</strong></p>
<p>Added a state check before reading entries and made the <code>BlobStoreBackedReadHandler</code> exit loop when the <code>entryID</code> is bigger than the <code>lastEntryID</code>.</p></li>
</ul>
<h3><a class="anchor" aria-hidden="true" id="npe-does-not-occur-on-opaddentry-while-managedledger-is-closing-pr-12364httpsgithubcomapachepulsarpull12364"></a><a href="#npe-does-not-occur-on-opaddentry-while-managedledger-is-closing-pr-12364httpsgithubcomapachepulsarpull12364" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"></path></svg></a>NPE does not occur on <code>OpAddEntry</code> while ManagedLedger is closing. <a href="https://github.com/apache/pulsar/pull/12364">PR-12364</a></h3>
<ul>
<li><p><strong>Issue</strong></p>
<p>Previously, the test <code>ManagedLedgerBkTest#managedLedgerClosed</code> closed ManagedLedger object on some <code>asyncAddEntry</code> operations and failed with NPE.</p></li>
<li><p><strong>Resolution</strong></p>
<p>Closed <code>OpAddEntry</code> when <code>ManagedLedger</code> signaled <code>OpAddEntry</code> to fail. In this way, the <code>OpAddEntry</code> object was correctly recycled and the failed callback was correctly triggered.</p></li>
</ul>
<h3><a class="anchor" aria-hidden="true" id="set-a-topic-policy-through-the-topic-name-of-a-partition-correctly-pr-11294httpsgithubcomapachepulsarpull11294"></a><a href="#set-a-topic-policy-through-the-topic-name-of-a-partition-correctly-pr-11294httpsgithubcomapachepulsarpull11294" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"></path></svg></a>Set a topic policy through the topic name of a partition correctly. <a href="https://github.com/apache/pulsar/pull/11294">PR-11294</a></h3>
<ul>
<li><p><strong>Issue</strong></p>
<p>Previously, the topic name of a partition could not be used to set a topic policy.</p></li>
<li><p><strong>Resolution</strong></p>
<p>Allowed setting a topic policy through a topic name of a partition by converting the topic name of a partition in <code>SystemTopicBasedTopicPoliciesService</code>.</p></li>
</ul>
<h3><a class="anchor" aria-hidden="true" id="dispatch-rate-limiter-takes-effect-for-consumers-pr-8611httpsgithubcomapachepulsarpull8611"></a><a href="#dispatch-rate-limiter-takes-effect-for-consumers-pr-8611httpsgithubcomapachepulsarpull8611" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"></path></svg></a>Dispatch rate limiter takes effect for consumers. <a href="https://github.com/apache/pulsar/pull/8611">PR-8611</a></h3>
<ul>
<li><p><strong>Issue</strong></p>
<p>Previously, dispatch rate limiter did not take effect in cases where all consumers started reading in the next second since <code>acquiredPermits</code> was reset to 0 every second.</p></li>
<li><p><strong>Resolution</strong></p>
<p>Changed the behaviour of <code>DispatchRateLimiter</code> by minus <code>permits</code> every second instead of reset <code>acquiredPermits</code> to 0. Consumers stopped reading entries temporarily until <code>acquiredPermits</code> returned to a value less than <code>permits</code> .</p></li>
</ul>
<h3><a class="anchor" aria-hidden="true" id="npe-does-not-occur-when-executing-unload-bundles-operations-pr-11310httpsgithubcomapachepulsarpull11310"></a><a href="#npe-does-not-occur-when-executing-unload-bundles-operations-pr-11310httpsgithubcomapachepulsarpull11310" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"></path></svg></a>NPE does not occur when executing unload bundles operations. <a href="https://github.com/apache/pulsar/pull/11310">PR-11310</a></h3>
<ul>
<li><p><strong>Issue</strong></p>
<p>When performing pressure tests on persistent partitioned topics, NPE occurred when executing unload bundles operations. Concurrently, producers did not write messages.</p></li>
<li><p><strong>Resolution</strong></p>
<p>Added more safety checks to fix this issue.</p></li>
</ul>
<h3><a class="anchor" aria-hidden="true" id="fix-inconsistent-behavior-for-namespace-bundles-cache-pr-11346httpsgithubcomapachepulsarpull11346"></a><a href="#fix-inconsistent-behavior-for-namespace-bundles-cache-pr-11346httpsgithubcomapachepulsarpull11346" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"></path></svg></a>Fix inconsistent behavior for Namespace bundles cache. <a href="https://github.com/apache/pulsar/pull/11346">PR-11346</a></h3>
<ul>
<li><p><strong>Issue</strong></p>
<p>Previously, namespace bundle cache was not invalidated after a namespace was deleted.</p></li>
<li><p><strong>Resolution</strong></p>
<p>Invalidated namespace policy cache when bundle cache was invalidated.</p></li>
</ul>
<h3><a class="anchor" aria-hidden="true" id="close-the-replicator-and-replication-client-after-a-cluster-is-deleted-pr-11342httpsgithubcomapachepulsarpull11342"></a><a href="#close-the-replicator-and-replication-client-after-a-cluster-is-deleted-pr-11342httpsgithubcomapachepulsarpull11342" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"></path></svg></a>Close the replicator and replication client after a cluster is deleted. <a href="https://github.com/apache/pulsar/pull/11342">PR-11342</a></h3>
<ul>
<li><p><strong>Issue</strong></p>
<p>Previously, the replicator and the replication client were not closed after a cluster was deleted. The producer of the replicator would then try to reconnect to the deleted cluster continuously.</p></li>
<li><p><strong>Resolution</strong></p>
<p>Closed the relative replicator and replication client.</p></li>
</ul>
<h3><a class="anchor" aria-hidden="true" id="publish-rate-limiter-takes-effect-as-expected-pr-10384httpsgithubcomapachepulsarpull10384"></a><a href="#publish-rate-limiter-takes-effect-as-expected-pr-10384httpsgithubcomapachepulsarpull10384" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"></path></svg></a>Publish rate limiter takes effect as expected. <a href="https://github.com/apache/pulsar/pull/10384">PR-10384</a></h3>
<ul>
<li><p><strong>Issue</strong></p>
<p>Previously, there were various issues if <code>preciseTopicPublishRateLimiterEnable</code> was set to <code>true</code> for rate limiting:</p>
<ul>
<li><p>Updating the limits did not set a boundary when changing the limits from a bounded limit to an unbounded limit.</p></li>
<li><p>Each topic created a scheduler thread for each limiter instance.</p></li>
<li><p>Topics did not release the scheduler thread when the topic was unloaded or the operation closed.</p></li>
<li><p>Updating the limits did not close the scheduler thread related to the replaced limiter instance</p></li>
</ul></li>
<li><p><strong>Resolution</strong></p>
<ul>
<li><p>Cleaned up the previous limiter instances before creating new limiter instances.</p></li>
<li><p>Used <code>brokerService.pulsar().getExecutor()</code> as the scheduler for the rate limiter instances.</p></li>
<li><p>Added resource cleanup hooks for topic closing (unload).</p></li>
</ul></li>
</ul>
<h3><a class="anchor" aria-hidden="true" id="clean-up-newly-created--ledgers-if-fails-to-update-znode-list-pr-12015httpsgithubcomapachepulsarpull12015"></a><a href="#clean-up-newly-created--ledgers-if-fails-to-update-znode-list-pr-12015httpsgithubcomapachepulsarpull12015" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"></path></svg></a>Clean up newly created ledgers if fails to update ZNode list. <a href="https://github.com/apache/pulsar/pull/12015">PR-12015</a></h3>
<ul>
<li><p><strong>Issue</strong></p>
<p>When updating a ZNode list, ZooKeeper threw an exception and did not clean up the created ledger. Newly created ledgers were not indexed to a topic <code>managedLedger</code> list and could not be cleared up as topic retention. Also, ZNode numbers increased in ZooKeeper if the ZNode version mismatch exception was thrown out.</p></li>
<li><p><strong>Resolution</strong></p>
<p>Deleted the created ledger from broker cache and BookKeeper regardless of exception type when the ZNode list failed to update.</p></li>
</ul>
<h1><a class="anchor" aria-hidden="true" id="whats-next"></a><a href="#whats-next" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"></path></svg></a>What’s Next?</h1>
<p>If you are interested in learning more about Pulsar 2.7.4, you can <a href="https://pulsar.apache.org/en/versions/">download</a> and try it out now!</p>
<p>Pulsar Summit Asia 2021 will take place on January 15-16, 2022. <a href="https://pulsar-summit.org/">Register now</a> and help us make it an even bigger success by spreading the word on social media!</p>
<p>For more information about the Apache Pulsar project and current progress, visit
the <a href="https://pulsar.apache.org">Pulsar website</a>, follow the project on Twitter
<a href="https://twitter.com/apache_pulsar">@apache_pulsar</a>, and join <a href="https://apache-pulsar.herokuapp.com/">Pulsar Slack</a>!</p>
</span></div></article></div><div class="post"><header class="postHeader"><h1 class="postHeaderTitle"><a href="/blog/2021/12/11/Log4j-CVE">Log4j2 Zero Day vulnerability (CVE-2021-44228)</a></h1><p class="post-meta">December 11, 2021</p><div class="authorBlock"><p class="post-authorName"><a target="_blank" rel="noreferrer noopener">Matteo Merli</a></p></div></header><article class="post-content"><div><span><p>Yesterday, a new serious vulnerability was reported regarding Log4j that can
allow remote execution for attackers.</p>
<p>The vulnerability issue is described and tracked under <a href="https://nvd.nist.gov/vuln/detail/CVE-2021-44228">CVE-2021-44228</a>.</p>
<p>Current releases of Apache Pulsar are bundling Log4j2 versions that are affected by this vulnerability.
Default configuration, combined with JVM version and other factors, can render it exploitable.
We strongly recommend to follow the advisory of the Apache Log4j community and patch your systems
as soon as possible, as well as looking for unexpected behavior in your Pulsar logs.</p>
<p>There are 2 workarounds to patch a Pulsar deployments. You can set either of:</p>
<ol>
<li>Java property: <code>-Dlog4j2.formatMsgNoLookups=true</code></li>
<li>Environment variable: <code>LOG4J_FORMAT_MSG_NO_LOOKUPS=true</code></li>
</ol>
<p>Both approaches are effective in mitigating the vulnerability for Pulsar
services.</p>
<p>Additionally, when running Pulsar Functions with Kubernetes runtime, you should update
your Docker images, following the example described <a href="https://github.com/lhotari/pulsar-docker-images-patch-CVE-2021-44228">here</a>.</p>
<p>If you are using the Pulsar Helm Chart for deploying in Kubernetes, a <a href="https://github.com/apache/pulsar-helm-chart/releases/tag/pulsar-2.7.6">new
version of the chart</a> is already available and it applies the above mentioned workaround.
If upgrading is not an option, you may also mitigate by adding <code>-Dlog4j2.formatMsgNoLookups=true</code> to the <code>PULSAR_EXTRA_OPTS</code> in the <code>configData</code> section for proxy, broker, bookkeeper, zookeeper, auto-recovery, and relative components in the helm values file.</p>
<p>We are already preparing new patch releases, 2.7.4, 2.8.2 and 2.9.1. These
releases will be ready in the next few days and will bundle the Log4j2 2.15.0,
which contains the vulnerability fix.</p>
</span></div></article></div><div class="post"><header class="postHeader"><h1 class="postHeaderTitle"><a href="/blog/2021/09/23/Apache-Pulsar-2-8-1">Apache Pulsar 2.8.1</a></h1><p class="post-meta">September 23, 2021</p><div class="authorBlock"><p class="post-authorName"><a target="_blank" rel="noreferrer noopener">Hang Chen, Anonymitaet</a></p></div></header><article class="post-content"><div><span><h1><a class="anchor" aria-hidden="true" id="whats-new-in-apache-pulsar-281"></a><a href="#whats-new-in-apache-pulsar-281" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"></path></svg></a>What’s New in Apache Pulsar 2.8.1</h1>
<p>The Apache Pulsar community releases version 2.8.1! 49 contributors provided improvements and bug fixes that delivered 213 commits.</p>
<p>Highlights of this release are as below:</p>
<ul>
<li><p>Key-shared subscriptions no longer stop dispatching to consumers when repeatedly opening and closing consumers. <a href="https://github.com/apache/pulsar/pull/10920">PR-10920</a></p></li>
<li><p>System topic no longer has potential data loss when not configured for compaction. <a href="https://github.com/apache/pulsar/pull/11003">PR-11003</a></p></li>
<li><p>Consumers are not allowed to read data on topics to which they are not subscribed. <a href="https://github.com/apache/pulsar/pull/11912">PR-11912</a></p></li>
</ul>
<p>This blog walks through the most noteworthy changes grouped by component. For the complete list including all features, enhancements, and bug fixes, check out the <a href="https://pulsar.apache.org/release-notes/#281-mdash-2021-09-10-a-id281a">Pulsar 2.8.1 Release Notes</a>.</p>
<h1><a class="anchor" aria-hidden="true" id="notable-bug-fixes-and-enhancements"></a><a href="#notable-bug-fixes-and-enhancements" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"></path></svg></a>Notable bug fixes and enhancements</h1>
<h2><a class="anchor" aria-hidden="true" id="broker"></a><a href="#broker" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"></path></svg></a>Broker</h2>
<h3><a class="anchor" aria-hidden="true" id="precise-publish-rate-limit-takes-effect-as-expected-pr-11446httpsgithubcomapachepulsarpull11446"></a><a href="#precise-publish-rate-limit-takes-effect-as-expected-pr-11446httpsgithubcomapachepulsarpull11446" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"></path></svg></a>Precise publish rate limit takes effect as expected. <a href="https://github.com/apache/pulsar/pull/11446">PR-11446</a></h3>
<p><strong>Issue</strong>: Previously, when setting precise publish rate limits on topics, it did not work.</p>
<p><strong>Resolution</strong>: Implemented a new <code>RateLimiter</code> using the <code>LeakingBucket</code> and <code>FixedWindow</code> algorithms.</p>
<h3><a class="anchor" aria-hidden="true" id="messages-with-the-same-keys-are-delivered-to-the-correct-consumers-on-key-shared-subscriptions-pr-10762httpsgithubcomapachepulsarpull10762"></a><a href="#messages-with-the-same-keys-are-delivered-to-the-correct-consumers-on-key-shared-subscriptions-pr-10762httpsgithubcomapachepulsarpull10762" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"></path></svg></a>Messages with the same keys are delivered to the correct consumers on Key-Shared subscriptions. <a href="https://github.com/apache/pulsar/pull/10762">PR-10762</a></h3>
<p><strong>Issue</strong>: Messages with the same keys were out of order when message redelivery occurred on a Key-Shared subscription.</p>
<p><strong>Resolution</strong>: When sending a message to <code>messagesToRedeliver</code>, the broker saved the hash value of the key. If the dispatcher attempted to send newer messages to the consumer that had a key corresponding to any one of the saved hash values, they were added to <code>messagesToRedeliver</code> instead of being sent. This prevented messages with the same key from being out of order.</p>
<h3><a class="anchor" aria-hidden="true" id="active-producers-with-the-same-name-are-no-longer-removed-from-the-topic-map-pr-11804httpsgithubcomapachepulsarpull11804"></a><a href="#active-producers-with-the-same-name-are-no-longer-removed-from-the-topic-map-pr-11804httpsgithubcomapachepulsarpull11804" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"></path></svg></a>Active producers with the same name are no longer removed from the topic map. <a href="https://github.com/apache/pulsar/pull/11804">PR-11804</a></h3>
<p><strong>Issue</strong>: Previously, when there were producers with the same name, an error would be triggered and the old producer would be removed even though it was still writing to a topic.</p>
<p><strong>Resolution</strong>: Validated producers based on a connection ID (local &amp; remote addresses and unique ID) and a producer ID within that connection rather than a producer name.</p>
<h3><a class="anchor" aria-hidden="true" id="topics-in-a-fenced-state-can-recover-when-producers-continue-to-reconnect-to-brokers-pr-11737httpsgithubcomapachepulsarpull11737"></a><a href="#topics-in-a-fenced-state-can-recover-when-producers-continue-to-reconnect-to-brokers-pr-11737httpsgithubcomapachepulsarpull11737" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"></path></svg></a>Topics in a fenced state can recover when producers continue to reconnect to brokers. <a href="https://github.com/apache/pulsar/pull/11737">PR-11737</a></h3>
<p><strong>Issue</strong>: Previously, when a producer continued to reconnect to a broker, the fenced state of the topic was always set to true, which caused the topic to be unable to recover.</p>
<p><strong>Resolution</strong>: Add an entry to <code>ManagedLedgerException</code> when the polled operation is not equal to the current operation.</p>
<h3><a class="anchor" aria-hidden="true" id="topic-properly-initializes-the-cursor-to-prevent-data-loss-pr-11547httpsgithubcomapachepulsarpull11547"></a><a href="#topic-properly-initializes-the-cursor-to-prevent-data-loss-pr-11547httpsgithubcomapachepulsarpull11547" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"></path></svg></a>Topic properly initializes the cursor to prevent data loss. <a href="https://github.com/apache/pulsar/pull/11547">PR-11547</a></h3>
<p><strong>Issue</strong>: Previously, when subscribing to a topic with the earliest position, data would be lost because <code>ManagedLedger</code> used a wrong position to initialize a cursor.</p>
<p><strong>Resolution</strong>: Added a test to check a cursor's position when subscribing to a topic with the earliest position.</p>
<h3><a class="anchor" aria-hidden="true" id="deadlock-no-longer-occurs-when-using-hasmessageavailableasync-and-readnextasync-pr-11183httpsgithubcomapachepulsarpull11183"></a><a href="#deadlock-no-longer-occurs-when-using-hasmessageavailableasync-and-readnextasync-pr-11183httpsgithubcomapachepulsarpull11183" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"></path></svg></a>Deadlock no longer occurs when using <code>hasMessageAvailableAsync</code> and <code>readNextAsync</code>. <a href="https://github.com/apache/pulsar/pull/11183">PR-11183</a></h3>
<p><strong>Issue</strong>: Previously, when messages were added to an incoming queue, a deadlock might occur. The deadlock might happen in two possible scenarios. First, if the message was added to the queue before the message was read. Second, if <code>readNextAsync</code> was completed before <code>future.whenComplete</code> was called.</p>
<p><strong>Resolution</strong>: Used an internal thread to process the callback of <code>hasMessageAvailableAsync</code>.</p>
<h3><a class="anchor" aria-hidden="true" id="memory-leak-does-not-occur-when-calling-getlastmessageid-api-pr-10977httpsgithubcomapachepulsarpull10977"></a><a href="#memory-leak-does-not-occur-when-calling-getlastmessageid-api-pr-10977httpsgithubcomapachepulsarpull10977" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"></path></svg></a>Memory leak does not occur when calling getLastMessageId API. <a href="https://github.com/apache/pulsar/pull/10977">PR-10977</a></h3>
<p><strong>Issue</strong>: Previously, the broker ran out of memory when calling the <code>getLastMessageId</code> API.</p>
<p><strong>Resolution</strong>: Added the <code>entry.release()</code> call to the <code>PersistentTopic.getLastMessageId</code>.</p>
<h3><a class="anchor" aria-hidden="true" id="compaction-is-triggered-for-system-topics-pr-10941httpsgithubcomapachepulsarpull10941"></a><a href="#compaction-is-triggered-for-system-topics-pr-10941httpsgithubcomapachepulsarpull10941" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"></path></svg></a>Compaction is triggered for system topics. <a href="https://github.com/apache/pulsar/pull/10941">PR-10941</a></h3>
<p><strong>Issue</strong>: Previously, when a topic had only non-durable subscriptions, the compaction was not triggered because it had 0 estimated backlog size.</p>
<p><strong>Resolution</strong>: Used the total backlog size to trigger the compaction. Changed the behavior in the case of no durable subscriptions to use the total backlog size</p>
<h3><a class="anchor" aria-hidden="true" id="key-shared-subscriptions-no-longer-stop-dispatching-to-consumers-when-repeatedly-opening-and-closing-consumers-pr-10920httpsgithubcomapachepulsarpull10920"></a><a href="#key-shared-subscriptions-no-longer-stop-dispatching-to-consumers-when-repeatedly-opening-and-closing-consumers-pr-10920httpsgithubcomapachepulsarpull10920" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"></path></svg></a>Key-shared subscriptions no longer stop dispatching to consumers when repeatedly opening and closing consumers. <a href="https://github.com/apache/pulsar/pull/10920">PR-10920</a></h3>
<p><strong>Issue</strong>: Repeatedly opening and closing consumers with a Key-Shared subscription might occasionally stop dispatching messages to all consumers.</p>
<p><strong>Resolution</strong>: Moved the mark-delete position and removed the consumer from the selector before calling <code>removeConsumer()</code>.</p>
<h3><a class="anchor" aria-hidden="true" id="consumers-are-not-allowed-to-read-data-on-topics-to-which-they-are-not-subscribed-pr-11912httpsgithubcomapachepulsarpull11912"></a><a href="#consumers-are-not-allowed-to-read-data-on-topics-to-which-they-are-not-subscribed-pr-11912httpsgithubcomapachepulsarpull11912" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"></path></svg></a>Consumers are not allowed to read data on topics to which they are not subscribed. <a href="https://github.com/apache/pulsar/pull/11912">PR-11912</a></h3>
<p><strong>Issue</strong>: Previously, the request ledger was not checked whether it belonged to a consumer’s connected topic, which allowed the consumer to read data that does not belong to the connected topic.</p>
<p><strong>Resolution</strong>: Added a check on the <code>ManagedLedger</code> level before executing read operations.</p>
<h2><a class="anchor" aria-hidden="true" id="topic-policy"></a><a href="#topic-policy" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"></path></svg></a>Topic Policy</h2>
<h3><a class="anchor" aria-hidden="true" id="retention-policy-works-as-expected-pr-11021httpsgithubcomapachepulsarpull11021"></a><a href="#retention-policy-works-as-expected-pr-11021httpsgithubcomapachepulsarpull11021" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"></path></svg></a>Retention policy works as expected. <a href="https://github.com/apache/pulsar/pull/11021">PR-11021</a></h3>
<p><strong>Issue</strong>: Previously, the retention policy did not work because it was not set in the <code>managedLedger</code> configuration.</p>
<p><strong>Resolution</strong>: Set the retention policy in the <code>managedLedger</code> configuration to the <code>onUpdate</code> listener method.</p>
<h3><a class="anchor" aria-hidden="true" id="system-topic-no-longer-has-potential-data-loss-when-not-configured-for-compaction-pr-11003httpsgithubcomapachepulsarpull11003"></a><a href="#system-topic-no-longer-has-potential-data-loss-when-not-configured-for-compaction-pr-11003httpsgithubcomapachepulsarpull11003" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"></path></svg></a>System topic no longer has potential data loss when not configured for compaction. <a href="https://github.com/apache/pulsar/pull/11003">PR-11003</a></h3>
<p><strong>Issue</strong>: Previously, data might be lost if there were no durable subscriptions on topics.</p>
<p><strong>Resolution</strong>: Leveraged the topic compaction cursor to retain data.</p>
<h2><a class="anchor" aria-hidden="true" id="proxy"></a><a href="#proxy" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"></path></svg></a>Proxy</h2>
<h3><a class="anchor" aria-hidden="true" id="pulsar-proxy-correctly-shuts-down-outbound-connections-pr-11848httpsgithubcomapachepulsarpull11848"></a><a href="#pulsar-proxy-correctly-shuts-down-outbound-connections-pr-11848httpsgithubcomapachepulsarpull11848" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"></path></svg></a>Pulsar proxy correctly shuts down outbound connections. <a href="https://github.com/apache/pulsar/pull/11848">PR-11848</a></h3>
<p><strong>Issue</strong>: Previously, there was a memory leak of outgoing TCP connections in the Pulsar proxy because the <code>ProxyConnectionPool</code> instances were created outside the <code>PulsarClientImpl</code> instance and not closed when the client was closed.</p>
<p><strong>Resolution</strong>: Shut down the <code>ConnectionPool</code> correctly.</p>
<h2><a class="anchor" aria-hidden="true" id="function"></a><a href="#function" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"></path></svg></a>Function</h2>
<h3><a class="anchor" aria-hidden="true" id="pulsar-functions-support-protobuf-schema-pr-11709httpsgithubcomapachepulsarpull11709"></a><a href="#pulsar-functions-support-protobuf-schema-pr-11709httpsgithubcomapachepulsarpull11709" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"></path></svg></a>Pulsar Functions support Protobuf schema. <a href="https://github.com/apache/pulsar/pull/11709">PR-11709</a></h3>
<p><strong>Issue</strong>: Previously, the exception <code>GeneratedMessageV3 is not assignable</code> was thrown when using a Protobuf schema.</p>
<p><strong>Resolution</strong>: Added the relevant dependencies to the Pulsar instance.</p>
<h2><a class="anchor" aria-hidden="true" id="client"></a><a href="#client" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"></path></svg></a>Client</h2>
<h3><a class="anchor" aria-hidden="true" id="partitioned-topic-consumers-clean-up-resources-after-a-failure-pr-11754httpsgithubcomapachepulsarpull11754"></a><a href="#partitioned-topic-consumers-clean-up-resources-after-a-failure-pr-11754httpsgithubcomapachepulsarpull11754" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"></path></svg></a>Partitioned-topic consumers clean up resources after a failure. <a href="https://github.com/apache/pulsar/pull/11754">PR-11754</a></h3>
<p><strong>Issue</strong>: Previously, partitioned-topic consumers did not clean up the resources when failing to create consumers. If this failure occurred with non-recoverable errors, it triggered a memory leak, which made applications unstable.</p>
<p><strong>Resolution</strong>: Closed and cleaned timer task references.</p>
<h3><a class="anchor" aria-hidden="true" id="race-conditions-do-not-occur-on-multi-topic-consumers-pr-11764httpsgithubcomapachepulsarpull11764"></a><a href="#race-conditions-do-not-occur-on-multi-topic-consumers-pr-11764httpsgithubcomapachepulsarpull11764" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"></path></svg></a>Race conditions do not occur on multi-topic consumers. <a href="https://github.com/apache/pulsar/pull/11764">PR-11764</a></h3>
<p><strong>Issue</strong>: Previously, there was a race condition between 2 threads when one of the individual consumers was in a &quot;paused&quot; state and the shared queue was full.</p>
<p><strong>Resolution</strong>: Validated the state of the shared queue after marking the consumer as &quot;paused&quot;. The consumer is not blocked if the other thread has emptied the queue in the meantime.</p>
<h3><a class="anchor" aria-hidden="true" id="consumers-are-not-blocked-on-batchreceive-pr-11691httpsgithubcomapachepulsarpull11691"></a><a href="#consumers-are-not-blocked-on-batchreceive-pr-11691httpsgithubcomapachepulsarpull11691" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"></path></svg></a>Consumers are not blocked on <code>batchReceive</code>. <a href="https://github.com/apache/pulsar/pull/11691">PR-11691</a></h3>
<p><strong>Issue</strong>: Previously, consumers were blocked when <code>Consumer.batchReceive()</code> was called concurrently by different threads due to a race condition in <code>ConsumerBase.java</code>.</p>
<p><strong>Resolution</strong>: Put <code>pinnedInternalExecutor</code> in <code>ConsumerBase</code> to allow batch timer, <code>ConsumerImpl</code>, and <code>MultiTopicsConsumerImpl</code> to submit work in a single thread.</p>
<h3><a class="anchor" aria-hidden="true" id="python-client-correctly-enables-custom-logging-pr-11882httpsgithubcomapachepulsarpull11882"></a><a href="#python-client-correctly-enables-custom-logging-pr-11882httpsgithubcomapachepulsarpull11882" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"></path></svg></a>Python client correctly enables custom logging. <a href="https://github.com/apache/pulsar/pull/11882">PR-11882</a></h3>
<p><strong>Issue</strong>: Previously, deadlock might happen when custom logging was enabled in the Python client.</p>
<p><strong>Resolution</strong>: Detached the worker thread and reduced log level.</p>
<h1><a class="anchor" aria-hidden="true" id="what-is-next"></a><a href="#what-is-next" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"></path></svg></a>What is Next?</h1>
<p>If you are interested in learning more about Pulsar 2.8.1, you can <a href="https://pulsar.apache.org/en/download/">download</a> and try it out now!</p>
<p>The first-ever Pulsar Virtual Summit Europe 2021 will take place in October. <a href="https://hopin.com/events/pulsar-summit-europe-2021">Register now</a> and help us make it an even bigger success by spreading the word on social media!</p>
<p>For more information about the Apache Pulsar project and the progress, visit
the <a href="https://pulsar.apache.org">Pulsar website</a>, follow the project on Twitter
<a href="https://twitter.com/apache_pulsar">@apache_pulsar</a>, and join <a href="https://apache-pulsar.herokuapp.com/">Pulsar Slack</a>!</p>
</span></div></article></div><div class="post"><header class="postHeader"><h1 class="postHeaderTitle"><a href="/blog/2021/08/18/asia-cfp">Announcing Pulsar Summit Asia 2021: CFP Is Open!</a></h1><p class="post-meta">August 18, 2021</p><div class="authorBlock"><p class="post-authorName"><a target="_blank" rel="noreferrer noopener">Dianjin</a></p></div></header><article class="post-content"><div><span><p>We’re proud to announce the Pulsar Summit Asia 2021!</p>
<p>2021 has been a remarkable year for the Apache Pulsar community. <a href="https://streamnative.io/en/blog/community/2021-06-14-pulsar-hits-its-400th-contributor-and-passes-kafka-in-monthly-active-contributors">Both the technology and community are growing rapidly this year</a>, and <a href="https://www.na2021.pulsar-summit.org">Pulsar Virtual Summit North America 2021</a> was a big success with 33 break-out sessions and more than 550 registrations.</p>
<p>Last year, <a href="https://pulsar-summit.org/en/event/asia-2020">Pulsar Summit Asia</a> featured more than 40 interactive sessions by tech leads, open-source developers, software engineers, and software architects from Tencent Group, BIGO, Kingsoft Cloud, Splunk, Yahoo! JAPAN, Nutanix, Dada Group, TIBCO, Huawei Cloud, and more. The conference garnered nearly 1,000 attendees around the globe mostly from Asia, including attendees from top tech, fintech and media companies.</p>
<p>Cumulatively, the Pulsar Summits drew more than 100 speakers, thousands of attendees, and hundreds of companies from diverse industries. It is a unique opportunity to network and learn about Pulsar project updates, ecosystem developments, best practices, and adoption stories.</p>
<p><strong>This year, the Pulsar Summit Asia will be hosted on November 20-21, 2021 by StreamNative. You can join us offline in Beijing for one day of Pulsar Training and one day of keynotes and breakout sessions. All the talks will be streamed live online.</strong></p>
<h1><a class="anchor" aria-hidden="true" id="cfp-details"></a><a href="#cfp-details" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"></path></svg></a>CFP Details</h1>
<p>Join us and speak at the Pulsar Summit Asia 2021!
We are looking for Pulsar stories that are innovative, informative, or thought-provoking. Here are some suggestions:</p>
<ul>
<li>Your Pulsar use case / success story</li>
<li>A technical deep dive</li>
<li>Pulsar best practices</li>
<li>Pulsar ecosystem updates</li>
</ul>
<p>To speak at the summit, please <a href="https://sessionize.com/pulsar-summit-asia-2021/">submit an abstract</a> about your presentation. Remember to keep your proposal short, relevant and engaging.</p>
<h1><a class="anchor" aria-hidden="true" id="first-time-speakers-welcomed"></a><a href="#first-time-speakers-welcomed" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"></path></svg></a>First-time Speakers Welcomed!</h1>
<p>First time submitting? Don't feel intimidated. We strongly encourage first-time speakers to submit talks for the Pulsar Summit Asia 2021. If your submission is similar to a previous talk in the past Pulsar Summits, please include information on how this version will be different. We hope to see some exciting updates on the topic.</p>
<p>We welcome submissions from around the globe. Our hybrid conference model has taken time differences into consideration. After your talk is accepted, we will schedule the sessions and send you the presentation options.</p>
<h1><a class="anchor" aria-hidden="true" id="speaker-benefits"></a><a href="#speaker-benefits" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"></path></svg></a>Speaker Benefits</h1>
<p>As a speaker, you will receive:</p>
<ul>
<li>The chance to demonstrate your experience and deep knowledge in the rapidly growing event streaming space.</li>
<li>Your name, title, company, and bio will be featured on the Pulsar Summit Asia 2021 website.</li>
<li>Your session will be added to the Pulsar Summit YouTube Channel and promoted on Twitter, LinkedIn, and WeChat.</li>
<li>A professionally produced video of your presentation.
Exclusive Pulsar swag only available to the speakers.</li>
</ul>
<h1><a class="anchor" aria-hidden="true" id="important-dates"></a><a href="#important-dates" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"></path></svg></a>Important Dates</h1>
<ul>
<li>CFP opens: August 18th, 2021</li>
<li>CFP closes: September 8th, 2021</li>
<li>Speaker notifications: September 22th, 2021</li>
<li>Schedule announcement: October 13th, 2021</li>
</ul>
<p>Submissions are open until September 8th. If you want some advice or feedback on your proposal, or have any questions about the summit, please do not hesitate to contact us at <a href="mailto:organizers@pulsar-summit.org">organizers@pulsar-summit.org</a>. We are happy to help!</p>
<h1><a class="anchor" aria-hidden="true" id="sponsor-pulsar-summit-asia"></a><a href="#sponsor-pulsar-summit-asia" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"></path></svg></a>Sponsor Pulsar Summit Asia</h1>
<p>Pulsar Summit is a conference for the community and sponsorship is needed. Sponsoring this event provides a great opportunity for your organization to further engage with the Apache Pulsar community. Contact us at <a href="mailto:organizers@pulsar-summit.org">organizers@pulsar-summit.org</a> to learn more.</p>
<p>Help us make Pulsar Summit Asia 2021 a big success by spreading the word and submitting your proposal! Follow Pulsar Summit on <a href="https://twitter.com/PulsarSummit">Twitter</a> to receive the latest updates of the conference.</p>
</span></div></article></div><div class="post"><header class="postHeader"><h1 class="postHeaderTitle"><a href="/blog/2021/08/11/Apache-Pulsar-2-7-3">Apache Pulsar 2.7.3</a></h1><p class="post-meta">August 11, 2021</p><div class="authorBlock"><p class="post-authorName"><a target="_blank" rel="noreferrer noopener">Bo Cong, Anonymitaet</a></p></div></header><article class="post-content"><div><span><h1><a class="anchor" aria-hidden="true" id="whats-new-in-apache-pulsar-273"></a><a href="#whats-new-in-apache-pulsar-273" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"></path></svg></a>What’s New in Apache Pulsar 2.7.3</h1>
<p>The Apache Pulsar community releases version 2.7.3! 34 contributors provided improvements and bug fixes that delivered 79 commits.</p>
<h2><a class="anchor" aria-hidden="true" id="highlights"></a><a href="#highlights" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"></path></svg></a>Highlights</h2>
<ul>
<li><p>Cursor reads adhere to the dispatch byte rate limiter setting and no longer cause unexpected results. <a href="https://github.com/apache/pulsar/pull/11249">PR-11249</a></p></li>
<li><p>The ledger rollover scheduled task runs as expected. <a href="https://github.com/apache/pulsar/pull/11226">PR-11226</a></p></li>
</ul>
<p>This blog walks through the most noteworthy changes. For the complete list including all enhancements and bug fixes, check out the <a href="https://pulsar.apache.org/release-notes/#273-mdash-2021-07-27-a-id273a">Pulsar 2.7.3 Release Notes</a>.</p>
<h1><a class="anchor" aria-hidden="true" id="notable-bug-fixes-and-enhancements"></a><a href="#notable-bug-fixes-and-enhancements" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"></path></svg></a>Notable bug fixes and enhancements</h1>
<h2><a class="anchor" aria-hidden="true" id="broker"></a><a href="#broker" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"></path></svg></a>Broker</h2>
<h3><a class="anchor" aria-hidden="true" id="cursor-reads-adhere-to-the-dispatch-byte-rate-limiter-setting-pr-9826httpsgithubcomapachepulsarpull9826"></a><a href="#cursor-reads-adhere-to-the-dispatch-byte-rate-limiter-setting-pr-9826httpsgithubcomapachepulsarpull9826" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"></path></svg></a>Cursor reads adhere to the dispatch byte rate limiter setting. <a href="https://github.com/apache/pulsar/pull/9826">PR-9826</a></h3>
<ul>
<li><p><strong>Issue</strong>: When using byte rates, the dispatch rates were not respected (regardless
of being a namespace or topic policy).</p></li>
<li><p><strong>Resolution</strong>: Fixed behavior of dispatch byte rate limiter setting. Cursor reads adhere to the setting and no longer cause unexpected results.</p></li>
</ul>
<h3><a class="anchor" aria-hidden="true" id="the-ledger-rollover-scheduled-task-runs-as-expected-pr-11226httpsgithubcomapachepulsarpull11226"></a><a href="#the-ledger-rollover-scheduled-task-runs-as-expected-pr-11226httpsgithubcomapachepulsarpull11226" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"></path></svg></a>The ledger rollover scheduled task runs as expected. <a href="https://github.com/apache/pulsar/pull/11226">PR-11226</a></h3>
<ul>
<li><p><strong>Issue</strong>: Previously, the ledger rollover scheduled task was executed before reaching the ledger maximum rollover time, which caused the ledger not to roll over in time.</p></li>
<li><p><strong>Resolution</strong>: Fixed the timing of the ledger rollover schedule, so the task runs only after the ledger is created successfully.</p></li>
</ul>
<h3><a class="anchor" aria-hidden="true" id="the-topic-level-retention-policy-works-correctly-when-restarting-a-broker-pr-11136httpsgithubcomapachepulsarpull11136"></a><a href="#the-topic-level-retention-policy-works-correctly-when-restarting-a-broker-pr-11136httpsgithubcomapachepulsarpull11136" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"></path></svg></a>The topic-level retention policy works correctly when restarting a broker. <a href="https://github.com/apache/pulsar/pull/11136">PR-11136</a></h3>
<ul>
<li><p><strong>Issue</strong>: Previously, when setting a topic-level retention policy for a topic and then restarting the broker, the topic-level retention policy did not work.</p></li>
<li><p><strong>Resolution</strong>: Fixed behavior of the policy so it replays all policy messages after initiating <code>policyCacheInitMap</code> and added a retention policy check test when restarting the broker.</p></li>
</ul>
<h3><a class="anchor" aria-hidden="true" id="the-lastmessageid-api-call-no-longer-causes-a-memory-leak-pr-10977httpsgithubcomapachepulsarpull10977"></a><a href="#the-lastmessageid-api-call-no-longer-causes-a-memory-leak-pr-10977httpsgithubcomapachepulsarpull10977" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"></path></svg></a>The lastMessageId API call no longer causes a memory leak. <a href="https://github.com/apache/pulsar/pull/10977">PR-10977</a></h3>
<ul>
<li><p><strong>Issue</strong>: Previously, there was a memory leak when calling the <code>lastMessageId</code> API, which caused the broker process to be stopped by Kubernetes.</p></li>
<li><p><strong>Resolution</strong>: Added the missing entry.release() call to PersistentTopic.getLastMessageId to ensure the broker does not run out of memory.</p></li>
</ul>
<h3><a class="anchor" aria-hidden="true" id="zookeeper-reads-are-cached-by-brokers-pr-10594httpsgithubcomapachepulsarpull10594"></a><a href="#zookeeper-reads-are-cached-by-brokers-pr-10594httpsgithubcomapachepulsarpull10594" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"></path></svg></a>ZooKeeper reads are cached by brokers. <a href="https://github.com/apache/pulsar/pull/10594">PR-10594</a></h3>
<ul>
<li><p><strong>Issue</strong>: When performing the admin operation to get the namespace of a tenant, ZooKeeper reads were issued on the ZooKeeper client and not getting cached by the brokers.</p></li>
<li><p><strong>Resolution</strong>: Fixed ZooKeeper caching when fetching a list of namespaces for a tenant.</p></li>
</ul>
<h3><a class="anchor" aria-hidden="true" id="monitoring-threads-that-call-leaderserviceisleader-are-no-longer-blocked-pr-10512httpsgithubcomapachepulsarpull10512"></a><a href="#monitoring-threads-that-call-leaderserviceisleader-are-no-longer-blocked-pr-10512httpsgithubcomapachepulsarpull10512" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"></path></svg></a>Monitoring threads that call <code>LeaderService.isLeader()</code> are no longer blocked. <a href="https://github.com/apache/pulsar/pull/10512">PR-10512</a></h3>
<ul>
<li><p><strong>Issue</strong>: When <code>LeaderService</code> changed leadership status, it was locked with a <code>synchronized</code> block, which also blocked other threads calling <code>LeaderService.isLeader()</code>.</p></li>
<li><p><strong>Resolution</strong>: Fixed the deadlock condition on the monitoring thread so it is not blocked by <code>LeaderService.isLeader() by modifying</code>ClusterServiceCoordinator<code>and</code>WorkerStatsManager<code>to check if it is a leader from</code>MembershipManager`.</p></li>
</ul>
<h3><a class="anchor" aria-hidden="true" id="hasmessageavailable-can-read-messages-successfully-pr-10414httpsgithubcomapachepulsarpull10414"></a><a href="#hasmessageavailable-can-read-messages-successfully-pr-10414httpsgithubcomapachepulsarpull10414" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"></path></svg></a><code>hasMessageAvailable</code> can read messages successfully. <a href="https://github.com/apache/pulsar/pull/10414">PR-10414</a></h3>
<ul>
<li><p><strong>Issue</strong>: When <code>hasMessageAvailableAsync</code> returned <code>true</code>, it could not read messages because messages were filtered by <code>acknowledgmentsGroupingTracker</code>.</p></li>
<li><p><strong>Resolution</strong>: Fixed the race conditions by modifying <code>acknowledgmentsGroupingTracker</code> to filter duplicate messages, and then cleanup the messages when the connection is open.</p></li>
</ul>
<h2><a class="anchor" aria-hidden="true" id="proxy"></a><a href="#proxy" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"></path></svg></a>Proxy</h2>
<h3><a class="anchor" aria-hidden="true" id="proxy-supports-creating-partitioned-topics-automatically-pr-8048httpsgithubcomapachepulsarpull8048"></a><a href="#proxy-supports-creating-partitioned-topics-automatically-pr-8048httpsgithubcomapachepulsarpull8048" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"></path></svg></a>Proxy supports creating partitioned topics automatically. <a href="https://github.com/apache/pulsar/pull/8048">PR-8048</a></h3>
<ul>
<li><p><strong>Issue</strong>: Proxies were not creating partitions because they were using the current ZooKeeper metadata.</p></li>
<li><p><strong>Resolution</strong>: Changed the proxy to handle <code>PartitionMetadataRequest</code> by selecting and fetching from an available broker instead of using current ZooKeeper metadata.</p></li>
</ul>
<h2><a class="anchor" aria-hidden="true" id="pulsar-admin"></a><a href="#pulsar-admin" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"></path></svg></a>Pulsar admin</h2>
<h3><a class="anchor" aria-hidden="true" id="flag-added-to-indicate-whether-or-not-to-create-a-metadata-path-on-replicated-clusters-pr-11140httpsgithubcomapachepulsarpull11140"></a><a href="#flag-added-to-indicate-whether-or-not-to-create-a-metadata-path-on-replicated-clusters-pr-11140httpsgithubcomapachepulsarpull11140" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"></path></svg></a>Flag added to indicate whether or not to create a metadata path on replicated clusters. <a href="https://github.com/apache/pulsar/pull/11140">PR-11140</a></h3>
<ul>
<li><p><strong>Issue</strong>: When creating a partitioned topic in a replicated namespace, it did not
create a metadata path <code>/managed-ledgers</code> on replicated clusters.</p></li>
<li><p><strong>Resolution</strong>: Added a flag (createLocalTopicOnly) to indicate whether or not to create a metadata path for a partitioned topic in replicated clusters.</p></li>
</ul>
<h3><a class="anchor" aria-hidden="true" id="a-topic-policy-can-no-longer-be-set-for-a-non-existent-topic-pr-11131httpsgithubcomapachepulsarpull11131"></a><a href="#a-topic-policy-can-no-longer-be-set-for-a-non-existent-topic-pr-11131httpsgithubcomapachepulsarpull11131" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"></path></svg></a>A topic policy can no longer be set for a non-existent topic. <a href="https://github.com/apache/pulsar/pull/11131">PR-11131</a></h3>
<ul>
<li><p><strong>Issue</strong>: Due to a redirect loop in a topic policy, you can set a policy for a non-existing topic or a partition of a partitioned topic.</p></li>
<li><p><strong>Resolution</strong>: The fix added an authoritative flag for a topic policy to avoid a redirect loop. You can not set a topic policy for a non-existent topic or a partition of a partitioned topic. If you set a topic policy for a partition of a 0-partition topic, it redirects to the broker.</p></li>
</ul>
<h3><a class="anchor" aria-hidden="true" id="discovery-service-no-longer-hard-codes-the-topic-domain-as-persistent-pr-10806httpsgithubcomapachepulsarpull10806"></a><a href="#discovery-service-no-longer-hard-codes-the-topic-domain-as-persistent-pr-10806httpsgithubcomapachepulsarpull10806" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"></path></svg></a>Discovery service no longer hard codes the topic domain as persistent. <a href="https://github.com/apache/pulsar/pull/10806">PR-10806</a></h3>
<ul>
<li><p><strong>Issue</strong>: When using the lookup discovery service for a partitioned non-persistent topic, it returned zero rather than the number of partitions. The Pulsar client tried to connect to the topic as if it were a normal topic.</p></li>
<li><p><strong>Resolution</strong>: Implemented <code>topicName.getDomain().value()</code> rather than hard coding <code>persistent.</code> Now you can use the discovery service for a partitioned, non-persistent topic successfully.</p></li>
</ul>
<h3><a class="anchor" aria-hidden="true" id="other-connectors-can-now-use-the-kinesis-backoff-class-pr-10744httpsgithubcomapachepulsarpull10744"></a><a href="#other-connectors-can-now-use-the-kinesis-backoff-class-pr-10744httpsgithubcomapachepulsarpull10744" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"></path></svg></a>Other connectors can now use the Kinesis <code>Backoff</code> class. <a href="https://github.com/apache/pulsar/pull/10744">PR-10744</a></h3>
<ul>
<li><p><strong>Issue</strong>: The Kinesis sink connector <code>Backoff</code> class in the Pulsar client implementation project in combination with the dependency <code>org.apache.pulsar:pulsar-client-original</code> increased the connector size.</p></li>
<li><p><strong>Resolution</strong>: Added a new class <code>Backoff</code> in the function io-core project so that the Kinesis sink connector and other connectors can use the class.</p></li>
</ul>
<h2><a class="anchor" aria-hidden="true" id="client"></a><a href="#client" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"></path></svg></a>Client</h2>
<h3><a class="anchor" aria-hidden="true" id="a-flow-request-with-zero-permits-can-not-be-sent-pr-10506httpsgithubcomapachepulsarpull10506"></a><a href="#a-flow-request-with-zero-permits-can-not-be-sent-pr-10506httpsgithubcomapachepulsarpull10506" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"></path></svg></a>A <code>FLOW</code> request with zero permits can not be sent. <a href="https://github.com/apache/pulsar/pull/10506">PR-10506</a></h3>
<ul>
<li><p><strong>Issue</strong>: When a broker received a <code>FLOW</code> request with zero permits, an exception was thrown and then the connection was closed. This triggered frequent reconnections and caused duplicate or out-of-order messages.</p></li>
<li><p><strong>Resolution</strong>: Added a validation that verifies the permits of a <code>FLOW</code> request before sending it. If the permit is zero, the <code>FLOW</code> request can not be sent.</p></li>
</ul>
<h2><a class="anchor" aria-hidden="true" id="function-and-connector"></a><a href="#function-and-connector" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"></path></svg></a>Function and connector</h2>
<h3><a class="anchor" aria-hidden="true" id="the-kinesis-sink-connector-acknowledges-successful-messages-pr-10769httpsgithubcomapachepulsarpull10769"></a><a href="#the-kinesis-sink-connector-acknowledges-successful-messages-pr-10769httpsgithubcomapachepulsarpull10769" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"></path></svg></a>The Kinesis sink connector acknowledges successful messages. <a href="https://github.com/apache/pulsar/pull/10769">PR-10769</a></h3>
<ul>
<li><p><strong>Issue</strong>: The Kinesis sink connector did not acknowledge messages after they were sent successfully.</p></li>
<li><p><strong>Resolution</strong>: Added acknowledgement for the Kinesis sink connector once a message is sent successfully.</p></li>
</ul>
<h2><a class="anchor" aria-hidden="true" id="docker"></a><a href="#docker" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"></path></svg></a>Docker</h2>
<h3><a class="anchor" aria-hidden="true" id="function-name-length-cannot-exceed-52-characters-when-using-kubernetes-runtime-pr-10531httpsgithubcomapachepulsarpull10531"></a><a href="#function-name-length-cannot-exceed-52-characters-when-using-kubernetes-runtime-pr-10531httpsgithubcomapachepulsarpull10531" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"></path></svg></a>Function name length cannot exceed 52 characters when using Kubernetes runtime. <a href="https://github.com/apache/pulsar/pull/10531">PR-10531</a></h3>
<ul>
<li><p><strong>Issue</strong>: When using Kubernetes runtime, if a function was submitted with a valid length (less than 55 characters), a StatefulSet was created but it was unable to spawn pods.</p></li>
<li><p><strong>Resolution</strong>: Changed the maximum length of a function name from 55 to 53 characters for Kubernetes runtime. With this fix, the length of a function name can not exceed 52 characters.</p></li>
</ul>
<h2><a class="anchor" aria-hidden="true" id="dependency"></a><a href="#dependency" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"></path></svg></a>Dependency</h2>
<h3><a class="anchor" aria-hidden="true" id="pulsar-admin-connection-to-proxy-is-stable-when-tls-is-enabled-pr-10907httpsgithubcomapachepulsarpull10907"></a><a href="#pulsar-admin-connection-to-proxy-is-stable-when-tls-is-enabled-pr-10907httpsgithubcomapachepulsarpull10907" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"></path></svg></a><code>pulsar-admin</code> connection to proxy is stable when TLS is enabled. <a href="https://github.com/apache/pulsar/pull/10907">PR-10907</a></h3>
<ul>
<li><p><strong>Issue</strong>: <code>pulsar-admin</code> was unstable over the TLS connection because of the Jetty bug in SSL buffering introduced in Jetty 9.4.39. It caused large function jar uploads to fail frequently.</p></li>
<li><p><strong>Resolution</strong>: Upgraded Jetty to 9.4.42.v20210604, so that <code>pulsar-admin</code> connection to proxy is stable when TLS is enabled.</p></li>
</ul>
<h1><a class="anchor" aria-hidden="true" id="what-is-next"></a><a href="#what-is-next" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"></path></svg></a>What is Next?</h1>
<p>If you are interested in learning more about Pulsar 2.7.3, you can <a href="https://pulsar.apache.org/en/versions/">download 2.7.3</a> and try it out now!</p>
<p>The first-ever Pulsar Virtual Summit Europe 2021 will take place in October. <a href="https://hopin.com/events/pulsar-summit-europe-2021">Register now</a> and help us make it an even bigger success by spreading the word on social!</p>
<p>For more information about the Apache Pulsar project and the progress, visit
the <a href="https://pulsar.apache.org">Pulsar website</a>, follow the project on Twitter
<a href="https://twitter.com/apache_pulsar">@apache_pulsar</a>, and join <a href="https://apache-pulsar.herokuapp.com/">Pulsar Slack</a>!</p>
</span></div></article></div><div class="post"><header class="postHeader"><h1 class="postHeaderTitle"><a href="/blog/2021/06/12/Apache-Pulsar-2-8-0">Apache Pulsar 2.8.0</a></h1><p class="post-meta">June 12, 2021</p><div class="authorBlock"><p class="post-authorName"><a target="_blank" rel="noreferrer noopener">Matteo Merli, Sijie Guo</a></p></div></header><article class="post-content"><div><span><h1><a class="anchor" aria-hidden="true" id="an-overview-of-the-280-release"></a><a href="#an-overview-of-the-280-release" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"></path></svg></a>An Overview of the 2.8.0 Release</h1>
<p>We are very glad to see the Apache Pulsar community has successfully released the 2.8.0 version, which includes a number of exciting upgrades and enhancements. This blog provides a deep dive into the updates from the 2.8.0 release as well as a detailed look at the major Pulsar developments that have helped it evolve into the unified messaging and streaming platform it is today.</p>
<p>Note: The Pulsar community typically releases a major release every 3 months, but it has been 6 months since the release of 2.7.0. We spent more time on 2.8.0 in order to make the transaction API generally available to the Pulsar community.</p>
<h1><a class="anchor" aria-hidden="true" id="release-28-overview"></a><a href="#release-28-overview" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"></path></svg></a>Release 2.8 Overview</h1>
<p>The key features and updates in this release are:</p>
<ul>
<li>Exclusive Producer</li>
<li>Package Management API</li>
<li>Simplified Client Memory Limit Settings</li>
<li>Broker Entry Metadata</li>
<li>New Protobuf Code Generator</li>
<li>Transactions</li>
</ul>
<h2><a class="anchor" aria-hidden="true" id="exclusive-producer"></a><a href="#exclusive-producer" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"></path></svg></a>Exclusive Producer</h2>
<p>By default, the Pulsar producer API provides a “multi-writer” semantic to append messages to a topic. However, there are several use cases that require exclusive access for a single writer, such as ensuring a linear non-interleaved history of messages or providing a mechanism for leader election.</p>
<p>This new feature allows applications to require exclusive producer access in order to achieve a “single-writer” situation. It guarantees that there should be 1 single writer in any combination of errors. If the producer loses its exclusive access, no more messages from it can be published on the topic.</p>
<p>One use case for this feature is the metadata controller in Pulsar Functions. In order to write a single linear history of all the functions metadata updates, the metadata controller requires to elect one leader and that all the “decisions” made by this leader be written on the metadata topic. By leveraging the exclusive producer feature, Pulsar guarantees that the metadata topic contains different segments of updates, one per each successive leader, and there is no interleaving across different leaders. See “<a href="https://github.com/apache/pulsar/wiki/PIP-68%3A-Exclusive-Producer">PIP-68: Exclusive Producer</a>” for more details.</p>
<h2><a class="anchor" aria-hidden="true" id="package-management-api"></a><a href="#package-management-api" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"></path></svg></a>Package Management API</h2>
<p>Since its introduction in version 2.0, the Functions API has become hugely popular among Pulsar users. While it offers many benefits, there are a number of ways to improve the user experience. For example, today, if a function is deployed multiple times, the function package ends up being uploaded multiple times. Also, there is no version management in Pulsar for Functions and IO connectors. The newly introduced package management API provides an easier way to manage the packages for Functions and IO connectors and significantly simplifies the upgrade and rollback processes. Read “<a href="http://pulsar.apache.org/docs/en/admin-api-packages/">Package Management API</a>” for more details.</p>
<h2><a class="anchor" aria-hidden="true" id="simplified-client-memory-limit-settings"></a><a href="#simplified-client-memory-limit-settings" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"></path></svg></a>Simplified Client Memory Limit Settings</h2>
<p>Prior to 2.8, there are multiple settings in producers and consumers that allow controlling the sizes of the internal message queues. These settings ultimately control the amount of memory the Pulsar client uses. However, there are few issues with this approach that make it complicated to select an overall configuration that controls the total usage of memory.</p>
<p>For example, the settings are based on the “number of messages”, so the expected message size must be adjusted per producer or consumer. If an application has a large (or unknown) number of producers or consumers, it’s very difficult to select an appropriate value for queue sizes. The same is true for topics that have many partitions.</p>
<p>In 2.8, we introduced a new API to set the memory limit. This single <code>memoryLimit</code> setting specifies a maximum amount of memory on a given Pulsar client. The producers and consumers compete for the memory assigned. It ensures the memory used by the Pulsar client will not go beyond the set limit. Read “<a href="https://github.com/apache/pulsar/wiki/PIP-74%3A-Pulsar-client-memory-limits">PIP-74: Pulsar client memory limits</a>” for more details.</p>
<h2><a class="anchor" aria-hidden="true" id="broker-entry-metadata"></a><a href="#broker-entry-metadata" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"></path></svg></a>Broker Entry Metadata</h2>
<p>Pulsar messages define a very comprehensive set of metadata properties. However, to add a new property, the <code>MessageMetadata</code> definition in Pulsar protocol must change to inform both broker and client of the newly introduced property.</p>
<p>But in certain cases, this metadata property might need to be added from the broker side, or need to be retrieved by the broker at a very low cost. To prevent deserializing these properties from the message metadata, we introduced “Broker Entry Metadata” in 2.8.0 to provide a lightweight approach to add additional metadata properties without serializing and deserializing the protobuf-encoded <code>MessageMetadata</code>.</p>
<p>This feature unblocks a new set of capabilities for Pulsar. For example, we can leverage broker entry metadata to generate broker publish time for the messages appended to the Pulsar topic. The other example is to generate a monotonically increasing sequence-id for messages produced to a Pulsar topic. We use this feature in Kafka-on-Pulsar to implement Kafka offset.</p>
<h2><a class="anchor" aria-hidden="true" id="new-protobuf-code-generator"></a><a href="#new-protobuf-code-generator" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"></path></svg></a>New Protobuf Code Generator</h2>
<p>Pulsar uses Google Protobuf in order to perform serialization and deserialization of the commands that are exchanged between clients and brokers. Because of the overhead involved with the regular Protobuf implementation, we have been using a modified version of Protobuf 2.4.1. The modifications were done to ensure a more efficient serialization code that used thread local cache for the objects used in the process.</p>
<p>This approach introduced a few issues. For example, the patch to the Protobuf code generator is only based on Protobuf version 2.4.1 and cannot be upgraded to the newer Protobuf versions. In 2.8, we switched the patched Protobuf 2.4.1 to Splunk LightProto as the code generator. The new code generator generates the fastest possible Java code for Protobuf SerDe, is 100% compatible with proto2 definition and wire protocol, and provides zero-copy deserialization using Netty ByteBuf.</p>
<h2><a class="anchor" aria-hidden="true" id="transactions"></a><a href="#transactions" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"></path></svg></a>Transactions</h2>
<p>Prior to Pulsar 2.8, Pulsar only supported exactly-once semantics on single topic through Idempotent Producer. While powerful, Idempotent producer only solves a narrow scope of challenges for exactly-once semantics. For example, there is no <code>atomicity</code> when a producer attempts to produce messages to multiple topics. A publish error can occur when the broker serving one of the topics crashes. If the producer doesn’t retry publishing the message again, it results in some messages being persisted once and others being lost. If the producer retries, it results in some messages being persisted multiple times.</p>
<p>In order to address the remaining challenges described above, we’ve strengthened the Pulsar’s delivery semantics by introducing a Pulsar Transaction API to support atomic writes and acknowledgements across multiple topics. The addition of the Transaction API to Apache Pulsar completes our vision of making Pulsar a complete unified messaging and streaming platform.</p>
<p>Pulsar PMC member, Penghui Li, goes over this functionality in great detail in his recent blog, Exactly-once Semantics with Transactions in Pulsar. You can read it to learn more about the <a href="https://streamnative.io/en/blog/release/2021-06-14-exactly-once-semantics-with-transactions-in-pulsar">exactly-once semantics support in Pulsar</a>.</p>
<h1><a class="anchor" aria-hidden="true" id="building-a-unified-messaging-and-streaming-platform-with-apache-pulsar"></a><a href="#building-a-unified-messaging-and-streaming-platform-with-apache-pulsar" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"></path></svg></a>Building a Unified Messaging and Streaming Platform with Apache Pulsar</h1>
<h2><a class="anchor" aria-hidden="true" id="the-evolution-of-apache-pulsar"></a><a href="#the-evolution-of-apache-pulsar" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"></path></svg></a>The Evolution of Apache Pulsar</h2>
<p>Apache Pulsar is widely adopted by hundreds of companies across the globe, including Splunk, Tencent, Verizon, and Yahoo! JAPAN, just to name a few. Born as a cloud-native distributed messaging system, Apache Pulsar has evolved into a complete messaging and streaming platform for publishing and subscribing, storing, and processing streams of data at scale and in real-time.</p>
<p>Back in 2012 the Yahoo! team was looking for a global, geo-replicated infrastructure that could manage all of Yahoo!’s messaging data. After vetting the messaging and streaming landscape it became clear that existing technologies were not able to serve the need for an event-driven organization. As a result, the team at Yahoo! set out to build its own.</p>
<p>At the time, there were generally two types of systems to handle in-motion data: message queues that handled mission-critical business events in real-time, and streaming systems that handled scalable data pipelines at scale. Companies had to limit their capabilities to one or the other, or they had to adopt multiple different technologies. If they chose multiple technologies, they would end up with a complex infrastructure that often resulted in data segregation and data silos, with one silo for message queues used to build application services and the other silo for streaming systems used to build data services. The figure below illustrates what this can look like.</p>
<p><img src="../img/280-1.png" alt=""></p>
<p>However, with the diversity of data that companies need to process beyond operational data (like log data, click events, etc), coupled with the increase in the number of downstream systems that need access to combined business data and operational data, the system would need to support message queueing and streaming.</p>
<p>Beyond that, companies need an infrastructure platform that would allow them to build all of their applications on top of it, and then have those applications handle in-motion data (messaging and streaming data) by default. This way real-time data infrastructure could be significantly simplified, as illustrated in the diagram below.</p>
<p><img src="../img/280-2.png" alt=""></p>
<p>With that vision, the Yahoo! team started working on building a unified messaging and streaming platform for in-motion data. Below is an overview of the key milestones on the Pulsar journey, from inception to today.</p>
<h2><a class="anchor" aria-hidden="true" id="step-1-a-scalable-storage-for-streams-of-data"></a><a href="#step-1-a-scalable-storage-for-streams-of-data" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"></path></svg></a>Step 1: A scalable storage for streams of data</h2>
<p>The journey of Pulsar began with Apache BookKeeper. Apache BookKeeper implements a log-like abstraction for continuous streams and provides the ability to run it at internet-scale with simple write-read log APIs. A log provides a great abstraction for building distributed systems, such as distributed databases and pub-sub messaging. The write APIs are in the form of appends to the log. And the read APIs are in the form of continuous read from a starting offset defined by the readers. The implementation of BookKeeper created the foundation - a scalable log-backed messaging and streaming system.</p>
<h2><a class="anchor" aria-hidden="true" id="step-2-a-multi-layered-architecture-that-separates-compute-from-storage"></a><a href="#step-2-a-multi-layered-architecture-that-separates-compute-from-storage" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"></path></svg></a>Step 2: A multi-layered architecture that separates compute from storage.</h2>
<p>On top of the scalable log storage, a stateless serving layer was introduced which runs stateless brokers for publishing and consuming messages. This multi-layered architecture separates serving/compute from storage, allowing Pulsar to manage serving and storage in separate layers.</p>
<p>This architecture also ensures instant scalability and higher availability. Both of these factors are extremely important and make Pulsar well-suited for building mission-critical services, such as billing platforms for financial use cases, transaction processing systems for e-commerce and retailers, and real-time risk control systems for financial institutions.</p>
<h2><a class="anchor" aria-hidden="true" id="step-3-unified-messaging-model-and-api"></a><a href="#step-3-unified-messaging-model-and-api" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"></path></svg></a>Step 3: Unified messaging model and API</h2>
<p>In a modern data architecture, the real-time use cases can typically be categorized into two categories: queueing and streaming. Queueing is typically used for building core business application services while streaming is typically used for building real-time data services such as data pipelines.</p>
<p>To provide one platform able to serve both application and data services required a unified messaging model that integrates queuing and streaming semantics. The Pulsar topics become the source of truth for consumption. Messages can be stored only once on topics, but can be consumed in different ways via different subscriptions. Such unification significantly reduces the complexity of managing and developing messaging and streaming applications.</p>
<h2><a class="anchor" aria-hidden="true" id="step-4-schema-api"></a><a href="#step-4-schema-api" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"></path></svg></a>Step 4: Schema API</h2>
<p>Next, a new Pulsar schema registry and a new type-safe producer &amp; consumer API were added. The built-in schema registry enables message producers and consumers on Pulsar topics to coordinate on the structure of the topic’s data through the Pulsar broker itself, without needing an external coordination mechanism. With data schemas, every single piece of data traveling through Pulsar is completely discoverable, enabling you to build systems that can easily adapt as the data changes.</p>
<p>Furthermore, the schema registry keeps track of data compatibility between versions of the schema. As the new schemas are uploaded the registry ensures that new schema versions are able to be read by old consumers. This ensures that Producers cannot break Consumers.</p>
<h2><a class="anchor" aria-hidden="true" id="step-5-functions-and-io-api"></a><a href="#step-5-functions-and-io-api" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"></path></svg></a>Step 5: Functions and IO API</h2>
<p>The next step was to build APIs that made it easy to get data in and out of Pulsar and process it. The goal was to make it easy to build event-driven applications and real-time data pipelines with Apache Pulsar, so you can then process those events when they arrive, no matter where they originated from.</p>
<p>The Pulsar IO API allows you to build real-time streaming data pipelines by plugging various source connectors to get data from external systems into Pulsar and sink connectors to get data from Pulsar into external systems. Today, Pulsar provides several built-in connectors that you can use.</p>
<p>Additionally, StreamNative Hub (a registry of Pulsar connectors) provides dozens of connectors integrated with popular data systems. If the IO API is for building streaming data pipelines, the Functions API is for building event-driven applications and real-time stream processors.</p>
<p>The serverless function concepts were adopted into stream processing and then built the Functions API as a lightweight serverless library that you can write any event processing logic using any language you like. The underlying motivation was to enable your engineering team to write stream processing logic without the operational complexity of running and maintaining yet another cluster.</p>
<h2><a class="anchor" aria-hidden="true" id="step-6-infinite-storage-for-pulsar-via-tiered-storage"></a><a href="#step-6-infinite-storage-for-pulsar-via-tiered-storage" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"></path></svg></a>Step 6: Infinite storage for Pulsar via Tiered Storage</h2>
<p>As adoption of Apache Pulsar continued and the amount of data stored in Pulsar increased, users eventually hit a “retention cliff”, at which point it became significantly more expensive to store, manage, and retrieve data in Apache BookKeeper. To work around this, operators and application developers typically use an external store like AWS S3 as a sink for long-term storage. This means you lose most of the benefits of Pulsar’s immutable stream and ordering semantics, and instead end up having to manage two different systems with different access patterns.</p>
<p>The introduction of Tiered Storage allows Pulsar to offload the majority of the data to a remote cloud-native storage. This cheaper form of storage readily scales with the volume of data. More importantly, with the addition of Tiered Storage, Pulsar provides the batch storage capabilities needed to support batch processing when integrating with a unified batch and stream processor like Flink. The unified batch and stream processing capabilities integrated with Pulsar enable companies to query real-time streams with historical context quickly and easily, unlocking a unique competitive advantage.</p>
<h2><a class="anchor" aria-hidden="true" id="step-7-protocol-handler"></a><a href="#step-7-protocol-handler" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"></path></svg></a>Step 7: Protocol Handler</h2>
<p>After introducing tiered storage, Pulsar evolved from a Pub/Sub messaging system into a scalable stream data system that can ingest, store, and process streams of data. However, existing applications written using other messaging protocols such as Kafka, AMQP, MQTT, etc had to be rewritten to adopt Pulsar’s messaging protocol.</p>
<p>The Protocol Handler API further reduces the overhead of adopting Pulsar for building messaging and streaming applications, and allows developers to extend Pulsar capabilities to other messaging domains by leveraging all the benefits provided by Pulsar architecture. This resulted in major collaborations between Pulsar and other industry leaders to develop popular protocol handlers including:</p>
<ul>
<li><a href="https://hub.streamnative.io/protocol-handlers/kop/0.2.0">Kafka-on-Pulsar (KoP)</a>, which was <a href="https://streamnative.io/en/blog/tech/2020-03-24-bring-native-kafka-protocol-support-to-apache-pulsar">launched in March 2020</a> by OVHCloud and StreamNative.</li>
<li><a href="https://hub.streamnative.io/protocol-handlers/aop/0.1.0">AMQP-on-Pulsar (AoP)</a>, which was <a href="https://streamnative.io/en/blog/tech/2020-06-15-announcing-aop-on-pulsar">announced in June 2020</a> by China Mobile and StreamNative.</li>
<li><a href="https://hub.streamnative.io/protocol-handlers/mop/0.2.0">MQTT-on-Pulsar (MoP)</a>, which was <a href="https://streamnative.io/en/blog/tech/2020-09-28-announcing-mqtt-on-pulsar">announced in August 2020</a> by StreamNative.</li>
<li><a href="https://github.com/streamnative/rop">RocketMQ-on-Pulsar (RoP)</a>, which was launched in May 2021 by Tencent Cloud and StreamNative.</li>
</ul>
<h2><a class="anchor" aria-hidden="true" id="step-8-transaction-api-for-exactly-once-stream-processing"></a><a href="#step-8-transaction-api-for-exactly-once-stream-processing" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"></path></svg></a>Step 8: Transaction API for exactly-once stream processing</h2>
<p>More recently, transactions were added to Apache Pulsar to enable exactly-once semantics for stream processing. This is a fundamental feature that provides a strong guarantee for streaming data transformations, making it easy to build scalable, fault-tolerant, stateful messaging and streaming applications that process streams of data.</p>
<p>Furthermore, the transaction API capabilities are not limited to a given language client. Pulsar’s support for transactional messaging and streaming is primarily a protocol-level capability that can be presented in any language. Such protocol-level capability can be leveraged in all kinds of applications.</p>
<h1><a class="anchor" aria-hidden="true" id="building-an-ecosystem-for-unified-messaging-and-streaming"></a><a href="#building-an-ecosystem-for-unified-messaging-and-streaming" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"></path></svg></a>Building an ecosystem for unified messaging and streaming</h1>
<p>In addition to contributing to the Pulsar technology, the community is also working to build a robust ecosystem to support it. Pulsar’s ability to support a rich ecosystem of pub-sub libraries, connectors, functions, protocol handlers, and integrations with popular query engines will enable Pulsar adopters to streamline workflows and achieve new use cases.</p>
<h1><a class="anchor" aria-hidden="true" id="what-is-next"></a><a href="#what-is-next" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"></path></svg></a>What is Next?</h1>
<p>If you are interested in learning more about Pulsar 2.8.0, you can <a href="https://pulsar.apache.org/en/versions/">download 2.8.0</a> and try it out today!</p>
<p>If you want to learn more about how companies have adopted Pulsar, you can <a href="https://hopin.com/events/pulsar-summit-north-america-2021">sign up</a> for Pulsar Summit NA 2021!</p>
<p>For more information about the Apache Pulsar project and the progress, please visit the official website at <a href="https://pulsar.apache.org">https://pulsar.apache.org</a> and follow the project on Twitter <a href="https://twitter.com/apache_pulsar">@apache_pulsar</a>.</p>
</span></div></article></div><div class="post"><header class="postHeader"><h1 class="postHeaderTitle"><a href="/blog/2021/05/13/Apache-Pulsar-2-7-2">Apache Pulsar 2.7.2</a></h1><p class="post-meta">May 13, 2021</p><div class="authorBlock"><p class="post-authorName"><a href="https://twitter.com/eolivelli" target="_blank" rel="noreferrer noopener">Enrico Olivelli</a></p></div></header><article class="post-content"><div><span><p>We are very glad to see the Apache Pulsar community has successfully released the 2.7.2 version.
This is a minor release that introduces stability fixes and a few new features without breaking changes.</p>
</span></div><div class="read-more"><a class="button" href="/blog/2021/05/13/Apache-Pulsar-2-7-2">Read More</a></div></article></div><div class="docs-prevnext"><a class="docs-next" href="/blog/page2/">Next →</a></div></div></div></div></div><footer class="nav-footer" id="footer"><section class="copyright">Copyright © 2022 The Apache Software Foundation. All Rights Reserved. Apache, Apache Pulsar and the Apache feather logo are trademarks of The Apache Software Foundation.</section><span><script>
const community = document.querySelector("a[href='#community']").parentNode;
const communityMenu =
'<li>' +
'<a id="community-menu" href="#">Community <span style="font-size: 0.75em">&nbsp;▼</span></a>' +
'<div id="community-dropdown" class="hide">' +
'<ul id="community-dropdown-items">' +
'<li><a href="/en/contact">Contact</a></li>' +
'<li><a href="/en/contributing">Contributing</a></li>' +
'<li><a href="/en/coding-guide">Coding guide</a></li>' +
'<li><a href="/en/events">Events</a></li>' +
'<li><a href="https://twitter.com/Apache_Pulsar" target="_blank">Twitter &#x2750</a></li>' +
'<li><a href="https://github.com/apache/pulsar/wiki" target="_blank">Wiki &#x2750</a></li>' +
'<li><a href="https://github.com/apache/pulsar/issues" target="_blank">Issue tracking &#x2750</a></li>' +
'<li><a href="https://pulsar-summit.org/" target="_blank">Pulsar Summit &#x2750</a></li>' +
'<li>&nbsp;</li>' +
'<li><a href="/en/resources">Resources</a></li>' +
'<li><a href="/en/team">Team</a></li>' +
'<li><a href="/en/powered-by">Powered By</a></li>' +
'</ul>' +
'</div>' +
'</li>';
community.innerHTML = communityMenu;
const communityMenuItem = document.getElementById("community-menu");
const communityDropDown = document.getElementById("community-dropdown");
communityMenuItem.addEventListener("click", function(event) {
event.preventDefault();
if (communityDropDown.className == 'hide') {
communityDropDown.className = 'visible';
} else {
communityDropDown.className = 'hide';
}
});
</script></span></footer></div><script>window.twttr=(function(d,s, id){var js,fjs=d.getElementsByTagName(s)[0],t=window.twttr||{};if(d.getElementById(id))return t;js=d.createElement(s);js.id=id;js.src='https://platform.twitter.com/widgets.js';fjs.parentNode.insertBefore(js, fjs);t._e = [];t.ready = function(f) {t._e.push(f);};return t;}(document, 'script', 'twitter-wjs'));</script></body></html>