<!--
 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" -->
<body class="page-documentation">
<!--#include virtual="../includes/_top.htm" -->

<div id="top" name="top"></div>
<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" -->
    <a href="#top" id="docs-top-link">&#10224;<br />Top</a>
    <h1 class="docs-title">Documentation</h1>
    <h3>Kafka 2.5 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>.


    <h2 class="anchor-heading">
      <a class="anchor-link" id="gettingStarted" href="#gettingStarted"></a>
<a href="#gettingStarted">1. Key Concepts
    </a></h2>

    <h3 class="anchor-heading">
      <a class="anchor-link" id="introduction" href="#introduction"></a>
<a href="#introduction">1.1 Introduction
    </a></h3>

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

    <h3 class="anchor-heading">
      <a class="anchor-link" id="uses" href="#uses"></a>
<a href="#uses">1.2 Use Cases
    </a></h3>

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

    <h3 class="anchor-heading">
      <a class="anchor-link" id="quickstart" href="#quickstart"></a>
<a href="#quickstart">1.3 Quick Start
    </a></h3>

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

    <h3 class="anchor-heading">
      <a class="anchor-link" id="ecosystem" href="#ecosystem"></a>
<a href="#ecosystem">1.4 Ecosystem
    </a></h3>

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

    <h3 class="anchor-heading">
      <a class="anchor-link" id="upgrade" href="#upgrade"></a>
<a href="#upgrade">1.5 Upgrading From Previous Versions
    </a></h3>

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    <h2 class="anchor-heading">
      <a class="anchor-link" id="streams" href="/documentation/streams"> </a>
      9. Kafka Streams
    </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" -->
