<!--
 Licensed to the Apache Software Foundation (ASF) under one or more
 contributor license agreements.  See the NOTICE file distributed with
 this work for additional information regarding copyright ownership.
 The ASF licenses this file to You under the Apache License, Version 2.0
 (the "License"); you may not use this file except in compliance with
 the License.  You may obtain a copy of the License at

    http://www.apache.org/licenses/LICENSE-2.0

 Unless required by applicable law or agreed to in writing, software
 distributed under the License is distributed on an "AS IS" BASIS,
 WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 See the License for the specific language governing permissions and
 limitations under the License.
-->

<script><!--#include virtual="js/templateData.js" --></script>

<!--#include virtual="../includes/_header.htm" -->
<!--#include virtual="../includes/_top.htm" -->


<div class="content documentation documentation--current">
 <!--#include virtual="../includes/_nav.htm" -->
  <div class="toc-handle-container">
    <div class="toc-handle">&lt;</div>
  </div>
  <div class="docs-nav">
    <!--#include virtual="toc.html" -->
  </div>
  <div class="right">
    <!--//#include virtual="../includes/_docs_banner.htm" -->
    
    <h1>Documentation</h1>
    <h3>Kafka 4.0 Documentation</h3>
    Prior releases: <a href="/07/documentation.html">0.7.x</a>, 
                    <a href="/08/documentation.html">0.8.0</a>, 
                    <a href="/081/documentation.html">0.8.1.X</a>, 
                    <a href="/082/documentation.html">0.8.2.X</a>, 
                    <a href="/090/documentation.html">0.9.0.X</a>, 
                    <a href="/0100/documentation.html">0.10.0.X</a>, 
                    <a href="/0101/documentation.html">0.10.1.X</a>, 
                    <a href="/0102/documentation.html">0.10.2.X</a>, 
                    <a href="/0110/documentation.html">0.11.0.X</a>, 
                    <a href="/10/documentation.html">1.0.X</a>, 
                    <a href="/11/documentation.html">1.1.X</a>, 
                    <a href="/20/documentation.html">2.0.X</a>, 
                    <a href="/21/documentation.html">2.1.X</a>, 
                    <a href="/22/documentation.html">2.2.X</a>, 
                    <a href="/23/documentation.html">2.3.X</a>, 
                    <a href="/24/documentation.html">2.4.X</a>, 
                    <a href="/25/documentation.html">2.5.X</a>, 
                    <a href="/26/documentation.html">2.6.X</a>, 
                    <a href="/27/documentation.html">2.7.X</a>,
                    <a href="/28/documentation.html">2.8.X</a>,
                    <a href="/30/documentation.html">3.0.X</a>,
                    <a href="/31/documentation.html">3.1.X</a>,
                    <a href="/32/documentation.html">3.2.X</a>,
                    <a href="/33/documentation.html">3.3.X</a>,
                    <a href="/34/documentation.html">3.4.X</a>,
                    <a href="/35/documentation.html">3.5.X</a>,
                    <a href="/36/documentation.html">3.6.X</a>,
                    <a href="/37/documentation.html">3.7.X</a>,
                    <a href="/38/documentation.html">3.8.X</a>,
                    <a href="/39/documentation.html">3.9.X</a>.

   <h2 class="anchor-heading"><a id="gettingStarted" class="anchor-link"></a><a href="#gettingStarted">1. Getting Started</a></h2>
      <h3 class="anchor-heading"><a id="introduction" class="anchor-link"></a><a href="#introduction">1.1 Introduction</a></h3>
      <!--#include virtual="introduction.html" -->
      <h3 class="anchor-heading"><a id="uses" class="anchor-link"></a><a href="#uses">1.2 Use Cases</a></h3>
      <!--#include virtual="uses.html" -->
      <h3 class="anchor-heading"><a id="quickstart" class="anchor-link"></a><a href="#quickstart">1.3 Quick Start</a></h3>
      <!--#include virtual="quickstart.html" -->
      <h3 class="anchor-heading"><a id="ecosystem" class="anchor-link"></a><a href="#ecosystem">1.4 Ecosystem</a></h3>
      <!--#include virtual="ecosystem.html" -->
      <h3 class="anchor-heading"><a id="upgrade" class="anchor-link"></a><a href="#upgrade">1.5 Upgrading From Previous Versions</a></h3>
      <!--#include virtual="upgrade.html" -->
      <h3 class="anchor-heading"><a id="zk2kraft-summary" class="anchor-link"></a><a href="#zk2kraft-summary">1.6 KRaft vs ZooKeeper</a></h3>
      <!--#include virtual="zk2kraft-summary.html" -->
      <h3 class="anchor-heading"><a id="compatibility-summary" class="anchor-link"></a><a href="#compatibility-summary">1.7 Compatibility</a></h3>
      <!--#include virtual="compatibility-summary.html" -->
      <h3 class="anchor-heading"><a id="docker" class="anchor-link"></a><a href="#docker">1.8 Docker</a></h3>
      <!--#include virtual="docker.html" -->

    <h2 class="anchor-heading"><a id="api" class="anchor-link"></a><a href="#api">2. APIs</a></h2>

    <!--#include virtual="api.html" -->

    <h2 class="anchor-heading"><a id="configuration" class="anchor-link"></a><a href="#configuration">3. Configuration</a></h2>

    <!--#include virtual="configuration.html" -->

    <h2 class="anchor-heading"><a id="design" class="anchor-link"></a><a href="#design">4. Design</a></h2>

    <!--#include virtual="design.html" -->

    <h2 class="anchor-heading"><a id="implementation" class="anchor-link"></a><a href="#implementation">5. Implementation</a></h2>

    <!--#include virtual="implementation.html" -->

    <h2 class="anchor-heading"><a id="operations" class="anchor-link"></a><a href="#operations">6. Operations</a></h2>

    <!--#include virtual="ops.html" -->

    <h2 class="anchor-heading"><a id="security" class="anchor-link"></a><a href="#security">7. Security</a></h2>
    <!--#include virtual="security.html" -->

    <h2 class="anchor-heading"><a id="connect" class="anchor-link"></a><a href="#connect">8. Kafka Connect</a></h2>
    <!--#include virtual="connect.html" -->

    <h2><a id="streams" href="#streams">9. Kafka Streams</a></h2>
    <p>
        Kafka Streams is a client library for processing and analyzing data stored in Kafka. It builds upon important stream processing concepts such as properly distinguishing between event time and processing time, windowing support, exactly-once processing semantics and simple yet efficient management of application state.
    </p>
    <p>
        Kafka Streams has a <b>low barrier to entry</b>: You can quickly write and run a small-scale proof-of-concept on a single machine; and you only need to run additional instances of your application on multiple machines to scale up to high-volume production workloads. Kafka Streams transparently handles the load balancing of multiple instances of the same application by leveraging Kafka's parallelism model.
    </p>

    <p>To learn more about Kafka Streams, visit the <a href="/documentation/streams">Kafka Streams page</a>.</p>

<!--#include virtual="../includes/_footer.htm" -->
<!--#include virtual="../includes/_docs_footer.htm" -->
