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

<!--#include virtual="../includes/_header.htm" -->
<!--#include virtual="../includes/_top.htm" -->
<div class="content">
    <!--#include virtual="../includes/_nav.htm" -->
    <div class="right">
        <h1>Kafka protocol guide</h1>

<p>This document covers the wire protocol implemented in Kafka. It is meant to give a readable guide to the protocol that covers the available requests, their binary format, and the proper way to make use of them to implement a client. This document assumes you understand the basic design and terminology described <a href="/documentation.html#design">here</a></p>

<ul class="toc">
    <li><a href="#protocol_preliminaries">Preliminaries</a>
        <ul>
            <li><a href="#protocol_network">Network</a>
            <li><a href="#protocol_partitioning">Partitioning and bootstrapping</a>
            <li><a href="#protocol_partitioning_strategies">Partitioning Strategies</a>
            <li><a href="#protocol_batching">Batching</a>
            <li><a href="#protocol_compatibility">Versioning and Compatibility</a>
        </ul>
    </li>
    <li><a href="#protocol_details">The Protocol</a>
        <ul>
            <li><a href="#protocol_types">Protocol Primitive Types</a>
            <li><a href="#protocol_grammar">Notes on reading the request format grammars</a>
            <li><a href="#protocol_common">Common Request and Response Structure</a>
            <li><a href="#protocol_recordbatch">Record Batch</a>
        </ul>
    </li>
    <li><a href="#protocol_constants">Constants</a>
        <ul>
            <li><a href="#protocol_error_codes">Error Codes</a>
            <li><a href="#protocol_api_keys">Api Keys</a>
        </ul>
    </li>
    <li><a href="#protocol_messages">The Messages</a></li>
    <li><a href="#protocol_philosophy">Some Common Philosophical Questions</a></li>
</ul>

<h4><a id="protocol_preliminaries" href="#protocol_preliminaries">Preliminaries</a></h4>

<h5><a id="protocol_network" href="#protocol_network">Network</a></h5>

<p>Kafka uses a binary protocol over TCP. The protocol defines all APIs as request response message pairs. All messages are size delimited and are made up of the following primitive types.</p>

<p>The client initiates a socket connection and then writes a sequence of request messages and reads back the corresponding response message. No handshake is required on connection or disconnection. TCP is happier if you maintain persistent connections used for many requests to amortize the cost of the TCP handshake, but beyond this penalty connecting is pretty cheap.</p>

<p>The client will likely need to maintain a connection to multiple brokers, as data is partitioned and the clients will need to talk to the server that has their data. However it should not generally be necessary to maintain multiple connections to a single broker from a single client instance (i.e. connection pooling).</p>

<p>The server guarantees that on a single TCP connection, requests will be processed in the order they are sent and responses will return in that order as well. The broker's request processing allows only a single in-flight request per connection in order to guarantee this ordering. Note that clients can (and ideally should) use non-blocking IO to implement request pipelining and achieve higher throughput. i.e., clients can send requests even while awaiting responses for preceding requests since the outstanding requests will be buffered in the underlying OS socket buffer. All requests are initiated by the client, and result in a corresponding response message from the server except where noted.</p>

<p>The server has a configurable maximum limit on request size and any request that exceeds this limit will result in the socket being disconnected.</p>

<h5><a id="protocol_partitioning" href="#protocol_partitioning">Partitioning and bootstrapping</a></h5>

<p>Kafka is a partitioned system so not all servers have the complete data set. Instead recall that topics are split into a pre-defined number of partitions, P, and each partition is replicated with some replication factor, N. Topic partitions themselves are just ordered "commit logs" numbered 0, 1, ..., P.</p>

<p>All systems of this nature have the question of how a particular piece of data is assigned to a particular partition. Kafka clients directly control this assignment, the brokers themselves enforce no particular semantics of which messages should be published to a particular partition. Rather, to publish messages the client directly addresses messages to a particular partition, and when fetching messages, fetches from a particular partition. If two clients want to use the same partitioning scheme they must use the same method to compute the mapping of key to partition.</p>

<p>These requests to publish or fetch data must be sent to the broker that is currently acting as the leader for a given partition. This condition is enforced by the broker, so a request for a particular partition to the wrong broker will result in an the NotLeaderForPartition error code (described below).</p>

<p>How can the client find out which topics exist, what partitions they have, and which brokers currently host those partitions so that it can direct its requests to the right hosts? This information is dynamic, so you can't just configure each client with some static mapping file. Instead all Kafka brokers can answer a metadata request that describes the current state of the cluster: what topics there are, which partitions those topics have, which broker is the leader for those partitions, and the host and port information for these brokers.</p>

<p>In other words, the client needs to somehow find one broker and that broker will tell the client about all the other brokers that exist and what partitions they host. This first broker may itself go down so the best practice for a client implementation is to take a list of two or three URLs to bootstrap from. The user can then choose to use a load balancer or just statically configure two or three of their Kafka hosts in the clients.</p>

<p>The client does not need to keep polling to see if the cluster has changed; it can fetch metadata once when it is instantiated cache that metadata until it receives an error indicating that the metadata is out of date. This error can come in two forms: (1) a socket error indicating the client cannot communicate with a particular broker, (2) an error code in the response to a request indicating that this broker no longer hosts the partition for which data was requested.</p>
<ol>
    <li>Cycle through a list of "bootstrap" Kafka URLs until we find one we can connect to. Fetch cluster metadata.</li>
    <li>Process fetch or produce requests, directing them to the appropriate broker based on the topic/partitions they send to or fetch from.</li>
    <li>If we get an appropriate error, refresh the metadata and try again.</li>
</ol>

<h5><a id="protocol_partitioning_strategies" href="#protocol_partitioning_strategies">Partitioning Strategies</a></h5>

<p>As mentioned above the assignment of messages to partitions is something the producing client controls. That said, how should this functionality be exposed to the end-user?</p>

<p>Partitioning really serves two purposes in Kafka:</p>
<ol>
    <li>It balances data and request load over brokers</li>
    <li>It serves as a way to divvy up processing among consumer processes while allowing local state and preserving order within the partition. We call this semantic partitioning.</li>
</ol>

<p>For a given use case you may care about only one of these or both.</p>

<p>To accomplish simple load balancing a simple approach would be for the client to just round robin requests over all brokers. Another alternative, in an environment where there are many more producers than brokers, would be to have each client chose a single partition at random and publish to that. This later strategy will result in far fewer TCP connections.</p>

<p>Semantic partitioning means using some key in the message to assign messages to partitions. For example if you were processing a click message stream you might want to partition the stream by the user id so that all data for a particular user would go to a single consumer. To accomplish this the client can take a key associated with the message and use some hash of this key to choose the partition to which to deliver the message.</p>

<h5><a id="protocol_batching" href="#protocol_batching">Batching</a></h5>

<p>Our APIs encourage batching small things together for efficiency. We have found this is a very significant performance win. Both our API to send messages and our API to fetch messages always work with a sequence of messages not a single message to encourage this. A clever client can make use of this and support an "asynchronous" mode in which it batches together messages sent individually and sends them in larger clumps. We go even further with this and allow the batching across multiple topics and partitions, so a produce request may contain data to append to many partitions and a fetch request may pull data from many partitions all at once.</p>

<p>The client implementer can choose to ignore this and send everything one at a time if they like.</p>

<h5><a id="protocol_compatibility" href="#protocol_compatibility">Versioning and Compatibility</a></h5>

<p>The protocol is designed to enable incremental evolution in a backward compatible fashion. Our versioning is on a per API basis, each version consisting of a request and response pair. Each request contains an API key that identifies the API being invoked and a version number that indicates the format of the request and the expected format of the response.</p>

<p>The intention is that clients will support a range of API versions. When communicating with a particular broker, a given client should use the highest API version supported by both and indicate this version in their requests.</p>

<p>The server will reject requests with a version it does not support, and will always respond to the client with exactly the protocol format it expects based on the version it included in its request. The intended upgrade path is that new features would first be rolled out on the server (with the older clients not making use of them) and then as newer clients are deployed these new features would gradually be taken advantage of.</p>

<p>Our goal is primarily to allow API evolution in an environment where downtime is not allowed and clients and servers cannot all be changed at once.</p>

<p>Currently all versions are baselined at 0, as we evolve these APIs we will indicate the format for each version individually.</p>

<h5><a id="api_versions" href="#api_versions">Retrieving Supported API versions</a></h5>
<p>In order to work against multiple broker versions, clients need to know what versions of various APIs a
    broker supports. The broker exposes this information since 0.10.0.0 as described in <a href="https://cwiki.apache.org/confluence/display/KAFKA/KIP-35+-+Retrieving+protocol+version">KIP-35</a>.
    Clients should use the supported API versions information to choose the highest API version supported by both client and broker. If no such version
    exists, an error should be reported to the user.</p>
<p>The following sequence may be used by a client to obtain supported API versions from a broker.</p>
<ol>
    <li>Client sends <code>ApiVersionsRequest</code> to a broker after connection has been established with the broker. If SSL is enabled,
        this happens after SSL connection has been established.</li>
    <li>On receiving <code>ApiVersionsRequest</code>, a broker returns its full list of supported ApiKeys and
        versions regardless of current authentication state (e.g., before SASL authentication on an SASL listener, do note that no
        Kafka protocol requests may take place on a SSL listener before the SSL handshake is finished). If this is considered to
        leak information about the broker version a workaround is to use SSL with client authentication which is performed at an
        earlier stage of the connection where the <code>ApiVersionRequest</code> is not available. Also, note that broker versions older
        than 0.10.0.0 do not support this API and will either ignore the request or close connection in response to the request.</li>
    <li>If multiple versions of an API are supported by broker and client, clients are recommended to use the latest version supported
        by the broker and itself.</li>
    <li>Deprecation of a protocol version is done by marking an API version as deprecated in the protocol documentation.</li>
    <li>Supported API versions obtained from a broker are only valid for the connection on which that information is obtained.
        In the event of disconnection, the client should obtain the information from the broker again, as the broker might have been
        upgraded/downgraded in the mean time.</li>
</ol>

<h5><a id="sasl_handshake" href="#sasl_handshake">SASL Authentication Sequence</a></h5>
<p>The following sequence is used for SASL authentication:
<ol>
  <li>Kafka <code>ApiVersionsRequest</code> may be sent by the client to obtain the version ranges of requests supported by the broker. This is optional.</li>
  <li>Kafka <code>SaslHandshakeRequest</code> containing the SASL mechanism for authentication is sent by the client. If the requested mechanism is not enabled
    in the server, the server responds with the list of supported mechanisms and closes the client connection. If the mechanism is enabled
    in the server, the server sends a successful response and continues with SASL authentication.</li>
  <li>The actual SASL authentication is now performed. If <code>SaslHandshakeRequest</code> version is v0, a series of SASL client and server tokens corresponding to the mechanism are sent
     as opaque packets without wrapping the messages with Kafka protocol headers. If <code>SaslHandshakeRequest</code> version is v1, the <code>SaslAuthenticate</code>
     request/response are used, where the actual SASL tokens are wrapped in the Kafka protocol. The error code in the final message from the broker will indicate if authentication succeeded or failed.</li>
  <li>If authentication succeeds, subsequent packets are handled as Kafka API requests. Otherwise, the client connection is closed.</li>
</ol>
<p>For interoperability with 0.9.0.x clients, the first packet received by the server is handled as a SASL/GSSAPI client token if it is not a valid
Kafka request. SASL/GSSAPI authentication is performed starting with this packet, skipping the first two steps above.</p>


<h4><a id="protocol_details" href="#protocol_details">The Protocol</a></h4>

<h5><a id="protocol_types" href="#protocol_types">Protocol Primitive Types</a></h5>

<p>The protocol is built out of the following primitive types.</p>
<!--#include virtual="generated/protocol_types.html" -->

<h5><a id="protocol_grammar" href="#protocol_grammar">Notes on reading the request format grammars</a></h5>

<p>The <a href="https://en.wikipedia.org/wiki/Backus%E2%80%93Naur_Form">BNF</a>s below give an exact context free grammar for the request and response binary format. The BNF is intentionally not compact in order to give human-readable name. As always in a BNF a sequence of productions indicates concatenation. When there are multiple possible productions these are separated with '|' and may be enclosed in parenthesis for grouping. The top-level definition is always given first and subsequent sub-parts are indented.</p>

<h5><a id="protocol_common" href="#protocol_common">Common Request and Response Structure</a></h5>

<p>All requests and responses originate from the following grammar which will be incrementally describe through the rest of this document:</p>

<pre class="line-numbers"><code class="language-java">
RequestOrResponse => Size (RequestMessage | ResponseMessage)
  Size => int32
</code></pre>

<table class="data-table"><tbody>
<tr><th>Field</th><th>Description</th></tr>
<tr><td>message_size</td><td>The message_size field gives the size of the subsequent request or response message in bytes. The client can read requests by first reading this 4 byte size as an integer N, and then reading and parsing the subsequent N bytes of the request.</td></tr>
</table>

<h5><a id="protocol_recordbatch" href="#protocol_recordbatch">Record Batch</a></h5>
<p>A description of the record batch format can be found <a href="/documentation/#recordbatch">here</a>.</p>

<h4><a id="protocol_constants" href="#protocol_constants">Constants</a></h4>

<h5><a id="protocol_error_codes" href="#protocol_error_codes">Error Codes</a></h5>
<p>We use numeric codes to indicate what problem occurred on the server. These can be translated by the client into exceptions or whatever the appropriate error handling mechanism in the client language. Here is a table of the error codes currently in use:</p>
<!--#include virtual="generated/protocol_errors.html" -->

<h5><a id="protocol_api_keys" href="#protocol_api_keys">Api Keys</a></h5>
<p>The following are the numeric codes that the ApiKey in the request can take for each of the below request types.</p>
<!--#include virtual="generated/protocol_api_keys.html" -->

<h4><a id="protocol_messages" href="#protocol_messages">The Messages</a></h4>

<p>This section gives details on each of the individual API Messages, their usage, their binary format, and the meaning of their fields.</p>
<!--#include virtual="generated/protocol_messages.html" -->

<h4><a id="protocol_philosophy" href="#protocol_philosophy">Some Common Philosophical Questions</a></h4>

<p>Some people have asked why we don't use HTTP. There are a number of reasons, the best is that client implementors can make use of some of the more advanced TCP features--the ability to multiplex requests, the ability to simultaneously poll many connections, etc. We have also found HTTP libraries in many languages to be surprisingly shabby.</p>

<p>Others have asked if maybe we shouldn't support many different protocols. Prior experience with this was that it makes it very hard to add and test new features if they have to be ported across many protocol implementations. Our feeling is that most users don't really see multiple protocols as a feature, they just want a good reliable client in the language of their choice.</p>

<p>Another question is why we don't adopt XMPP, STOMP, AMQP or an existing protocol. The answer to this varies by protocol, but in general the problem is that the protocol does determine large parts of the implementation and we couldn't do what we are doing if we didn't have control over the protocol. Our belief is that it is possible to do better than existing messaging systems have in providing a truly distributed messaging system, and to do this we need to build something that works differently.</p>

<p>A final question is why we don't use a system like Protocol Buffers or Thrift to define our request messages. These packages excel at helping you to managing lots and lots of serialized messages. However we have only a few messages. Support across languages is somewhat spotty (depending on the package). Finally the mapping between binary log format and wire protocol is something we manage somewhat carefully and this would not be possible with these systems. Finally we prefer the style of versioning APIs explicitly and checking this to inferring new values as nulls as it allows more nuanced control of compatibility.</p>

    <script>
        // Show selected style on nav item
        $(function() { $('.b-nav__project').addClass('selected'); });
    </script>

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