Python
Confluent-Kafka
JSON Messages
Programming
Message Consumption

How to send and consume json messages using confluent-kafka in Python

System Design practice on Codemia

Work through 120+ system design problems with detailed solutions, from rate limiters to multi-region storage.

Practice system design

Confluent Kafka, which is based on Apache Kafka, is a popular choice for handling real-time data feeds. Its ability to handle high-throughput and low-latency messaging makes it essential in modern data architectures. Python, with its simplicity and powerful libraries, is commonly used to interact with Confluent Kafka. Specifically, the confluent_kafka Python library provides a robust and performant way to produce and consume JSON messages.

Sending JSON Messages with Confluent Kafka in Python

Setup and Configuration

To start, you’ll need to install the Confluent Kafka Python client. You can do this via pip:

bash
pip install confluent_kafka

Next, you need to configure the producer. Here are the essential configurations:

  • bootstrap.servers: Specifies the Kafka broker address.
  • client.id: Identifier of the producer/client.

Here is an example configuration:

python
1from confluent_kafka import Producer
2
3config = {
4    'bootstrap.servers': 'localhost:9092',
5    'client.id': 'client-1'
6}
7producer = Producer(**config)

Preparing the JSON Message

Since Kafka essentially deals with string or byte formats, you will need to serialize JSON data before sending it. You can use Python’s built-in json library for serialization:

python
1import json
2
3data = {"id": 101, "name": "Alice", "email": "[email protected]"}
4message = json.dumps(data).encode('utf-8')

Sending the Message

With the producer configured and the JSON message prepared, you can now send this message to a specific Kafka topic:

python
1topic = 'user-data'
2
3def acked(err, msg):
4    if err is not None:
5        print("Failed to deliver message: %s: %s" % (str(msg), str(err)))
6    else:
7        print("Message produced: %s" % (str(msg)))
8
9producer.produce(topic, message, callback=acked)
10
11# Wait up to 1 second for events. Callbacks will be invoked during
12# this method call if the message is acknowledged.
13producer.flush(1)

Consuming JSON Messages with Confluent Kafka in Python

Configuration

Similarly, to receive messages, configure the Kafka consumer:

python
1from confluent_kafka import Consumer
2
3config = {
4    'bootstrap.servers': 'localhost:9092',
5    'group.id': 'group-1',
6    'auto.offset.reset': 'earliest'
7}
8consumer = Consumer(**config)
9consumer.subscribe(['user-data'])

Fetching and Processing Messages

To read the messages, continuously poll the consumer and deserialize any incoming JSON message:

python
1import json
2
3try:
4    while True:
5        msg = consumer.poll(1.0)  # Wait for 1 second
6        if msg is None:
7            continue
8        if msg.error():
9            print("Consumer error: {}".format(msg.error()))
10            continue
11
12        data = json.loads(msg.value().decode('utf-8'))
13        print(f"Received message: {data}")
14finally:
15    consumer.close()

Key Points Overview

Here is a summary table of key points when working with confluent_kafka:

AspectProducerConsumer
PurposeSends messagesReceives messages
Installationpip install confluent_kafkapip install confluent_kafka
Key Configurationbootstrap.servers, client.idbootstrap.servers, group.id, auto.offset.reset
SerializationJSON to bytes using json.dumps().encode()Bytes to JSON using json.loads().decode()
Methodsproduce(), flush()poll(), close()

Additional Considerations

  • Error Handling: Implement robust error handling especially for network issues, serialization errors, or Kafka broker downtimes.
  • Message Encoding/Decoding: Always ensure that the message encoding during the produce matches the decoding during consume.
  • Performance: Handle batch processing when dealing with large volumes of data to optimize performance and resource usage.

Using Confluent Kafka with Python for JSON messaging involves setting up appropriate producers and consumers, careful handling of serialization, and implementing error handling and performance optimizations. This approach enables effective and efficient real-time data integration in your applications.


Related reading
Course
Beginner
27 lessons
10 hours
System Design Fundamentals

Build a strong foundation in designing scalable, reliable distributed systems.

View the course
Track what you have practised

A free account saves your progress, solutions and study plan across every problem on Codemia.

System Design practice on Codemia

Work through 120+ system design problems with detailed solutions, from rate limiters to multi-region storage.

Practice system design

All Rights Reserved.