<!--
 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="https://kafka.apache.org/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_message_sets">Message Sets</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 would implement a particular version of the protocol, and indicate this version in their requests. 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>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>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 for a client to successfully talk to a broker, it must use request versions supported by the broker. Clients
        may work against multiple broker versions, however to do so the clients need to know what versions of various APIs a
        broker supports. Starting from 0.10.0.0, brokers provide information on various versions of APIs they support. Details
        of this new capability can be found <a href="https://cwiki.apache.org/confluence/display/KAFKA/KIP-35+-+Retrieving+protocol+version">here</a>.
        Clients may use the supported API versions information to take appropriate actions such as propagating an unsupported
        API version error to application or choose an API request/response version supported by both the client and broker.
        The following sequence maybe 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 protocol documentation.</li>
        <li>Supported API versions obtained from a broker, is valid only for current connection on which that information is obtained.
            In the event of disconnection, the client should obtain the information from broker again, as the broker might have
            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>The actual SASL authentication is now performed. A series of SASL client and server tokens corresponding to the mechanism are sent as opaque
        packets. These packets contain a 32-bit size followed by the token as defined by the protocol for the SASL mechanism.
      <li>If authentication succeeds, subsequent packets are handled as Kafka API requests. Otherwise, the client connection is closed.
    </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>

    <p><b>Fixed Width Primitives</b><p>

    <p>int8, int16, int32, int64 - Signed integers with the given precision (in bits) stored in big endian order.</p>

    <p><b>Variable Length Primitives</b><p>

    <p>bytes, string - These types consist of a signed integer giving a length N followed by N bytes of content. A length of -1 indicates null. string uses an int16 for its size, and bytes uses an int32.</p>

    <p><b>Arrays</b><p>

    <p>This is a notation for handling repeated structures. These will always be encoded as an int32 size containing the length N followed by N repetitions of the structure which can itself be made up of other primitive types. In the BNF grammars below we will show an array of a structure foo as [foo].</p>

    <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>
    RequestOrResponse => Size (RequestMessage | ResponseMessage)
    Size => int32
    </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_message_sets" href="#protocol_message_sets">Message Sets</a></h5>

    <p>A description of the message set format can be found <a href="https://cwiki.apache.org/confluence/display/KAFKA/A+Guide+To+The+Kafka+Protocol#AGuideToTheKafkaProtocol-Messagesets">here</a>. (KAFKA-3368)</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>

<!--#include virtual="../includes/_footer.htm" -->
<script>
// Show selected style on nav item
$(function() { $('.b-nav__project').addClass('selected'); });
</script>
