<!--
 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--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" -->
