Slide 1

Slide 1 text

Practical Tips & Tricks for Apache Kafka Messages Integration Francesco Tisiot - Developer Advocate @ftisiot

Slide 2

Slide 2 text

@ftisiot

Slide 3

Slide 3 text

@ftisiot Libraries

Slide 4

Slide 4 text

@ftisiot kafka-python pip install kafka-python Consume Admin Produce

Slide 5

Slide 5 text

@ftisiot confluent-kafka-python pip install confluent-kafka Schema Registry Avro Karapace

Slide 6

Slide 6 text

@ftisiot Connect

Slide 7

Slide 7 text

@ftisiot KafkaProducer( bootstrap_servers='kafka:1234', ) How many brokers?

Slide 8

Slide 8 text

@ftisiot KafkaProducer( bootstrap_servers='kafka:1234,kafka2:5678', )

Slide 9

Slide 9 text

@ftisiot KafkaProducer( bootstrap_servers='kafka:1234,kafka2:5678', security_protocol='SSL', ssl_cafile='ca.pem', ssl_certfile='service.cert', ssl_keyfile='service.key' ) SSL

Slide 10

Slide 10 text

@ftisiot Produce

Slide 11

Slide 11 text

@ftisiot producer = KafkaProducer( bootstrap_servers='kafka:1234,kafka2:5678', ) Minimal Setup

Slide 12

Slide 12 text

@ftisiot producer = KafkaProducer( bootstrap_servers='kafka:1234,kafka2:5678', value_serializer= lambda v: json.dumps(v).encode(‘ascii'), ) Data Conversion https://aiven.io/blog/tips-for-designing-payloads

Slide 13

Slide 13 text

@ftisiot producer = KafkaProducer( bootstrap_servers='kafka:1234,kafka2:5678', value_serializer= lambda v: json.dumps(v).encode('ascii'), acks=1, ) Confirmation [0,1,'all']

Slide 14

Slide 14 text

@ftisiot producer = KafkaProducer( bootstrap_servers='kafka:1234,kafka2:5678', value_serializer= lambda v: json.dumps(v).encode('ascii'), acks=1, retries=5, ) What do we do in case of Errors?

Slide 15

Slide 15 text

@ftisiot

Slide 16

Slide 16 text

@ftisiot producer = KafkaProducer( bootstrap_servers='kafka:1234,kafka2:5678', value_serializer= lambda v: json.dumps(v).encode('ascii'), acks=1, retries=5, max_in_flight_requests_per_connection=1 ) Avoids out of order messages

Slide 17

Slide 17 text

@ftisiot producer.send( 'my_shop_topic', key=b'Milan', value= { 'order_id': 1, 'product_name': 'Nutella Jar', 'quantity': 12 } ) batch_size

Slide 18

Slide 18 text

@ftisiot producer.flush(timeout=10)

Slide 19

Slide 19 text

@ftisiot KafkaTimeoutError: Failed to update metadata after 60.0 secs. Pushing to Non Existing Topic auto.create.topics.enable=true

Slide 20

Slide 20 text

@ftisiot Admin

Slide 21

Slide 21 text

@ftisiot from kafka.admin import KafkaAdminClient, NewTopic admin_client = KafkaAdminClient( bootstrap_servers='kafka:1234,kafka2:5678' ) topic_list = [ NewTopic( name='short-retention-topic', num_partitions=5, replication_factor=3, topic_configs={'retention.ms': 10000} )] admin_client.create_topics( new_topics=topic_list, validate_only=False )

Slide 22

Slide 22 text

@ftisiot Consume

Slide 23

Slide 23 text

@ftisiot consumer = KafkaConsumer( bootstrap_servers= 'kafka:1234,kafka2:5678' ) consumer.subscribe( topics=['testA'] ) for message in consumer: print(message.value)

Slide 24

Slide 24 text

@ftisiot auto_offset_reset='earliest'

Slide 25

Slide 25 text

@ftisiot consumer.subscribe( topics=['testA','testB'] )

Slide 26

Slide 26 text

@ftisiot consumer.subscribe( pattern='test*' ) consumer.subscribe( topics=['testA','testB'] ) metadata_max_age_ms

Slide 27

Slide 27 text

@ftisiot consumer = KafkaConsumer( bootstrap_servers='kafka:1234,kafka2:5678', )

Slide 28

Slide 28 text

@ftisiot consumer = KafkaConsumer( bootstrap_servers='kafka:1234,kafka2:5678', value_deserializer = lambda v: json.loads(v.decode('ascii')), )

Slide 29

Slide 29 text

@ftisiot consumer = KafkaConsumer( bootstrap_servers='kafka:1234,kafka2:5678', value_deserializer = lambda v: json.loads(v.decode('ascii')), auto_offset_reset='earliest', metadata_max_age_ms=10000, )

Slide 30

Slide 30 text

@ftisiot consumer = KafkaConsumer( bootstrap_servers='kafka:1234,kafka2:5678', value_deserializer = lambda v: json.loads(v.decode('ascii')), auto_offset_reset='earliest', metadata_max_age_ms=10000, group_id='snake-consumer-group', client_id='franz-snake' )

Slide 31

Slide 31 text

@ftisiot subscribe() assign()

Slide 32

Slide 32 text

@ftisiot consumer.subscribe(topics=['test']) group_id='snakes'

Slide 33

Slide 33 text

@ftisiot consumer.assign( [TopicPartition('test', 0)] )

Slide 34

Slide 34 text

@ftisiot Connect Produce Admin Consume

Slide 35

Slide 35 text

@ftisiot Resources https://aiven.io https://kafka-python.readthedocs.io/ https://aiven.io/blog/create-your-own-data-stream-for- kafka-with-python-and-faker kafka-summit-2021 500$