blob: a9de36a48b683a39f3fbb8c5844954c30d25c28f [file] [log] [blame]
<!DOCTYPE html>
<html lang="stable" class="js csstransforms3d">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta name="generator" content="Hugo 0.81.0" />
<meta name="description" content="A set of micro-services for connecting millions of devices.">
<meta name="author" content="The Eclipse Hono Project">
<link rel="apple-touch-icon" sizes="180x180" href="/hono/docs/favicon/apple-touch-icon.png">
<link rel="icon" type="image/png" sizes="48x48" href="/hono/docs/favicon/favicon-48x48.png">
<link rel="icon" type="image/png" sizes="32x32" href="/hono/docs/favicon/favicon-32x32.png">
<link rel="icon" type="image/png" sizes="16x16" href="/hono/docs/favicon/favicon-16x16.png">
<link rel="manifest" href="/hono/docs/favicon/site.webmanifest">
<link rel="mask-icon" href="/hono/docs/favicon/safari-pinned-tab.svg" color="#5bbad5">
<link rel="shortcut icon" href="/hono/docs/favicon/favicon.ico">
<meta name="msapplication-TileColor" content="#da532c">
<meta name="msapplication-config" content="/hono/docs/favicon/browserconfig.xml">
<meta name="theme-color" content="#ffffff">
<title>Kafka-based APIs :: Eclipse Hono&trade;</title>
<link href="/hono/docs/css/nucleus.css?1626138713" rel="stylesheet">
<link href="/hono/docs/css/fontawesome-all.min.css?1626138713" rel="stylesheet">
<link href="/hono/docs/css/hybrid.css?1626138713" rel="stylesheet">
<link href="/hono/docs/css/featherlight.min.css?1626138713" rel="stylesheet">
<link href="/hono/docs/css/perfect-scrollbar.min.css?1626138713" rel="stylesheet">
<link href="/hono/docs/css/auto-complete.css?1626138713" rel="stylesheet">
<link href="/hono/docs/css/atom-one-dark-reasonable.css?1626138713" rel="stylesheet">
<link href="/hono/docs/css/theme.css?1626138713" rel="stylesheet">
<link href="/hono/docs/css/hugo-theme.css?1626138713" rel="stylesheet">
<link href="/hono/docs/css/theme-hono.css?1626138713" rel="stylesheet">
<link href="/hono/docs/css/hono.css?1626138713" rel="stylesheet">
<script src="/hono/docs/js/jquery-3.3.1.min.js?1626138713"></script>
<style>
:root #header + #content > #left > #rlblock_left{
display:none !important;
}
:not(pre) > code + span.copy-to-clipboard {
display: none;
}
</style>
<link rel="stylesheet" href="https://www.eclipse.org/eclipse.org-common/themes/solstice/public/stylesheets/vendor/cookieconsent/cookieconsent.min.css">
<meta name="twitter:card" content="summary_large_image">
<meta name="twitter:site" content="@EclipseHono">
<meta name="twitter:title" content="Kafka-based APIs :: Eclipse Hono&amp;trade;">
<meta name="twitter:image" content="https://www.eclipse.org/hono/docs/images/twitter_image.png">
<meta name="twitter:description" content="A set of micro-services for connecting millions of devices.">
<meta property="og:title" content="Kafka-based APIs :: Eclipse Hono&amp;trade;" />
<meta property="og:type" content="website" />
<meta property="og:url" content="https://www.eclipse.org/hono/docs/api/kafka-api//" />
<meta property="og:image" content="https://www.eclipse.org/hono/docs/images/twitter_image.png" />
</head>
<body class="" data-url="/hono/docs/api/kafka-api/">
<nav id="sidebar" class="">
<div id="header-wrapper">
<div id="header">
<a href="https://www.eclipse.org/hono/">
<img src="/hono/docs/images/HONO-Logo_Bild-Wort_quer-w-310x120px.svg" alt="Hono logo" class="logo-img">
</a>
</div>
<div class="searchbox">
<label for="search-by"><i class="fas fa-search"></i></label>
<input data-search-input id="search-by" type="search" placeholder="Search...">
<span data-search-clear=""><i class="fas fa-times"></i></span>
</div>
<script type="text/javascript" src="/hono/docs/js/lunr.min.js?1626138713"></script>
<script type="text/javascript" src="/hono/docs/js/auto-complete.js?1626138713"></script>
<script type="text/javascript">
var baseurl = "https:\/\/www.eclipse.org\/hono\/docs\/";
</script>
<script type="text/javascript" src="/hono/docs/js/search.js?1626138713"></script>
</div>
<div class="highlightable">
<ul class="topics">
<li data-nav-id="/hono/docs/concepts/" title="Concepts" class="dd-item
">
<a href="/hono/docs/concepts/">
<i class="far fa-lightbulb"></i> Concepts
</a>
<ul>
<li data-nav-id="/hono/docs/concepts/device-identity/" title="Device Identity" class="dd-item ">
<a href="/hono/docs/concepts/device-identity/">
Device Identity
</a>
</li>
<li data-nav-id="/hono/docs/concepts/tenancy/" title="Multi-Tenancy" class="dd-item ">
<a href="/hono/docs/concepts/tenancy/">
Multi-Tenancy
</a>
</li>
<li data-nav-id="/hono/docs/concepts/device-provisioning/" title="Device Provisioning" class="dd-item ">
<a href="/hono/docs/concepts/device-provisioning/">
Device Provisioning
</a>
</li>
<li data-nav-id="/hono/docs/concepts/connecting-devices/" title="Connecting Devices" class="dd-item ">
<a href="/hono/docs/concepts/connecting-devices/">
Connecting Devices
</a>
</li>
<li data-nav-id="/hono/docs/concepts/device-notifications/" title="Device Notifications" class="dd-item ">
<a href="/hono/docs/concepts/device-notifications/">
Device Notifications
</a>
</li>
<li data-nav-id="/hono/docs/concepts/command-and-control/" title="Command &amp; Control" class="dd-item ">
<a href="/hono/docs/concepts/command-and-control/">
Command &amp; Control
</a>
</li>
<li data-nav-id="/hono/docs/concepts/resource-limits/" title="Resource limits" class="dd-item ">
<a href="/hono/docs/concepts/resource-limits/">
Resource limits
</a>
</li>
<li data-nav-id="/hono/docs/concepts/connection-events/" title="Connection Events" class="dd-item ">
<a href="/hono/docs/concepts/connection-events/">
Connection Events
</a>
</li>
</ul>
</li>
<li data-nav-id="/hono/docs/user-guide/" title="User Guide" class="dd-item
">
<a href="/hono/docs/user-guide/">
<i class="fas fa-book-reader"></i> User Guide
</a>
<ul>
<li data-nav-id="/hono/docs/user-guide/mongodb-based-device-registry/" title="MongoDB Based Device Registry" class="dd-item ">
<a href="/hono/docs/user-guide/mongodb-based-device-registry/">
MongoDB Based Device Registry
</a>
</li>
<li data-nav-id="/hono/docs/user-guide/jdbc-based-device-registry/" title="JDBC Based Device Registry" class="dd-item ">
<a href="/hono/docs/user-guide/jdbc-based-device-registry/">
JDBC Based Device Registry
</a>
</li>
<li data-nav-id="/hono/docs/user-guide/file-based-device-registry/" title="File Based Device Registry" class="dd-item ">
<a href="/hono/docs/user-guide/file-based-device-registry/">
File Based Device Registry
</a>
</li>
<li data-nav-id="/hono/docs/user-guide/http-adapter/" title="HTTP Adapter" class="dd-item ">
<a href="/hono/docs/user-guide/http-adapter/">
HTTP Adapter
</a>
</li>
<li data-nav-id="/hono/docs/user-guide/mqtt-adapter/" title="MQTT Adapter" class="dd-item ">
<a href="/hono/docs/user-guide/mqtt-adapter/">
MQTT Adapter
</a>
</li>
<li data-nav-id="/hono/docs/user-guide/amqp-adapter/" title="AMQP Adapter" class="dd-item ">
<a href="/hono/docs/user-guide/amqp-adapter/">
AMQP Adapter
</a>
</li>
<li data-nav-id="/hono/docs/user-guide/coap-adapter/" title="CoAP Adapter" class="dd-item ">
<a href="/hono/docs/user-guide/coap-adapter/">
CoAP Adapter
</a>
</li>
<li data-nav-id="/hono/docs/user-guide/kura-adapter/" title="Kura Adapter" class="dd-item ">
<a href="/hono/docs/user-guide/kura-adapter/">
Kura Adapter
</a>
</li>
<li data-nav-id="/hono/docs/user-guide/sigfox-adapter/" title="Sigfox Adapter" class="dd-item ">
<a href="/hono/docs/user-guide/sigfox-adapter/">
Sigfox Adapter
</a>
</li>
</ul>
</li>
<li data-nav-id="/hono/docs/admin-guide/" title="Admin Guide" class="dd-item
">
<a href="/hono/docs/admin-guide/">
<i class="fas fa-sliders-h"></i> Admin Guide
</a>
<ul>
<li data-nav-id="/hono/docs/admin-guide/common-config/" title="Common Configuration" class="dd-item ">
<a href="/hono/docs/admin-guide/common-config/">
Common Configuration
</a>
</li>
<li data-nav-id="/hono/docs/admin-guide/auth-server-config/" title="Auth Server Configuration" class="dd-item ">
<a href="/hono/docs/admin-guide/auth-server-config/">
Auth Server Configuration
</a>
</li>
<li data-nav-id="/hono/docs/admin-guide/mongodb-device-registry-config/" title="MongoDB Based Device Registry Configuration" class="dd-item ">
<a href="/hono/docs/admin-guide/mongodb-device-registry-config/">
MongoDB Based Device Registry Configuration
</a>
</li>
<li data-nav-id="/hono/docs/admin-guide/jdbc-device-registry-config/" title="JDBC Based Device Registry Configuration" class="dd-item ">
<a href="/hono/docs/admin-guide/jdbc-device-registry-config/">
JDBC Based Device Registry Configuration
</a>
</li>
<li data-nav-id="/hono/docs/admin-guide/file-based-device-registry-config/" title="File Based Device Registry Configuration" class="dd-item ">
<a href="/hono/docs/admin-guide/file-based-device-registry-config/">
File Based Device Registry Configuration
</a>
</li>
<li data-nav-id="/hono/docs/admin-guide/command-router-config/" title="Configuring the Command Router Service" class="dd-item ">
<a href="/hono/docs/admin-guide/command-router-config/">
Command Router Service Configuration
</a>
</li>
<li data-nav-id="/hono/docs/admin-guide/device-connection-config/" title="Configuring the Device Connection Service" class="dd-item ">
<a href="/hono/docs/admin-guide/device-connection-config/">
Device Connection Service Configuration
</a>
</li>
<li data-nav-id="/hono/docs/admin-guide/http-adapter-config/" title="HTTP Adapter Configuration" class="dd-item ">
<a href="/hono/docs/admin-guide/http-adapter-config/">
HTTP Adapter Configuration
</a>
</li>
<li data-nav-id="/hono/docs/admin-guide/mqtt-adapter-config/" title="MQTT Adapter Configuration" class="dd-item ">
<a href="/hono/docs/admin-guide/mqtt-adapter-config/">
MQTT Adapter Configuration
</a>
</li>
<li data-nav-id="/hono/docs/admin-guide/amqp-adapter-config/" title="AMQP Adapter Configuration" class="dd-item ">
<a href="/hono/docs/admin-guide/amqp-adapter-config/">
AMQP Adapter Configuration
</a>
</li>
<li data-nav-id="/hono/docs/admin-guide/coap-adapter-config/" title="CoAP Adapter Configuration" class="dd-item ">
<a href="/hono/docs/admin-guide/coap-adapter-config/">
CoAP Adapter Configuration
</a>
</li>
<li data-nav-id="/hono/docs/admin-guide/kura-adapter-config/" title="Kura Adapter Configuration" class="dd-item ">
<a href="/hono/docs/admin-guide/kura-adapter-config/">
Kura Adapter Configuration
</a>
</li>
<li data-nav-id="/hono/docs/admin-guide/hono-client-configuration/" title="Hono Client Configuration" class="dd-item ">
<a href="/hono/docs/admin-guide/hono-client-configuration/">
Hono Client Configuration
</a>
</li>
<li data-nav-id="/hono/docs/admin-guide/hono-kafka-client-configuration/" title="Hono Kafka Client Configuration" class="dd-item ">
<a href="/hono/docs/admin-guide/hono-kafka-client-configuration/">
Hono Kafka Client Configuration
</a>
</li>
<li data-nav-id="/hono/docs/admin-guide/amqp-network-config/" title="AMQP 1.0 Messaging Network Configuration" class="dd-item ">
<a href="/hono/docs/admin-guide/amqp-network-config/">
AMQP 1.0 Messaging Network Configuration
</a>
</li>
<li data-nav-id="/hono/docs/admin-guide/secure_communication/" title="Secure Communication" class="dd-item ">
<a href="/hono/docs/admin-guide/secure_communication/">
Secure Communication
</a>
</li>
<li data-nav-id="/hono/docs/admin-guide/monitoring-tracing-config/" title="Monitoring &amp; Tracing" class="dd-item ">
<a href="/hono/docs/admin-guide/monitoring-tracing-config/">
Monitoring &amp; Tracing
</a>
</li>
</ul>
</li>
<li data-nav-id="/hono/docs/dev-guide/" title="Developer Guide" class="dd-item
">
<a href="/hono/docs/dev-guide/">
<i class="fas fa-tools"></i> Developer Guide
</a>
<ul>
<li data-nav-id="/hono/docs/dev-guide/building_hono/" title="Building from Source" class="dd-item ">
<a href="/hono/docs/dev-guide/building_hono/">
Building from Source
</a>
</li>
<li data-nav-id="/hono/docs/dev-guide/amqp_adapter_client/" title="AMQP Adapter Client for Java" class="dd-item ">
<a href="/hono/docs/dev-guide/amqp_adapter_client/">
AMQP Adapter Client for Java
</a>
</li>
<li data-nav-id="/hono/docs/dev-guide/java_client_consumer/" title="Consuming Messages from Java" class="dd-item ">
<a href="/hono/docs/dev-guide/java_client_consumer/">
Consuming Messages from Java
</a>
</li>
<li data-nav-id="/hono/docs/dev-guide/custom_http_adapter/" title="Implement a Custom Hono HTTP Protocol Adapter" class="dd-item ">
<a href="/hono/docs/dev-guide/custom_http_adapter/">
Implement a Custom Hono HTTP Protocol Adapter
</a>
</li>
</ul>
</li>
<li data-nav-id="/hono/docs/api/" title="API" class="dd-item
parent
">
<a href="/hono/docs/api/">
&nbsp;<i class='fas fa-plug'></i>&nbsp;API
</a>
<ul>
<li data-nav-id="/hono/docs/api/telemetry/" title="Telemetry API Specification" class="dd-item ">
<a href="/hono/docs/api/telemetry/">
Telemetry API
</a>
</li>
<li data-nav-id="/hono/docs/api/event/" title="Event API Specification" class="dd-item ">
<a href="/hono/docs/api/event/">
Event API
</a>
</li>
<li data-nav-id="/hono/docs/api/command-and-control/" title="Command &amp; Control API Specification" class="dd-item ">
<a href="/hono/docs/api/command-and-control/">
Command &amp; Control API
</a>
</li>
<li data-nav-id="/hono/docs/api/kafka-api/" title="Kafka-based APIs" class="dd-item active">
<a href="/hono/docs/api/kafka-api/">
Kafka-based APIs
</a>
</li>
<li data-nav-id="/hono/docs/api/telemetry-kafka/" title="Telemetry API for Kafka Specification" class="dd-item ">
<a href="/hono/docs/api/telemetry-kafka/">
Telemetry API for Kafka
</a>
</li>
<li data-nav-id="/hono/docs/api/event-kafka/" title="Event API for Kafka Specification" class="dd-item ">
<a href="/hono/docs/api/event-kafka/">
Event API for Kafka
</a>
</li>
<li data-nav-id="/hono/docs/api/command-and-control-kafka/" title="Command &amp; Control API for Kafka Specification" class="dd-item ">
<a href="/hono/docs/api/command-and-control-kafka/">
Command &amp; Control API for Kafka
</a>
</li>
<li data-nav-id="/hono/docs/api/tenant/" title="Tenant API Specification" class="dd-item ">
<a href="/hono/docs/api/tenant/">
Tenant API
</a>
</li>
<li data-nav-id="/hono/docs/api/command-router/" title="Command Router API Specification" class="dd-item ">
<a href="/hono/docs/api/command-router/">
Command Router API
</a>
</li>
<li data-nav-id="/hono/docs/api/device-connection/" title="Device Connection API Specification" class="dd-item ">
<a href="/hono/docs/api/device-connection/">
Device Connection API
</a>
</li>
<li data-nav-id="/hono/docs/api/device-registration/" title="Device Registration API Specification" class="dd-item ">
<a href="/hono/docs/api/device-registration/">
Device Registration API
</a>
</li>
<li data-nav-id="/hono/docs/api/credentials/" title="Credentials API Specification" class="dd-item ">
<a href="/hono/docs/api/credentials/">
Credentials API
</a>
</li>
<li data-nav-id="/hono/docs/api/authentication/" title="Authentication API Specification" class="dd-item ">
<a href="/hono/docs/api/authentication/">
Authentication API
</a>
</li>
<li data-nav-id="/hono/docs/api/management/" title="Device Registry Management API Specification" class="dd-item ">
<a href="/hono/docs/api/management/">
Device Registry Management API
</a>
</li>
<li data-nav-id="/hono/docs/api/metrics/" title="Metrics" class="dd-item ">
<a href="/hono/docs/api/metrics/">
Metrics
</a>
</li>
</ul>
</li>
<li data-nav-id="/hono/docs/deployment/" title="Deployment" class="dd-item
">
<a href="/hono/docs/deployment/">
<i class="fas fa-shipping-fast"></i> Deployment
</a>
<ul>
<li data-nav-id="/hono/docs/deployment/helm-based-deployment/" title="Helm based Deployment" class="dd-item ">
<a href="/hono/docs/deployment/helm-based-deployment/">
Helm based Deployment
</a>
</li>
<li data-nav-id="/hono/docs/deployment/openshift/" title="OpenShift / OKD" class="dd-item ">
<a href="/hono/docs/deployment/openshift/">
OpenShift / OKD
</a>
</li>
<li data-nav-id="/hono/docs/deployment/create-kubernetes-cluster/" title="Setting up a Kubernetes Cluster" class="dd-item ">
<a href="/hono/docs/deployment/create-kubernetes-cluster/">
Setting up a Kubernetes Cluster
</a>
</li>
<li data-nav-id="/hono/docs/deployment/resource-limitation/" title="Limiting Resource Usage" class="dd-item ">
<a href="/hono/docs/deployment/resource-limitation/">
Limiting Resource Usage
</a>
</li>
</ul>
</li>
<li data-nav-id="/hono/docs/architecture/" title="Architecture" class="dd-item
">
<a href="/hono/docs/architecture/">
<i class="fas fa-landmark"></i> Architecture
</a>
<ul>
<li data-nav-id="/hono/docs/architecture/component-view/" title="Component View" class="dd-item ">
<a href="/hono/docs/architecture/component-view/">
Component View
</a>
</li>
<li data-nav-id="/hono/docs/architecture/auth/" title="Authentication/Authorization" class="dd-item ">
<a href="/hono/docs/architecture/auth/">
Authentication/Authorization
</a>
</li>
</ul>
</li>
</ul>
<section id="shortcuts">
<h3></h3>
<ul>
<li>
<a class="padding" href="https://www.eclipse.org/hono/" title="Hono&#39;s Homepage"><i class='fas fa-home'></i> Hono Home</a>
</li>
<li>
<a class="padding" href="https://www.eclipse.org/hono/getting-started/" title="Getting started with Eclipse Hono"><i class='fas fa-plane-departure'></i> Getting Started</a>
</li>
</ul>
</section>
<section id="prefooter">
<hr/>
<ul>
<li>
<div id="select-box-wrapper">
<div id="select-box">
<a class="padding">
Version:&nbsp;
<div class="select-style">
<select id="select-language" onchange="location = this.value;">
<option id="stable" value="https://www.eclipse.org/hono/docs/api/kafka-api/" selected>stable (1.8)</option>
<option id="1.8" value="https://www.eclipse.org/hono/docs/1.8/api/kafka-api/">1.8</option>
<option id="1.7" value="https://www.eclipse.org/hono/docs/1.7/api/kafka-api/">1.7</option>
<option id="1.6" value="https://www.eclipse.org/hono/docs/1.6/api/kafka-api/">1.6</option>
<option id="dev" value="https://www.eclipse.org/hono/docs/dev/api/kafka-api/">dev</option>
</select>
<svg version="1.1" id="Capa_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
width="255px" height="255px" viewBox="0 0 255 255" style="enable-background:new 0 0 255 255;" xml:space="preserve">
<g>
<g id="arrow-drop-down">
<polygon points="0,63.75 127.5,191.25 255,63.75 " />
</g>
</g>
</svg>
</div>
</a>
</div>
</div>
</li>
</ul>
</section>
<section id="footer">
<p>&copy; 2021 <a href="https://www.eclipse.org/hono/">The Eclipse Hono Project</a></p>
<p>
Documentation built with
<a href="https://gohugo.io/" target="_blank">Hugo</a>
using the
<a href="https://github.com/matcornic/hugo-theme-learn" target="_blank">Learn</a> theme.
</p>
<div class="eclipse-logo">
<a href="https://www.eclipse.org" target="_blank">
<img src="https://www.eclipse.org/hono/docs/images/eclipse_foundation_logo.svg"/>
</a>
</div>
</section>
</div>
</nav>
<section id="body">
<div id="overlay"></div>
<div class="padding highlightable">
<div>
<div id="top-bar">
<div id="top-github-link">
<a class="github-link" title='Edit this page' href="https://github.com/eclipse/hono/edit/master/site/documentation/content/api/kafka-api/index.md" target="blank">
<i class="fas fa-code-branch"></i>
<span id="top-github-link-text">Edit this page</span>
</a>
</div>
<div id="breadcrumbs" itemscope="" itemtype="http://data-vocabulary.org/Breadcrumb">
<span id="sidebar-toggle-span">
<a href="#" id="sidebar-toggle" data-sidebar-toggle="">
<i class="fas fa-bars"></i>
</a>
</span>
<span id="toc-menu"><i class="fas fa-list-alt"></i></span>
<span class="links">
<a href='/hono/docs/'>Documentation</a> > <a href='/hono/docs/api/'>API</a> > Kafka-based APIs
</span>
</div>
<div class="progress">
<div class="wrapper">
<nav id="TableOfContents">
<ul>
<li><a href="#kafka-based-messaging">Kafka-based Messaging</a>
<ul>
<li><a href="#quality-of-service">Quality of Service</a></li>
<li><a href="#message-ordering">Message Ordering</a></li>
<li><a href="#at-least-once-producers">AT LEAST ONCE Producers</a></li>
<li><a href="#at-most-once-producers">AT MOST ONCE Producers</a></li>
</ul>
</li>
</ul>
</nav>
</div>
</div>
</div>
</div>
<div id="head-tags">
</div>
<div id="body-inner">
<h1>
Kafka-based APIs
</h1>
<p>The Kafka-based APIs of Eclipse Honoâ„¢ provide an alternative to the existing APIs based on AMQP 1.0.
With these APIs, clients publish data to as well as consume data from an Apache Kafka® cluster instead of using an AMQP messaging network.</p>
<div class="alert alert-notice">
<h4 class="alert-heading"><i class="fas fa-info-circle"></i> Tech preview</h4>
<div>The support of Kafka as a messaging system is currently a preview and not yet ready for production. The APIs are subject to change without prior notice.</div>
</div>
<h2 id="kafka-based-messaging">Kafka-based Messaging</h2>
<p>Using Kafka instead of AMQP comes with slightly different behavior. Kafka provides a Publish/Subscribe messaging style.
Every message is sent by a <em>producer</em> to a <em>topic</em> in a Kafka cluster, where it will be persisted by (multiple) <em>brokers</em>.
Each topic consists of a configurable number of <em>partitions</em>. The <em>key</em> of a message determines to which partition it will be written.
Each partition is <em>replicated</em> to a configurable number of brokers in the cluster to provide fault-tolerance if a broker goes down.</p>
<p>A Kafka message (also called record) consists of a key, a value, a timestamp, and headers.</p>
<p>Multiple <em>consumers</em> can read the messages at the same time and they can read them repeatedly (if an error occurred).
This decoupling of producer and consumers has the consequence that a producer does not get feedback about the consumption of messages,
it does not know <em>if</em> and <em>when</em> a message will be read by any consumer(s).
For example, a protocol adapter can only confirm to the device that the Kafka cluster successfully persisted a telemetry message,
not if a <em>Business Application</em> received it.</p>
<p>Messages are usually deleted from a topic at some point – regardless of whether they have been processed by a consumer.
Care should therefore be taken to set each topic&rsquo;s <em>log retention time</em> to a reasonable value in the Kafka configuration.</p>
<p>See the <a href="https://kafka.apache.org/documentation/#configuration">Kafka documentation</a> for details about Kafka&rsquo;s configuration properties.</p>
<h3 id="quality-of-service">Quality of Service</h3>
<p>The Kafka client&rsquo;s <a href="https://kafka.apache.org/documentation/#acks"><em>acks</em></a> configuration property is used to
configure what acknowledgements a producer expects from the cluster for each message.
The value of this property determines the maximum <em>Quality of Service</em> level the producer can achieve.
Kafka supports the following settings:</p>
<ul>
<li><code>0</code>: the producer does not wait for any acknowledgements. This provides no guarantees.</li>
<li><code>1</code>: the producer requests only an acknowledgement from one broker. If the broker goes down before others finished
replication, then the message will be lost.</li>
<li><code>all</code> (or equivalent <code>-1</code>): the producer requests an acknowledgement that confirms that the message has successfully
been replicated to the required number of brokers. This guarantees that the message will not be lost as long as
at least one of the replicas remains alive.</li>
</ul>
<h3 id="message-ordering">Message Ordering</h3>
<p>For each <em>partition</em> of a topic, Kafka guarantees that consumers receive messages in the same order that the producer
has written them to the partition. Hono&rsquo;s protocol adapters, therefore, use the device identifier as the key when
writing messages to downstream topics, thus making sure that messages originating from the same device always end up
in the same partition.
For example, each protocol adapter must always send telemetry data reported by a particular device to the same partition
(e.g. by using the same <a href="https://kafka.apache.org/documentation/#partitioner.class">partitioner</a> implementation)
in the same order that they have been received in.</p>
<p>The following producer configuration properties influence if the order of the messages can be guaranteed by Kafka:</p>
<ul>
<li><a href="https://kafka.apache.org/documentation/#retries"><em>retries</em></a></li>
<li><a href="https://kafka.apache.org/documentation/#max.in.flight.requests.per.connection"><em>max.in.flight.requests.per.connection</em></a></li>
<li><a href="https://kafka.apache.org/documentation/#enable.idempotence"><em>enable.idempotence</em></a></li>
</ul>
<p>Setting <em>acks</em> to <code>0</code> effectively disables retries. If <em>retries</em> are set to a value greater than zero and
<em>max.in.flight.requests.per.connection</em> is set to a value greater than <code>1</code>, Kafka no longer guarantees that messages
are stored in the order they have been sent.
The only exception is the <em>idempotent</em> producer, which can handle <em>max.in.flight.requests.per.connection</em> to be up to <code>5</code>
with retries enabled while still maintaining the message order (since Kafka version 1.0.0).
Note that the <em>idempotent</em> producer option requires special privileges for the producer&rsquo;s user to be configured.</p>
<h3 id="at-least-once-producers">AT LEAST ONCE Producers</h3>
<p>To provide <em>AT LEAST ONCE</em> delivery semantics, a producer MUST wait for the acknowledgements from all <em>in-sync replicas</em>
before sending the acknowledgement back to the client.
This can be achieved e.g. by setting <em>acks</em> to <code>all</code> or, implicitly, by setting <em>enable.idempotence</em> to <code>true</code>.</p>
<p>The producer MUST retain the order in which it received messages from a client.
This requires that if <em>retries</em> is set to a value greater than zero, <em>max.in.flight.requests.per.connection</em> must be set to <code>1</code>.
Alternatively, <em>enable.idempotence</em> can be set to <code>true</code>.
Disabling retries might cause messages to fail in case of high load or transient transmission failures, so this is not recommended.</p>
<p>The recommended configuration for <em>AT LEAST ONCE</em> producers has the following properties:
<code>enable.idempotence=true</code>, <code>acks=all</code>, <code>max.in.flight.requests.per.connection=5</code>, leaving <em>retries</em> unset (which defaults to <code>Integer.MAX</code>),
and setting <em>delivery.timeout.ms</em> to a reasonable value. This configuration is supported from Kafka version 1.0.0 on.</p>
<h3 id="at-most-once-producers">AT MOST ONCE Producers</h3>
<p>Every producer that does not wait for acknowledgements from all <em>in-sync replicas</em> or does not consider them before sending
an acknowledgement back to the client, is considered to provide only <em>AT MOST ONCE</em> delivery semantics.
To achieve this, several strategies are possible:</p>
<ol>
<li>The producer can disable acknowledgements (<code>acks=0</code>). This is the fastest mode of delivery but has the drawback of a potential loss of messages without notice.</li>
<li>The producer can enable acknowledgements, but not wait for the acknowledgements from the Kafka cluster before acknowledging the message to <em>its</em> client.</li>
</ol>
<p>The producer MUST retain the order in which it received messages from a client.
This requires to either set <em>retries</em> to <code>0</code> or to set <em>max.in.flight.requests.per.connection</em> to <code>1</code>.</p>
<p><strong>NB:</strong> To send messages with both delivery semantics with the same producer, it MUST be configured for <em>AT LEAST ONCE</em>.
Such a producer may ignore the outcome of the <em>produce</em> operation for <em>AT MOST ONCE</em> messages.</p>
<footer class="footline">
</footer>
</div>
</div>
<div id="navigation">
</div>
</section>
<div style="left: -1000px; overflow: scroll; position: absolute; top: -1000px; border: none; box-sizing: content-box; height: 200px; margin: 0px; padding: 0px; width: 200px;">
<div style="border: none; box-sizing: content-box; height: 200px; margin: 0px; padding: 0px; width: 200px;"></div>
</div>
<script src="/hono/docs/js/clipboard.min.js?1626138714"></script>
<script src="/hono/docs/js/perfect-scrollbar.min.js?1626138714"></script>
<script src="/hono/docs/js/perfect-scrollbar.jquery.min.js?1626138714"></script>
<script src="/hono/docs/js/jquery.sticky.js?1626138714"></script>
<script src="/hono/docs/js/featherlight.min.js?1626138714"></script>
<script src="/hono/docs/js/highlight.pack.js?1626138714"></script>
<script>hljs.initHighlightingOnLoad();</script>
<script src="/hono/docs/js/modernizr.custom-3.6.0.js?1626138714"></script>
<script src="/hono/docs/js/learn.js?1626138714"></script>
<script src="/hono/docs/js/hugo-learn.js?1626138714"></script>
<link href="/hono/docs/mermaid/mermaid.css?1626138714" rel="stylesheet" />
<script src="/hono/docs/mermaid/mermaid.js?1626138714"></script>
<script>
mermaid.initialize({ startOnLoad: true });
</script>
<script>
(function(w,d,s,l,i){w[l]=w[l]||[];w[l].push({'gtm.start':
new Date().getTime(),event:'gtm.js'});var f=d.getElementsByTagName(s)[0],
j=d.createElement(s),dl=l!='dataLayer'?'&l='+l:'';j.async=true;j.src=
'https://www.googletagmanager.com/gtm.js?id='+i+dl;f.parentNode.insertBefore(j,f);
})(window,document,'script','dataLayer','GTM-5WLCZXC');
</script>
<script src="https://www.eclipse.org/eclipse.org-common/themes/solstice/public/javascript/vendor/cookieconsent/default.min.js"></script>
</body>
</html>