<!--
 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 3.8 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>.

   <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="docker" class="anchor-link"></a><a href="#docker">1.6 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="/documentation/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>Learn More about Kafka Streams read <a href="/documentation/streams">this</a> Section.</p>

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