blob: 82c160d7f4a3c46bd9dd906603b2ffadb926e669 [file] [log] [blame]
<!DOCTYPE html>
<html lang="en" dir=ZgotmplZ>
<head>
<link rel="stylesheet" href="/bootstrap/css/bootstrap.min.css">
<script src="/bootstrap/js/bootstrap.bundle.min.js"></script>
<link rel="stylesheet" type="text/css" href="/font-awesome/css/font-awesome.min.css">
<script src="/js/anchor.min.js"></script>
<script src="/js/flink.js"></script>
<link rel="canonical" href="https://flink.apache.org/2020/09/28/stateful-functions-2.2.0-release-announcement/">
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta name="description" content="The Apache Flink community is happy to announce the release of Stateful Functions (StateFun) 2.2.0! This release introduces major features that extend the SDKs, such as support for asynchronous functions in the Python SDK, new persisted state constructs, and a new SDK that allows embedding StateFun functions within a Flink DataStream job. Moreover, we&rsquo;ve also included important changes that improve out-of-the-box stability for common workloads, as well as increased observability for operational purposes.">
<meta name="theme-color" content="#FFFFFF"><meta property="og:title" content="Stateful Functions 2.2.0 Release Announcement" />
<meta property="og:description" content="The Apache Flink community is happy to announce the release of Stateful Functions (StateFun) 2.2.0! This release introduces major features that extend the SDKs, such as support for asynchronous functions in the Python SDK, new persisted state constructs, and a new SDK that allows embedding StateFun functions within a Flink DataStream job. Moreover, we&rsquo;ve also included important changes that improve out-of-the-box stability for common workloads, as well as increased observability for operational purposes." />
<meta property="og:type" content="article" />
<meta property="og:url" content="https://flink.apache.org/2020/09/28/stateful-functions-2.2.0-release-announcement/" /><meta property="article:section" content="posts" />
<meta property="article:published_time" content="2020-09-28T08:00:00+00:00" />
<meta property="article:modified_time" content="2020-09-28T08:00:00+00:00" />
<title>Stateful Functions 2.2.0 Release Announcement | Apache Flink</title>
<link rel="manifest" href="/manifest.json">
<link rel="icon" href="/favicon.png" type="image/x-icon">
<link rel="stylesheet" href="/book.min.22eceb4d17baa9cdc0f57345edd6f215a40474022dfee39b63befb5fb3c596b5.css" integrity="sha256-IuzrTRe6qc3A9XNF7dbyFaQEdAIt/uObY777X7PFlrU=">
<script defer src="/en.search.min.2698f0d1b683dae4d6cb071668b310a55ebcf1c48d11410a015a51d90105b53e.js" integrity="sha256-Jpjw0baD2uTWywcWaLMQpV688cSNEUEKAVpR2QEFtT4="></script>
<!--
Made with Book Theme
https://github.com/alex-shpak/hugo-book
-->
<meta name="generator" content="Hugo 0.124.1">
<script>
var _paq = window._paq = window._paq || [];
_paq.push(['disableCookies']);
_paq.push(["setDomains", ["*.flink.apache.org","*.nightlies.apache.org/flink"]]);
_paq.push(['trackPageView']);
_paq.push(['enableLinkTracking']);
(function() {
var u="//analytics.apache.org/";
_paq.push(['setTrackerUrl', u+'matomo.php']);
_paq.push(['setSiteId', '1']);
var d=document, g=d.createElement('script'), s=d.getElementsByTagName('script')[0];
g.async=true; g.src=u+'matomo.js'; s.parentNode.insertBefore(g,s);
})();
</script>
</head>
<body dir=ZgotmplZ>
<header>
<nav class="navbar navbar-expand-xl">
<div class="container-fluid">
<a class="navbar-brand" href="/">
<img src="/img/logo/png/100/flink_squirrel_100_color.png" alt="Apache Flink" height="47" width="47" class="d-inline-block align-text-middle">
<span>Apache Flink</span>
</a>
<button class="navbar-toggler" type="button" data-bs-toggle="collapse" data-bs-target="#navbarSupportedContent" aria-controls="navbarSupportedContent" aria-expanded="false" aria-label="Toggle navigation">
<i class="fa fa-bars navbar-toggler-icon"></i>
</button>
<div class="collapse navbar-collapse" id="navbarSupportedContent">
<ul class="navbar-nav">
<li class="nav-item dropdown">
<a class="nav-link dropdown-toggle" href="#" role="button" data-bs-toggle="dropdown" aria-expanded="false">About</a>
<ul class="dropdown-menu">
<li>
<a class="dropdown-item" href="/what-is-flink/flink-architecture/">Architecture</a>
</li>
<li>
<a class="dropdown-item" href="/what-is-flink/flink-applications/">Applications</a>
</li>
<li>
<a class="dropdown-item" href="/what-is-flink/flink-operations/">Operations</a>
</li>
<li>
<a class="dropdown-item" href="/what-is-flink/use-cases/">Use Cases</a>
</li>
<li>
<a class="dropdown-item" href="/what-is-flink/powered-by/">Powered By</a>
</li>
<li>
<a class="dropdown-item" href="/what-is-flink/roadmap/">Roadmap</a>
</li>
<li>
<a class="dropdown-item" href="/what-is-flink/community/">Community & Project Info</a>
</li>
<li>
<a class="dropdown-item" href="/what-is-flink/security/">Security</a>
</li>
<li>
<a class="dropdown-item" href="/what-is-flink/special-thanks/">Special Thanks</a>
</li>
</ul>
</li>
<li class="nav-item dropdown">
<a class="nav-link dropdown-toggle" href="#" role="button" data-bs-toggle="dropdown" aria-expanded="false">Getting Started</a>
<ul class="dropdown-menu">
<li>
<a class="dropdown-item" href="https://nightlies.apache.org/flink/flink-docs-stable/docs/try-flink/local_installation/">With Flink<i class="link fa fa-external-link title" aria-hidden="true"></i>
</a>
</li>
<li>
<a class="dropdown-item" href="https://nightlies.apache.org/flink/flink-kubernetes-operator-docs-stable/docs/try-flink-kubernetes-operator/quick-start/">With Flink Kubernetes Operator<i class="link fa fa-external-link title" aria-hidden="true"></i>
</a>
</li>
<li>
<a class="dropdown-item" href="https://nightlies.apache.org/flink/flink-cdc-docs-stable/docs/get-started/introduction/">With Flink CDC<i class="link fa fa-external-link title" aria-hidden="true"></i>
</a>
</li>
<li>
<a class="dropdown-item" href="https://nightlies.apache.org/flink/flink-ml-docs-stable/docs/try-flink-ml/quick-start/">With Flink ML<i class="link fa fa-external-link title" aria-hidden="true"></i>
</a>
</li>
<li>
<a class="dropdown-item" href="https://nightlies.apache.org/flink/flink-statefun-docs-stable/getting-started/project-setup.html">With Flink Stateful Functions<i class="link fa fa-external-link title" aria-hidden="true"></i>
</a>
</li>
<li>
<a class="dropdown-item" href="https://nightlies.apache.org/flink/flink-docs-stable/docs/learn-flink/overview/">Training Course<i class="link fa fa-external-link title" aria-hidden="true"></i>
</a>
</li>
</ul>
</li>
<li class="nav-item dropdown">
<a class="nav-link dropdown-toggle" href="#" role="button" data-bs-toggle="dropdown" aria-expanded="false">Documentation</a>
<ul class="dropdown-menu">
<li>
<a class="dropdown-item" href="https://nightlies.apache.org/flink/flink-docs-stable/">Flink 1.19 (stable)<i class="link fa fa-external-link title" aria-hidden="true"></i>
</a>
</li>
<li>
<a class="dropdown-item" href="https://nightlies.apache.org/flink/flink-docs-master/">Flink Master (snapshot)<i class="link fa fa-external-link title" aria-hidden="true"></i>
</a>
</li>
<li>
<a class="dropdown-item" href="https://nightlies.apache.org/flink/flink-kubernetes-operator-docs-stable/">Kubernetes Operator 1.8 (latest)<i class="link fa fa-external-link title" aria-hidden="true"></i>
</a>
</li>
<li>
<a class="dropdown-item" href="https://nightlies.apache.org/flink/flink-kubernetes-operator-docs-main">Kubernetes Operator Main (snapshot)<i class="link fa fa-external-link title" aria-hidden="true"></i>
</a>
</li>
<li>
<a class="dropdown-item" href="https://nightlies.apache.org/flink/flink-cdc-docs-stable">CDC 3.0 (stable)<i class="link fa fa-external-link title" aria-hidden="true"></i>
</a>
</li>
<li>
<a class="dropdown-item" href="https://nightlies.apache.org/flink/flink-cdc-docs-master">CDC Master (snapshot)<i class="link fa fa-external-link title" aria-hidden="true"></i>
</a>
</li>
<li>
<a class="dropdown-item" href="https://nightlies.apache.org/flink/flink-ml-docs-stable/">ML 2.3 (stable)<i class="link fa fa-external-link title" aria-hidden="true"></i>
</a>
</li>
<li>
<a class="dropdown-item" href="https://nightlies.apache.org/flink/flink-ml-docs-master">ML Master (snapshot)<i class="link fa fa-external-link title" aria-hidden="true"></i>
</a>
</li>
<li>
<a class="dropdown-item" href="https://nightlies.apache.org/flink/flink-statefun-docs-stable/">Stateful Functions 3.3 (stable)<i class="link fa fa-external-link title" aria-hidden="true"></i>
</a>
</li>
<li>
<a class="dropdown-item" href="https://nightlies.apache.org/flink/flink-statefun-docs-master">Stateful Functions Master (snapshot)<i class="link fa fa-external-link title" aria-hidden="true"></i>
</a>
</li>
</ul>
</li>
<li class="nav-item dropdown">
<a class="nav-link dropdown-toggle" href="#" role="button" data-bs-toggle="dropdown" aria-expanded="false">How to Contribute</a>
<ul class="dropdown-menu">
<li>
<a class="dropdown-item" href="/how-to-contribute/overview/">Overview</a>
</li>
<li>
<a class="dropdown-item" href="/how-to-contribute/contribute-code/">Contribute Code</a>
</li>
<li>
<a class="dropdown-item" href="/how-to-contribute/reviewing-prs/">Review Pull Requests</a>
</li>
<li>
<a class="dropdown-item" href="/how-to-contribute/code-style-and-quality-preamble/">Code Style and Quality Guide</a>
</li>
<li>
<a class="dropdown-item" href="/how-to-contribute/contribute-documentation/">Contribute Documentation</a>
</li>
<li>
<a class="dropdown-item" href="/how-to-contribute/documentation-style-guide/">Documentation Style Guide</a>
</li>
<li>
<a class="dropdown-item" href="/how-to-contribute/improve-website/">Contribute to the Website</a>
</li>
<li>
<a class="dropdown-item" href="/how-to-contribute/getting-help/">Getting Help</a>
</li>
</ul>
</li>
<li class="nav-item">
<a class="nav-link" href="/posts/">Flink Blog</a>
</li>
<li class="nav-item">
<a class="nav-link" href="/downloads/">Downloads</a>
</li>
</ul>
<div class="book-search">
<div class="book-search-spinner hidden">
<i class="fa fa-refresh fa-spin"></i>
</div>
<form class="search-bar d-flex" onsubmit="return false;"su>
<input type="text" id="book-search-input" placeholder="Search" aria-label="Search" maxlength="64" data-hotkeys="s/">
<i class="fa fa-search search"></i>
<i class="fa fa-circle-o-notch fa-spin spinner"></i>
</form>
<div class="book-search-spinner hidden"></div>
<ul id="book-search-results"></ul>
</div>
</div>
</div>
</nav>
<div class="navbar-clearfix"></div>
</header>
<main class="flex">
<section class="container book-page">
<article class="markdown">
<h1>
<a href="/2020/09/28/stateful-functions-2.2.0-release-announcement/">Stateful Functions 2.2.0 Release Announcement</a>
</h1>
September 28, 2020 -
Tzu-Li (Gordon) Tai
<a href="https://twitter.com/tzulitai">(@tzulitai)</a>
Igal Shilman
<a href="https://twitter.com/IgalShilman">(@IgalShilman)</a>
<p><p>The Apache Flink community is happy to announce the release of Stateful Functions (StateFun) 2.2.0! This release
introduces major features that extend the SDKs, such as support for asynchronous functions in the Python SDK, new
persisted state constructs, and a new SDK that allows embedding StateFun functions within a Flink DataStream job.
Moreover, we&rsquo;ve also included important changes that improve out-of-the-box stability for common workloads,
as well as increased observability for operational purposes.</p>
<p>We&rsquo;ve also seen new 3rd party SDKs for StateFun being developed since the last release. While they are not part of the
release artifacts, it&rsquo;s great seeing these community-driven additions! We&rsquo;ve highlighted these efforts below
in this announcement.</p>
<p>The binary distribution and source artifacts are now available on the updated <a href="https://flink.apache.org/downloads.html">Downloads</a>
page of the Flink website, and the most recent Python SDK distribution is available on <a href="https://pypi.org/project/apache-flink-statefun/">PyPI</a>.
For more details, check the complete <a href="https://issues.apache.org/jira/secure/ReleaseNote.jspa?projectId=12315522&amp;version=12348350">release changelog</a>
and the <a href="//nightlies.apache.org/flink/flink-statefun-docs-release-2.2/">updated documentation</a>.
We encourage you to download the release and share your feedback with the community through the <a href="https://flink.apache.org/community.html#mailing-lists">Flink mailing lists</a>
or <a href="https://issues.apache.org/jira/browse/">JIRA</a>!</p>
<h2 id="new-features">
New Features
<a class="anchor" href="#new-features">#</a>
</h2>
<h3 id="asynchronous-functions-in-python-sdk">
Asynchronous functions in Python SDK
<a class="anchor" href="#asynchronous-functions-in-python-sdk">#</a>
</h3>
<p>This release enables registering asynchronous Python functions as stateful functions by introducing a new handler
in the <a href="//nightlies.apache.org/flink/flink-statefun-docs-release-2.2/sdk/python.html">Python SDK</a>: <code>AsyncRequestReplyHandler</code>.
This allows serving StateFun functions with Python web frameworks that support asynchronous IO natively (for example,
<a href="https://pypi.org/project/aiohttp/">aiohttp</a>):</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-python" data-lang="python"><span class="line"><span class="cl"><span class="kn">from</span> <span class="nn">statefun</span> <span class="kn">import</span> <span class="n">StatefulFunctions</span>
</span></span><span class="line"><span class="cl"><span class="kn">from</span> <span class="nn">statefun</span> <span class="kn">import</span> <span class="n">AsyncRequestReplyHandler</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="n">functions</span> <span class="o">=</span> <span class="n">StatefulFunctions</span><span class="p">()</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="nd">@functions.bind</span><span class="p">(</span><span class="s2">&#34;example/greeter&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="k">async</span> <span class="k">def</span> <span class="nf">greeter</span><span class="p">(</span><span class="n">context</span><span class="p">,</span> <span class="n">message</span><span class="p">):</span>
</span></span><span class="line"><span class="cl"> <span class="n">html</span> <span class="o">=</span> <span class="k">await</span> <span class="n">fetch</span><span class="p">(</span><span class="n">session</span><span class="p">,</span> <span class="s1">&#39;http://....&#39;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"> <span class="n">context</span><span class="o">.</span><span class="n">pack_and_reply</span><span class="p">(</span><span class="n">SomeProtobufMessage</span><span class="p">(</span><span class="n">html</span><span class="p">))</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># expose this handler via an async web framework</span>
</span></span><span class="line"><span class="cl"><span class="n">handler</span> <span class="o">=</span> <span class="n">AsyncRequestReplyHandler</span><span class="p">(</span><span class="n">functions</span><span class="p">)</span>
</span></span></code></pre></div><p>For more details, please see the docs on <a href="//nightlies.apache.org/flink/flink-statefun-docs-release-2.2/sdk/python.html#exposing-functions">exposing Python functions</a>.</p>
<h3 id="flink-datastream-integration-sdk">
Flink DataStream Integration SDK
<a class="anchor" href="#flink-datastream-integration-sdk">#</a>
</h3>
<p>Using this SDK, you may combine pipelines written with the Flink <code>DataStream</code> API or higher-level libraries
(such as Table API, CEP etc., basically anything that can consume or produce a <code>DataStream</code>) with the programming constructs
provided by Stateful Functions, as demonstrated below:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-java" data-lang="java"><span class="line"><span class="cl"><span class="n">StreamExecutionEnvironment</span><span class="w"> </span><span class="n">env</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">StreamExecutionEnvironment</span><span class="p">.</span><span class="na">getExecutionEnvironment</span><span class="p">();</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="n">DataStream</span><span class="o">&lt;</span><span class="n">RoutableMessage</span><span class="o">&gt;</span><span class="w"> </span><span class="n">namesIngress</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="p">...</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="n">StatefulFunctionEgressStreams</span><span class="w"> </span><span class="n">egresses</span><span class="w"> </span><span class="o">=</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="n">StatefulFunctionDataStreamBuilder</span><span class="p">.</span><span class="na">builder</span><span class="p">(</span><span class="s">&#34;example&#34;</span><span class="p">)</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="p">.</span><span class="na">withDataStreamAsIngress</span><span class="p">(</span><span class="n">namesIngress</span><span class="p">)</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="p">.</span><span class="na">withRequestReplyRemoteFunction</span><span class="p">(</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="n">RequestReplyFunctionBuilder</span><span class="p">.</span><span class="na">requestReplyFunctionBuilder</span><span class="p">(</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="n">REMOTE_GREET</span><span class="p">,</span><span class="w"> </span><span class="n">URI</span><span class="p">.</span><span class="na">create</span><span class="p">(</span><span class="s">&#34;http://...&#34;</span><span class="p">))</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="p">.</span><span class="na">withPersistedState</span><span class="p">(</span><span class="s">&#34;seen_count&#34;</span><span class="p">)</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="p">.</span><span class="na">withFunctionProvider</span><span class="p">(</span><span class="n">GREET</span><span class="p">,</span><span class="w"> </span><span class="n">unused</span><span class="w"> </span><span class="o">-&gt;</span><span class="w"> </span><span class="k">new</span><span class="w"> </span><span class="n">MyFunction</span><span class="p">())</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="p">.</span><span class="na">withEgressId</span><span class="p">(</span><span class="n">GREETINGS</span><span class="p">)</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="p">.</span><span class="na">build</span><span class="p">(</span><span class="n">env</span><span class="p">);</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="n">DataStream</span><span class="o">&lt;</span><span class="n">String</span><span class="o">&gt;</span><span class="w"> </span><span class="n">responsesEgress</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">getDataStreamForEgressId</span><span class="p">(</span><span class="n">GREETINGS</span><span class="p">);</span><span class="w">
</span></span></span></code></pre></div><p>Events from <code>DataStream</code> ingresses are being routed to bound functions, and events sent to
egresses are captured as <code>DataStream</code> egresses. This opens up the possibility of building complex streaming
applications.</p>
<h3 id="construct-for-dynamic-state-registration">
Construct for Dynamic State Registration
<a class="anchor" href="#construct-for-dynamic-state-registration">#</a>
</h3>
<p>Prior to this release, the persisted state constructs in the Java SDK, such as <code>PersistedValue</code>, <code>PersistedTable</code> etc.,
had to be eagerly defined in a stateful function&rsquo;s class. In certain scenarios, what state a function requires is not
known in advance, and may only be dynamically registered at runtime (e.g., when a function is invoked).</p>
<p>This release enables that by providing a new <code>PersistedStateRegistry</code> construct:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-java" data-lang="java"><span class="line"><span class="cl"><span class="kd">public</span><span class="w"> </span><span class="kd">class</span> <span class="nc">MyFunction</span><span class="w"> </span><span class="kd">implements</span><span class="w"> </span><span class="n">StatefulFunction</span><span class="w"> </span><span class="p">{</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nd">@Persisted</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="kd">private</span><span class="w"> </span><span class="kd">final</span><span class="w"> </span><span class="n">PersistedStateRegistry</span><span class="w"> </span><span class="n">registry</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="k">new</span><span class="w"> </span><span class="n">PersistedStateRegistry</span><span class="p">();</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="kd">private</span><span class="w"> </span><span class="kd">final</span><span class="w"> </span><span class="n">PersistedValue</span><span class="o">&lt;</span><span class="n">String</span><span class="o">&gt;</span><span class="w"> </span><span class="n">myValue</span><span class="p">;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="kd">public</span><span class="w"> </span><span class="kt">void</span><span class="w"> </span><span class="nf">invoke</span><span class="p">(</span><span class="n">Context</span><span class="w"> </span><span class="n">context</span><span class="p">,</span><span class="w"> </span><span class="n">Object</span><span class="w"> </span><span class="n">input</span><span class="p">)</span><span class="w"> </span><span class="p">{</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="n">myValue</span><span class="w"> </span><span class="o">==</span><span class="w"> </span><span class="kc">null</span><span class="p">)</span><span class="w"> </span><span class="p">{</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="n">myValue</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">registry</span><span class="p">.</span><span class="na">registerValue</span><span class="p">(</span><span class="n">PersistedValue</span><span class="p">.</span><span class="na">of</span><span class="p">(</span><span class="s">&#34;my-value&#34;</span><span class="p">,</span><span class="w"> </span><span class="n">String</span><span class="p">.</span><span class="na">class</span><span class="p">));</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="p">}</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="p">...</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="p">}</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="p">}</span><span class="w">
</span></span></span></code></pre></div><h2 id="improvements">
Improvements
<a class="anchor" href="#improvements">#</a>
</h2>
<h3 id="remote-functions-communication-stability">
Remote Functions Communication Stability
<a class="anchor" href="#remote-functions-communication-stability">#</a>
</h3>
<p>After observing common workloads, a few configurations for communicating with remote functions were adjusted for a better
out-of-the-box connection stability. This includes the following:</p>
<ul>
<li>The underlying connection pool was tuned for low latency, high throughput workloads. This allows StateFun to reuse
existing connections much more aggressively and avoid re-establishing a connection for each request.</li>
<li>StateFun applies backpressure once the total number of uncompleted requests reaches a per JVM threshold (<code>statefun.async.max-per-task</code>),
but observing typical workloads we have discovered that the default value is set too high. In this release the default
was reduced to improve stability and resource consumption, in the face of a slow-responding remote function.</li>
</ul>
<h3 id="operational-observability-of-a-statefun-application">
Operational observability of a StateFun Application
<a class="anchor" href="#operational-observability-of-a-statefun-application">#</a>
</h3>
<p>One major goal of this release was to take a necessary step towards supporting auto-scaling of remote functions. Towards that end,
we&rsquo;ve exposed several metrics related to workload of remote functions and resulting backpressure applied by the function
dispatchers. This includes the following:</p>
<ul>
<li>Per function type invocation duration / latency histograms</li>
<li>Per function type backlog size</li>
<li>Per JVM (StateFun worker) and per function type number of in-flight invocations</li>
</ul>
<p>The full list of metrics and their descriptions can be found <a href="//nightlies.apache.org/flink/flink-statefun-docs-release-2.2/deployment-and-operations/metrics.html">here</a>.</p>
<h3 id="fine-grained-control-over-remote-connection-lifecycle">
Fine-grained control over remote connection lifecycle
<a class="anchor" href="#fine-grained-control-over-remote-connection-lifecycle">#</a>
</h3>
<p>With this release, it&rsquo;s possible to set individual timeouts for overall duration and individual read and write IO operations
of HTTP requests with remote functions. You can find the corresponding field names in a function spec that defines
these timeout values <a href="//nightlies.apache.org/flink/flink-statefun-docs-release-2.2/sdk/index.html#defining-functions">here</a>.</p>
<h2 id="3rd-party-sdks">
3rd Party SDKs
<a class="anchor" href="#3rd-party-sdks">#</a>
</h2>
<p>Since the last release, we&rsquo;ve seen new 3rd party SDKs for different languages being implemented on top of StateFun&rsquo;s
remote function HTTP request-reply protocol, including <a href="https://github.com/sjwiesman/statefun-go/">Go</a> and <a href="https://github.com/aljoscha/statefun-rust">Rust</a> implementations. While these SDKs are not
endorsed or maintained by the Apache Flink PMC and currently not part of the current releases, it is great to see these
new additions that demonstrate the extensibility of the framework.</p>
<p>For that reason, we&rsquo;ve added
a new <a href="//nightlies.apache.org/flink/flink-statefun-docs-release-2.2/sdk/external.html">page in the documentation</a>
to list the 3rd party SDKs that the community is aware of. If you&rsquo;ve also worked on a new language SDK for StateFun that
is stable and you plan to continue maintaining, please consider letting the community know of your work by
submitting a pull request to add your project to the list!</p>
<h2 id="important-patch-notes">
Important Patch Notes
<a class="anchor" href="#important-patch-notes">#</a>
</h2>
<p>Below is a list of user-facing interface and configuration changes, dependency version upgrades, or removal of supported versions that would be
important to be aware of when upgrading your StateFun applications to this version:</p>
<ul>
<li>[<a href="https://issues.apache.org/jira/browse/FLINK-18812">FLINK-18812</a>] The Flink version in StateFun 2.2 has been upgraded to 1.11.1.</li>
<li>[<a href="https://issues.apache.org/jira/browse/FLINK-19203">FLINK-19203</a>] Upgraded Scala version to 2.12, and dropped support for 2.11.</li>
<li>[<a href="https://issues.apache.org/jira/browse/FLINK-19190">FLINK-19190</a>] All existing metric names have been renamed to be camel-cased instead of snake-cased, to conform with the Flink metric naming conventions. <strong>This breaks existing deployments if you depended on previous metrics</strong>.</li>
<li>[<a href="https://issues.apache.org/jira/browse/FLINK-19192">FLINK-19192</a>] The connection pool size for remote function HTTP requests have been increased to 1024, with a stale TTL of 1 minute.</li>
<li>[<a href="https://issues.apache.org/jira/browse/FLINK-19191">FLINK-19191</a>] The default max number of asynchronous operations per JVM (StateFun worker) has been decreased to 1024.</li>
</ul>
<h2 id="release-notes">
Release Notes
<a class="anchor" href="#release-notes">#</a>
</h2>
<p>Please review the <a href="https://issues.apache.org/jira/secure/ReleaseNote.jspa?projectId=12315522&amp;version=12348350">release notes</a>
for a detailed list of changes and new features if you plan to upgrade your setup to Stateful Functions 2.2.0.</p>
<h2 id="list-of-contributors">
List of Contributors
<a class="anchor" href="#list-of-contributors">#</a>
</h2>
<p>The Apache Flink community would like to thank all contributors that have made this release possible:</p>
<p>abc863377, Authuir, Chesnay Schepler, Congxian Qiu, David Anderson, Dian Fu, Francesco Guardiani, Igal Shilman, Marta Paes Moreira, Patrick Wiener, Rafi Aroch, Seth Wiesman, Stephan Ewen, Tzu-Li (Gordon) Tai, Ufuk Celebi</p>
<p>If you’d like to get involved, we’re always <a href="https://github.com/apache/flink-statefun#contributing">looking for new contributors</a>.</p>
</p>
</article>
<div class="edit-this-page">
<p>
<a href="https://cwiki.apache.org/confluence/display/FLINK/Flink+Translation+Specifications">Want to contribute translation?</a>
</p>
<p>
<a href="//github.com/apache/flink-web/edit/asf-site/docs/content/posts/2020-09-28-release-statefun-2.2.0.md">
Edit This Page<i class="fa fa-edit fa-fw"></i>
</a>
</p>
</div>
</section>
<aside class="book-toc">
<nav id="TableOfContents"><h3>On This Page <a href="javascript:void(0)" class="toc" onclick="collapseToc()"><i class="fa fa-times" aria-hidden="true"></i></a></h3>
<ul>
<li>
<ul>
<li><a href="#new-features">New Features</a>
<ul>
<li><a href="#asynchronous-functions-in-python-sdk">Asynchronous functions in Python SDK</a></li>
<li><a href="#flink-datastream-integration-sdk">Flink DataStream Integration SDK</a></li>
<li><a href="#construct-for-dynamic-state-registration">Construct for Dynamic State Registration</a></li>
</ul>
</li>
<li><a href="#improvements">Improvements</a>
<ul>
<li><a href="#remote-functions-communication-stability">Remote Functions Communication Stability</a></li>
<li><a href="#operational-observability-of-a-statefun-application">Operational observability of a StateFun Application</a></li>
<li><a href="#fine-grained-control-over-remote-connection-lifecycle">Fine-grained control over remote connection lifecycle</a></li>
</ul>
</li>
<li><a href="#3rd-party-sdks">3rd Party SDKs</a></li>
<li><a href="#important-patch-notes">Important Patch Notes</a></li>
<li><a href="#release-notes">Release Notes</a></li>
<li><a href="#list-of-contributors">List of Contributors</a></li>
</ul>
</li>
</ul>
</nav>
</aside>
<aside class="expand-toc hidden">
<a class="toc" onclick="expandToc()" href="javascript:void(0)">
<i class="fa fa-bars" aria-hidden="true"></i>
</a>
</aside>
</main>
<footer>
<div class="separator"></div>
<div class="panels">
<div class="wrapper">
<div class="panel">
<ul>
<li>
<a href="https://flink-packages.org/">flink-packages.org</a>
</li>
<li>
<a href="https://www.apache.org/">Apache Software Foundation</a>
</li>
<li>
<a href="https://www.apache.org/licenses/">License</a>
</li>
<li>
<a href="/zh/">
<i class="fa fa-globe" aria-hidden="true"></i>&nbsp;中文版
</a>
</li>
</ul>
</div>
<div class="panel">
<ul>
<li>
<a href="/what-is-flink/security">Security</a-->
</li>
<li>
<a href="https://www.apache.org/foundation/sponsorship.html">Donate</a>
</li>
<li>
<a href="https://www.apache.org/foundation/thanks.html">Thanks</a>
</li>
</ul>
</div>
<div class="panel icons">
<div>
<a href="/posts">
<div class="icon flink-blog-icon"></div>
<span>Flink blog</span>
</a>
</div>
<div>
<a href="https://github.com/apache/flink">
<div class="icon flink-github-icon"></div>
<span>Github</span>
</a>
</div>
<div>
<a href="https://twitter.com/apacheflink">
<div class="icon flink-twitter-icon"></div>
<span>Twitter</span>
</a>
</div>
</div>
</div>
</div>
<hr/>
<div class="container disclaimer">
<p>The contents of this website are © 2024 Apache Software Foundation under the terms of the Apache License v2. Apache Flink, Flink, and the Flink logo are either registered trademarks or trademarks of The Apache Software Foundation in the United States and other countries.</p>
</div>
</footer>
</body>
</html>