Skip to content

Instantly share code, notes, and snippets.

@vikram-bais
Last active April 2, 2023 09:16
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save vikram-bais/1df8b5360ad604066f78a54144bc5236 to your computer and use it in GitHub Desktop.
Save vikram-bais/1df8b5360ad604066f78a54144bc5236 to your computer and use it in GitHub Desktop.
kafka

Explaining Kafka Producer’s internal working, configurations, idempotent behavior and safe producer

In this blog, we deep-dive into Kafka producer’s architecture, its components, and configurations to help you understand the concept of Idempotent producer. We also discuss the notion of a safe producer and how it helps improve the performance of Kafka producer.

Let’s start by learning about the internal architectures of the Kafka producer and the various components involved in sending/delivering the messages to the Kafka broker (topic -partition).

Kafka Producer Architecture and Workflow

Components of Kafka Producer -

  • Send()- It adds the record to a buffer of pending records to be sent and returns immediately. This buffer of pending records helps to batch together individual records for efficiency.

  • Serializer- It helps serialize the key and the value objects that the user provides with their ProducerRecord into bytes.

  • Partitioner- Partition assignment to every ProducerRecord is done by the Partitioner. There are two types of partitioning strategies-

    • Round Robin Partitioning- This is used when the key is Null in ProducerRecord. Partitions are assigned in Round Robin fashion.
    • Hash Key-based Partitioning- This is used when ProducerRecord has a key. Partitions are determined based on the hash of the key for a particular message/value.
  • Buffer- A memory buffer of the unsent records is maintained by the producer for each partition. The size of the buffer can be set by the batch.size config.

  • I/O Threads- The background I/O thread is responsible for turning the records in the buffer into requests and transmitting them to the Kafka broker.

Note- Topic Partition can also be mentioned directly in the ProducerRecord. In that case, Round Robin and Hash Key Partitioning will not make any effect.

Let’s understand how these components work together

  • The process of sending messages to Kafka brokers starts with creating a ProducerRecord which has the topic-name and the message-value. Message-key and/or a partition can also be mentioned in the ProducerRecord. ProducerRecord is then sent using send().

  • Now, the ProducerRecord arrives at the serializer where the key and value are serialized into ByteArrays to travel/be sent over the network. Now, the ProducerRecord arrives at the partitioner.

  • If the partition is specified in the ProducerRecord, then the partitioner will return the same, otherwise, it will choose a partition for the message-value based on the partitioning strategy (Round Robin, Hash Key, or Custom Partitioning).

  • Once a partition is determined, the producer adds the message-value to a batch of records that will be sent to the same topic and partition. This batch of unsent records is maintained in the buffer-memory. Once the message arrives at the buffer memory, the send() returns and starts processing the next ProducerRecord.

  • A separate I/O thread is responsible for sending those batches of records as a request to the Kafka broker. When the broker successfully receives the messages, it will return a RecordMetadata object as response and it has the topic, partition, and offset of the record within the partition.

  • If the message fails to be received by the broker, it will return an error as a response, and the producer may retry sending the message a few more times (No. of retries) before giving up and returning the error.

  • Let’s analyze some of the important producer configurations Acks — The number of acknowledgments the producer requires the leader to have received before considering a request complete. The following settings are allowed:

    • acks = 0 -> The producer will not wait for any acknowledgment from the broker. Messages will be added to the buffer and considered sent. No assurance can be given that the message was received by the broker.
    • acks = 1-> The producer will wait for the acknowledgment only from the leader broker. No guarantee can be made that the message was received by the follower broker or that the message was replicated properly.
    • acks = all -> The producer will wait for the acknowledgment from the full set in-sync replicas (leaders + followers ). This guarantees that the record was received by all the in-sync brokers and as long as at least one in-sync replica broker remains alive, the message will not be lost.

Example — Let’s consider the following scenario -

No. of brokers = 3
Replication Factor = 3
min.insync.replicas = 2 (including leader), acks = all.

As the min.insync.replica is two, we can only tolerate one broker going down. If more than one broker goes down, the message may get lost and won't get served to the consumer. Also, setting acks to "1" or "all" may increase the latency since the producer needs to wait for the ack. Retries and Timeouts - retries =(some integer value) -> It represents the number of times the producer retries sending the message whose send() got failed. However, an issue while retrying is that the order of messages/requests may change.

max.in.flight.requests.per.connection -> The max number of requests that can be sent on a connection before blocking. Setting this value to 1 means that only one request will be sent at a time thus preserving the message order and hence the ordering issue caused by the retry is solved.

Recommended values based on Kafka versions → max.in.flight.requests.per.connection = 1 (0.11 >= Kafka < 1.1) OR 5 (Kafka >= 1.1). request.timeout.ms -> The amount of time the producer waits for the response of a request. The producer will consider the request as failed if the response is not received before the timeout elapses and begins to retry the request.

delivery.timeout.ms -> The upper bound on the time to consider the message delivery request a success or failure after a call to send() returns.

delivery timeout = time delay prior to sending + time to await ack + time for retries. retries.backoff.ms -> The amount of time to wait before attempting to retry a failed request to a given topic partition.

For achieving 'at-least-once-delivery', it is recommended to set:- acks = all and retries = Integer.MAX_VALUE (provided the replication factor and min.insync.replicas are properly set). Batching - batch.size ->This configuration controls the default batch size in bytes. The producer will attempt to batch multiple records together into fewer requests that are being sent to the same partition.

linger.ms -> Instead of sending a record as soon as possible, the producer will wait for linger.ms time before sending the record. This allows multiple records to be batched together.

Batch request will be sent to the broker based on the following scenarios:

  1. if batch.size worth of records arrive then a batch request will be sent.
  2. if batch.size worth of records are yet to accumulate , then it will linger for a specified amount of time for more records to shows up.

Also, batching and lingering can increase the latency of the record sent but can reduce the number of requests to the broker Buffer Memory - buffer.memory ->The total bytes of memory the producer can use to buffer records waiting to be sent to the server. This buffer is maintained for each topic partition.

max.block.ms->The configuration controls how long the Kafka producer’s send() methods will be allowed to remain blocked waiting for metadata fetch and buffer allocation.

max.block.ms = upper bound of allowed (waiting time for metadata fetch + waiting time for buffer allocation).

It throws an exception if the producer is in waiting state for more than max.block.ms. Compression - compression.type -> Compression type for a batch of multiple records can be set.

default : none (i.e. no compression).

Valid values : none , gzip , snappy , lz4 or zstd.

As compression is for the full batch of data (multiple records being sent to the same partition), the efficiency of batching will also impact the compression ratio (more batching = better compression).

Compression may consume some amount of CPU cycles. Reason for choosing the compression can be as follows —

  1. It will reduce the disk footprint and use a lesser amount of disk space.

  2. It will also reduce the request size which will lead to reduction in latency.

All these configurations can really help us tune the behavior of the Kafka producer to a good extent based upon our use-case requirements.

Idempotent Producer Let’s try to understand what an Idempotent producer is and what problems it solves.

Let’s suppose your Kafka producer doesn’t receive an acknowledgment (may be due to network failure) and retries the request even though the message was committed to the broker. In such a case, the producer retries will introduce duplicates, and duplicate messages will get committed to the broker.

This scenario depicts the need for Idempotency-1This scenario depicts the need for Idempotency

The idempotent producer solves the problem of duplicate messages and provides the 'exactly-once-delivery'. To make the Kafka producer idempotent, we just need to enable this configuration-

enable.idempotence = true

Enabling idempotency will automatically set the following configurations with the default values-

acks = all

retries = Integer.MAX_VALUE

max.in.flight.requests.per.connection = 1 (0.11 >= Kafka < 1.1) OR 5 (Kafka >= 1.1)

Lets try to understand how it achieves idempotency Idempotency for a message-1Idempotency for a message

For a particular session, the Kafka leader broker assigns a producer id(PID) to each producer. Also, the producer assigns a monotonically increasing sequence number (SqNo) to each message before sending it. The Kafka broker keeps track of the largest PID-SqNo combination on a per partition basis. When a lower sequence number is received, it is discarded and that’s how it avoids duplicate messages.

The configuration acks = all and retries = Integer.MAX_VALUE helps to achieve the ‘at-least-once-delivery’ of the message. Hence, that’s how an idempotent producer works and achieves the ‘exactly-once’ delivery of the message.

Note-

  1. Idempotent producer can not deduplicate the application level re-sends of duplicate messages.

  2. It can guarantee the ‘exactly-once’ delivery only for the messages sent within a single session.

Safe Producer For a producer to be called safe, the following factors can be taken into consideration-

The messages are delivered either exactly once or at least once.

Order of the messages should be maintained.

Messages should be durable or always be available to get served to the consumer.

We can set the below producer and broker/topic configurations in order to make our producer safe:

For Kafka < 0.11 -

acks = all (producer level)- Ensures data is properly replicated before an ack is received.

min.insync.replicas = 2 (broker / topic level)- Ensures two brokers in ISR (In Sync Replicas) have the data after an ack so that if one replica goes down, another replica will be available to get served.

retries = Integer.MAX_VALUE (producer level)- Ensures transient errors are retried indefinitely.

max.in.flight.requests.per.connection=1 (producer level)- Ensures only one request is tried at any time, preventing message re-ordering in any case of retries.

For Kafka >= 0.11 -

enable.idempotence =true (producer level)

Implies — acks = all , retries = Integer.MAX_VALUE , max.in.flight.requests.per.connection = 1 (0.11 >= Kafka < 1.1) OR 5 (Kafka >= 1.1)

min.insync.replicas = 2 (broker / topic level)

The above mentioned configurations for safe producer are for the ideal scenarios; where we are not considering real world scenarios which may impact the overall performance like in the below situations-

  1. application level message re-sends (duplicates).

  2. Leader broker goes down along with the follower broker (No replicas to get served to the consumer).

  3. Buffer memory leaks (Not enough buffer memory for batching).

  4. Latencies due to network bandwidth and/or request sending/ processing speed of the servers, etc.

Conclusion We learned the various producer configurations and their impacts on the behavior of Kafka Producer. We also discussed Idempotent and safe producer which helps improve the performance of the Kafka producer.

We hope this blog will help you make better decisions while configuring the Kafka producer. Learn how to manage Apache Kafka pragmatically with our blog here.

To get the best data engineering solutions, reach out to us at Clairvoyant.

References

https://kafka.apache.org/27/javadoc/index.html?org/apache/kafka/clients/producer/KafkaProducer.html

https://kafka.apache.org/27/javadoc/index.html?org/apache/kafka/clients/producer/KafkaProducer.html

https://kafka.apache.org/documentation/#producerconfigs

what is centralized way

  • stored in single location
  • disadv single point of failure

distributed

adv making replicas in multiple distributed location

distributed

  • dividing data into multiple locations
    • adv
      • failure in any node wont cause whole data loss
    • disadv
      • some data will get lost dure to failure in node (as total data is divided into multiple parts)
  • making replication of whole database/entitiy
    • adv
      • single or multiple node failure wont cause whole data loss
    • disadv
      • storage, expensive, data redunduncy

kafka is distributed message streaming platform

it can use both type of distributed technique we can set configuration according to our need

  • message streaming platform:
    • if we connections between multiple service in an org then there will be too many connections need to do this
    • to solve this problem msp is used
    • the services whoch wants to make connection with other service or want to send data to other service will produce their data in a central messaging system then from that messaging system the service who need data will consume data

1 1 2 -> 2 3 3

source system = 3 destination system = 3

without messageing sstem

  • total connections = 9 = (3x3) service from one side wants to send data to all service on other side

with messaging system

  • total connections = 6 messaging system: - it is responsibe for transferring data form one application to another application - so the applications can focus on data without metting mogged down on data transmission and sharing - distributed messaging is based on concept of reliable message queuign - message are queued asynhronously betn client application and messaging system - two types of messaging patterns - point to point (link) - In PTP model, one message is delivered to one receiver only. Here, Queue is used as a message oriented middleware (MOM). - The Queue is responsible to hold the message until receiver is ready. - In PTP model, there is no timing dependency between sender and receiver.(message wont get deleted, it will get commited only after reciver do consume that message) - after reciving the message ack is sent b yreciver to sender - pub - sub (link) - In Pub/Sub model, one message is delivered to all the subscribers. - It is like broadcasting. Here, Topic is used as a message oriented middleware that is responsible to hold and deliver messages. - In PTP model, there is timing dependency between publisher and subscriber. - here is time limit for the data/ records which is configurable on reacing time limit that data will get deleted - sender doesn't send back ack to the sender after revicing/comitting the data/record

what is kafka ?

topics

  • set of messages belongs to particular category are pushed in one topic
  • a stream of messages belongings to a particular category is called topic
  • it is logical feed name to which record are published
  • unique identifier for the topic is its name which is unique accross whole kafka cluster
  • similar to table in database
  • we can create any number of topic in kafka

partition

  • topics are split into partition
  • partitions are distribute into brokers in round robin pattern
  • all the messages within a partition are ordered and immutable
  • each message within partition has unique key associated with it known as offset

Replica and replication

  • replicas are backup of a partition (taking copy of partition and storing it to other broker)
  • if one broker is down then our data is safey stored in other brokers
  • replica are never read or write data (messages are alwasy produced on original partitions not their replicas)
  • they are used to prevent dataloss (fault tolorance)

Producer

  • producer can both produce data in topic level(all partitions of topic) and partition level (specific partitions of topic)
  • in topic level it can send data in all partition in round robin manner
  • producer are the applications which write/publish data to the topics within cluster using the producing APIs

consumer

  • these are application who consumes data from topic
  • both topic level(from all partitions using round robin) and partition level (specific partitions)
  • consumers are always associated with exactly one consumer group
  • a consumer group is group of related consumers that perform a task.

Broker

  • brokers are simple software processes who maintains and manage the published messages
  • also known as kafka servers
  • brokers also manages the consuers offsets and are responsible for the delivery of messages to the right consumers
  • a set of brocker who are communicating with each other to eprform the management and maintenance task are collectively known ad kafkfa cluster
  • we can add more brokers in a already running kafka cluster without any downtime
  • Every partition (replica) has one server acting as a leader and the rest of them as followers. The leader replica handles all read-write requests for the specific partition and the followers replicate the leader. If the lead server fails, one of the follower servers becomes the leader by default. You should strive to have a good balance of leaders so each broker is a leader of an equal amount of partitions to distribute the load.

zookeeepr

  • it is used to monitor kafka coluster and co-ordinate with each broker

  • keesp all the meta data information related to kafka cluster in the form of key-value pair

  • meta data includes

    • configuration information
    • health status of each broker
  • it is used for the controlelr election within kafka cluster

  • a set of zookeepers nodes working together to manage other distributed system is known zookeeper cluster or zookeeper ensemble

horizantal scaling means adding new nodes

vertical scaling means adding more power to the CPU

Scalability

  • The scalability of an application can be measured by the number of requests it can effectively support simultaneously. The point at which an application can no longer handle additional requests effectively is the limit of its scalability. This limit is reached when a critical hardware resource runs out, requiring different or more machines. Scaling these resources can include any combination of adjustments to CPU and physical memory (different or more machines), hard disk (bigger hard drives, less “live” data, solid state drives), and/or the network bandwidth (multiple network interface controllers, bigger NICs, fiber, etc.).

  • Scaling horizontally and scaling vertically are similar in that they both involve adding computing resources to your infrastructure. There are distinct differences between the two in terms of implementation and performance.

  • What’s the main difference? Horizontal scaling means scaling by adding more machines to your pool of resources (also described as “scaling out”), whereas vertical scaling refers to scaling by adding more power (e.g. CPU, RAM) to an existing machine (also described as “scaling up”).

  • One of the fundamental differences between the two is that horizontal scaling requires breaking a sequential piece of logic into smaller pieces so that they can be executed in parallel across multiple machines. In many respects, vertical scaling is easier because the logic really doesn’t need to change. Rather, you’re just running the same code on higher-spec machines. However, there are many other factors to consider when determining the appropriate approach.

kafka feature

  • scalable: horizantal scaling is done by adding new brokers to the exixting cluster

  • fault tolerance: it can handle multiple node failures, as copy of data are present on other brokers also

  • durable: kafka uses distributed commit log which means messages persists on disk as fast as possible (means troughput is high)

  • performance: kafka has high troughput for both consuming and producing

  • no data loss: data wont get loss till it doesnt get commited

  • zero downtime: if brocker is down then producer-consumer can communicate through help of other brokers

  • relaiblity :

kafka apis

  • producer apis
  • consumer apis
  • streams apis
  • connector apis
  • admin apis

Description link

Kafka topics are divided into a number of partitions, which contain records in an unchangeable sequence. Each record in a partition is assigned and identified by its unique offset. A topic can also have multiple partition logs. This allows multiple consumers to read from a topic in parallel.

Partitions allow topics to be parallelized by splitting the data into a particular topic across multiple brokers.

In Kafka, replication is implemented at the partition level. The redundant unit of a topic partition is called a replica. Each partition usually has one or more replicas meaning that partitions contain messages that are replicated over a few Kafka brokers in the cluster.

Every partition (replica) has one server acting as a leader and the rest of them as followers. The leader replica handles all read-write requests for the specific partition and the followers replicate the leader. If the lead server fails, one of the follower servers becomes the leader by default. You should strive to have a good balance of leaders so each broker is a leader of an equal amount of partitions to distribute the load.

When a producer publishes a record to a topic, it is published to its leader. The leader appends the record to its commit log and increments its record offset. Kafka only exposes a record to a consumer after it has been committed and each piece of data that comes in will be stacked on the cluster.

A producer must know which partition to write to, this is not up to the broker. It's possible for the producer to attach a key to the record dictating the partition the record should go to. All records with the same key will arrive at the same partition. Before a producer can send any records, it has to request metadata about the cluster from the broker. The metadata contains information on which broker is the leader for each partition and a producer always writes to the partition leader. The producer then uses the key to know which partition to write to, the default implementation is to use the hash of the key to calculate partition, you can also skip this step and specify partition yourself.

A common error when publishing records is setting the same key or null key for all records, which results in all records ending up in the same partition and you get an unbalanced topic.

https://www.clairvoyant.ai/blog/unleash-kafka-producers-architecture-and-internal-workings

Kafka Demo

bin/zkServer.sh

bin/zkServer.sh start-foreground

bin/zkServer.sh start

bin/zkServer.sh stop

bin/zkServer.sh status

echo stat | nc localhost 2181

echo stat | nc localhost 2181

echo dump | nc localhost 2181 | grep brokers

tail -f logs/zookeeper-vikram-server-vikram.out

bin/kafka-server-start.sh config/server.properties

bin/kafka-server-stop.sh

bin/kafka-server-start.sh -daemon config/server.properties

tail -f logs/server.log

create topic

./bin/kafka-topics.sh --bootstrap-server localhost:9092 --create --topic mytopic1 --partitions 1 --replication-factor 1

list all topics

./bin/kafka-topics.sh --bootstrap-server localhost:9092 --list

describe topic

./bin/kafka-topics.sh --bootstrap-server localhost:9092 --describe --topic mytopic1

./bin/kafka-consumer-groups.sh --bootstrap-server localhost:9092 --list

./bin/kafka-consumer-groups.sh --bootstrap-server localhost:9092 --group console-consumer-53927 --describe

what is centralized way

  • stored in single location
  • disadv single point of failure

distributed

adv making replicas in multiple distributed location

distributed

  • dividing data into multiple locations
    • adv
      • failure in any node wont cause whole data loss
    • disadv
      • some data will get lost dure to failure in node (as total data is divided into multiple parts)
  • making replication of whole database/entitiy
    • adv
      • single or multiple node failure wont cause whole data loss
    • disadv
      • storage, expensive, data redunduncy

kafka is distributed message streaming platform

it can use both type of distributed technique we can set configuration according to our need

  • message streaming platform:
    • if we connections between multiple service in an org then there will be too many connections need to do this
    • to solve this problem msp is used
    • the services whoch wants to make connection with other service or want to send data to other service will produce their data in a central messaging system then from that messaging system the service who need data will consume data

1 1 2 -> 2 3 3

source system = 3 destination system = 3

without messageing sstem

  • total connections = 9 = (3x3) service from one side wants to send data to all service on other side

with messaging system

  • total connections = 6 messaging system: - it is responsibe for transferring data form one application to another application
    • so the applications can focus on data without metting mogged down on data transmission and sharing
    • distributed messaging is based on concept of reliable message queuign
    • message are queued asynhronously betn client application and messaging system
    • two types of messaging patterns
      • point to point (link)
        • In PTP model, one message is delivered to one receiver only. Here, Queue is used as a message oriented middleware (MOM).
        • The Queue is responsible to hold the message until receiver is ready.
        • In PTP model, there is no timing dependency between sender and receiver.(message wont get deleted, it will get commited only after reciver do consume that message)
        • after reciving the message ack is sent b yreciver to sender
      • pub - sub (link)
        • In Pub/Sub model, one message is delivered to all the subscribers.
        • It is like broadcasting. Here, Topic is used as a message oriented middleware that is responsible to hold and deliver messages.
        • In pub/sub model, there is timing dependency between publisher and subscriber.
        • here is time limit for the data/ records which is configurable on reacing time limit that data will get deleted
        • sender doesn't send back ack to the sender after revicing/comitting the data/record

what is kafka ?

topics

  • set of messages belongs to particular category are pushed in one topic
  • a stream of messages belongings to a particular category is called topic
  • it is logical feed name to which record are published
  • unique identifier for the topic is its name which is unique accross whole kafka cluster
  • similar to table in database
  • we can create any number of topic in kafka

partition

  • topics are split into partition
  • partitions are distribute into brokers in round robin pattern
  • all the messages within a partition are ordered and immutable
  • each message within partition has unique key associated with it known as offset

Replica and replication

  • replicas are backup of a partition (taking copy of partition and storing it to other broker)
  • if one broker is down then our data is safey stored in other brokers
  • replica are never read or write data (messages are alwasy produced on original partitions not their replicas)
  • they are used to prevent dataloss (fault tolorance)

Producer

  • producer can both produce data in topic level(all partitions of topic) and partition level (specific partitions of topic)
  • in topic level it can send data in all partition in round robin manner
  • producer are the applications which write/publish data to the topics within cluster using the producing APIs

consumer

  • these are application who consumes data from topic
  • both topic level(from all partitions using round robin) and partition level (specific partitions)
  • consumers are always associated with exactly one consumer group
  • a consumer group is group of related consumers that perform a task.

Broker

  • brokers are simple software processes who maintains and manage the published messages
  • also known as kafka servers
  • brokers also manages the consuers offsets and are responsible for the delivery of messages to the right consumers
  • a set of brocker who are communicating with each other to eprform the management and maintenance task are collectively known ad kafkfa cluster
  • we can add more brokers in a already running kafka cluster without any downtime

zookeeepr

  • it is used to monitor kafka coluster and co-ordinate with each broker

  • keesp all the meta data information related to kafka cluster in the form of key-value pair

  • meta data includes

    • configuration information
    • health status of each broker
  • it is used for the controlelr election within kafka cluster

  • a set of zookeepers nodes working together to manage other distributed system is known zookeeper cluster or zookeeper ensemble

horizantal scaling means adding new nodes

vertical scaling means adding more power to the CPU

Scalability

  • The scalability of an application can be measured by the number of requests it can effectively support simultaneously. The point at which an application can no longer handle additional requests effectively is the limit of its scalability. This limit is reached when a critical hardware resource runs out, requiring different or more machines. Scaling these resources can include any combination of adjustments to CPU and physical memory (different or more machines), hard disk (bigger hard drives, less “live” data, solid state drives), and/or the network bandwidth (multiple network interface controllers, bigger NICs, fiber, etc.).

  • Scaling horizontally and scaling vertically are similar in that they both involve adding computing resources to your infrastructure. There are distinct differences between the two in terms of implementation and performance.

  • What’s the main difference? Horizontal scaling means scaling by adding more machines to your pool of resources (also described as “scaling out”), whereas vertical scaling refers to scaling by adding more power (e.g. CPU, RAM) to an existing machine (also described as “scaling up”).

  • One of the fundamental differences between the two is that horizontal scaling requires breaking a sequential piece of logic into smaller pieces so that they can be executed in parallel across multiple machines. In many respects, vertical scaling is easier because the logic really doesn’t need to change. Rather, you’re just running the same code on higher-spec machines. However, there are many other factors to consider when determining the appropriate approach.

kafka feature

  • scalable: horizantal scaling is done by adding new brokers to the exixting cluster

  • fault tolerance: it can handle multiple node failures, as copy of data are present on other brokers also

  • durable: kafka uses distributed commit log which means messages persists on disk as fast as possible (means troughput is high)

  • performance: kafka has high troughput for both consuming and producing

  • no data loss: data wont get loss till it doesnt get commited

  • zero downtime: if brocker is down then producer-consumer can communicate through help of other brokers

  • relaiblity :

kafka apis

  • producer apis
  • consumer apis
  • streams apis
  • connector apis
  • admin apis
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment