SlideShare a Scribd company logo
1
Exactly-Once Made Fast
Boyang Chen: Engineer@Confluent
Guozhang Wang: Engineer@Confluent
2
- Recap: exactly-once semantics (EOS) for Kafka
- What cost are we paying for EOS today
- Closing the gaps: usability and scalability
Overview
3
Back in 2017..
4
5
6
7
8
9
Commit
10
Commit
11
Commit
12
Commit
Atomic
13
The Kafka Approach for Exactly Once
1) Idempotent writes in order within a single topic partition
2) Transactional writes across multiple output topic partitions
3) Guarantee single writer for any input topic partitions
[KIP-98, KIP-129]
14
The Kafka Approach for Exactly Once
1) Idempotent writes in order within a single topic partition
2) Transactional writes across multiple output topic partitions
3) Guarantee single writer for any input topic partitions
[KIP-98, KIP-129]
15
Kafka Transactions
16
17
txn-status: non-exist, partitions: {}
18
txn-status: non-exist, partitions: {}
producer.initTxn();
19
txn-status: empty, partitions: {}
producer.initTxn();
non-exist
20
try {
producer.beginTxn();
records = consumer.poll();
for (Record rec <- records) {
// process ..
}
} catch (KafkaException e) {
}txn-status: empty, partitions: {}
producer.initTxn();
21
try {
producer.beginTxn();
records = consumer.poll();
for (Record rec <- records) {
// process ..
producer.send(“output”, ..);
}
} catch (KafkaException e) {
}txn-status: empty, partitions: {}
producer.initTxn();
22
try {
producer.beginTxn();
records = consumer.poll();
for (Record rec <- records) {
// process ..
producer.send(“output”, ..);
}
} catch (KafkaException e) {
}txn-status: on-going, partitions: {output-0}
producer.initTxn();
non-exist {}
23
try {
producer.beginTxn();
records = consumer.poll();
for (Record rec <- records) {
// process ..
producer.send(“output”, ..);
}
} catch (KafkaException e) {
}txn-status: on-going, partitions: {output-0}
producer.initTxn();
24
try {
producer.beginTxn();
records = consumer.poll();
for (Record rec <- records) {
// process ..
producer.send(“output”, ..);
}
} catch (KafkaException e) {
}txn-status: on-going, partitions: {output-0}
producer.initTxn();
25
try {
producer.beginTxn();
records = consumer.poll();
for (Record rec <- records) {
// process ..
producer.send(“output”, ..);
}
} catch (KafkaException e) {
}txn-status: on-going, partitions: {output-0}
producer.initTxn();
26
try {
producer.beginTxn();
records = consumer.poll();
for (Record rec <- records) {
// process ..
producer.send(“output”, ..);
}
producer.sendOffsets(..);
} catch (KafkaException e) {
}txn-status: on-going, partitions: {output-0}
producer.initTxn();
27
try {
producer.beginTxn();
records = consumer.poll();
for (Record rec <- records) {
// process ..
producer.send(“output”, ..);
}
producer.sendOffsets(..);
} catch (KafkaException e) {
}txn-status: on-going, partitions: {output-0, offset-0}
producer.initTxn();
{output-0}
28
try {
producer.beginTxn();
records = consumer.poll();
for (Record rec <- records) {
// process ..
producer.send(“output”, ..);
}
producer.sendOffsets(..);
producer.commitTxn();
} catch (KafkaException e) {
}txn-status: on-going, partitions: {output-0, offset-0}
producer.initTxn();
29
try {
producer.beginTxn();
records = consumer.poll();
for (Record rec <- records) {
// process ..
producer.send(“output”, ..);
}
producer.sendOffsets(..);
producer.commitTxn();
} catch (KafkaException e) {
}txn-status: prep-commit, partitions: {output-0, offset-0}
producer.initTxn();
on-going
30
try {
producer.beginTxn();
records = consumer.poll();
for (Record rec <- records) {
// process ..
producer.send(“output”, ..);
}
producer.sendOffsets(..);
producer.commitTxn();
} catch (KafkaException e) {
}txn-status: prep-commit, partitions: {output-0, offset-0}
producer.initTxn();
31
try {
producer.beginTxn();
records = consumer.poll();
for (Record rec <- records) {
// process ..
producer.send(“output”, ..);
}
producer.sendOffsets(..);
producer.commitTxn();
} catch (KafkaException e) {
}txn-status: prep-commit, partitions: {output-0, offset-0}
producer.initTxn();
32
try {
producer.beginTxn();
records = consumer.poll();
for (Record rec <- records) {
// process ..
producer.send(“output”, ..);
}
producer.sendOffsets(..);
producer.commitTxn();
} catch (KafkaException e) {
}txn-status: committed, partitions: {output-0, offset-0}
producer.initTxn();
prep-commit
33
try {
producer.beginTxn();
records = consumer.poll();
for (Record rec <- records) {
// process ..
producer.send(“output”, ..);
}
producer.sendOffsets(..);
producer.commitTxn();
} catch (KafkaException e) {
}txn-status: on-going, partitions: {output-0, offset-0}
producer.initTxn();
34
try {
producer.beginTxn();
records = consumer.poll();
for (Record rec <- records) {
// process ..
producer.send(“output”, ..);
}
producer.sendOffsets(..);
producer.commitTxn();
} catch (KafkaException e) {
producer.abortTxn();
}txn-status: on-going, partitions: {output-0, offset-0}
producer.initTxn();
35
try {
producer.beginTxn();
records = consumer.poll();
for (Record rec <- records) {
// process ..
producer.send(“output”, ..);
}
producer.sendOffsets(..);
producer.commitTxn();
} catch (KafkaException e) {
producer.abortTxn();
}txn-status: prep-abort, partitions: {output-0, offset-0}
producer.initTxn();
on-going
36
try {
producer.beginTxn();
records = consumer.poll();
for (Record rec <- records) {
// process ..
producer.send(“output”, ..);
}
producer.sendOffsets(..);
producer.commitTxn();
} catch (KafkaException e) {
producer.abortTxn();
}txn-status: prep-abort, partitions: {output-0, offset-0}
producer.initTxn();
37
try {
producer.beginTxn();
records = consumer.poll();
for (Record rec <- records) {
// process ..
producer.send(“output”, ..);
}
producer.sendOffsets(..);
producer.commitTxn();
} catch (KafkaException e) {
producer.abortTxn();
}txn-status: prep-abort, partitions: {output-0, offset-0}
producer.initTxn();
38
try {
producer.beginTxn();
records = consumer.poll();
for (Record rec <- records) {
// process ..
producer.send(“output”, ..);
}
producer.sendOffsets(..);
producer.commitTxn();
} catch (KafkaException e) {
producer.abortTxn();
}txn-status: aborted, partitions: {output-0, offset-0}
producer.initTxn();
prep-abort
39
The Kafka Approach for Exactly Once:
1) Idempotent writes in order within a single topic partition
2) Transactional writes across multiple output topic partitions
3) Guarantee single writer for any input topic partitions
40
41
42
At a given time, an input partition should only be processed by a single client
43
At a given time, an input partition should only be processed by a single client
Consumer Group
44
At a given time, an input partition should only be processed by a single client
Consumer Group
45
At a given time, an input partition should only be processed by a single client
Consumer Group
46
The “Single Writer” Fencing Problem
47
When Taking Over the Partition:
1) The previous txn must have completed commit or abort so there are no
concurrent transactions.
2) Other clients will be fenced write processing results for those input
partitions, a.k.a we have a “single writer”.
48
Transactional ID: defines single writer scope
1) Configured by the unique producer `transactional.id` property.
2) Enforced fencing by a monotonic epoch for each id.
3) Producer initialization await pending transaction completion.
49
Transactional ID: defines single writer scope
1) Configured by the unique producer `transactional.id` property.
2) Enforced fencing by a monotonic epoch for each id.
3) Producer initialization await pending transaction completion.
50
Transactional ID: defines single writer scope
1) Configured by the unique producer `transactional.id` property.
2) Enforced fencing by a monotonic epoch for each id.
3) Producer initialization await pending transaction completion.
51
Consumer Group
txn.Id = A, epoch = 1
txn.Id = B, epoch = 1
52
Consumer Group
txn.Id = A, epoch = 1
53
Consumer Group
txn.Id = A, epoch = 1
54
Consumer Group
txn.Id = A, epoch = 1
txn.Id = B, initializing...
55
Consumer Group
txn.Id = A, epoch = 1
txn.Id = B, epoch = 2
56
Consumer Group
txn.Id = A, epoch = 1
txn.Id = B, epoch = 2
Num. producer transaction IDs ~= num. input partitions
Producers need to be dynamically created when rebalance
57
EOS Scalability
58
Number of Input
Partitions
Growth of Producers
Number of
Applications
5 10 15 20 25 30
600
500
400
300
200
1
00
59
Number of Input
Partitions
At Least Once
Growth of Producers
Number of
Applications
5 10 15 20 25 30
600
500
400
300
200
1
00
60
Number of Input
Partitions
At Least Once
Growth of Producers
Number of
Applications
5 10 15 20 25 30
600
500
400
300
200
1
00
Exactly Once
61
KIP-447
62
What problems
are KIP-447
solving ?
63
What problems
are KIP-447
solving ?
● Make one producer per process model work
64
What problems
are KIP-447
solving ?
● Make one producer per process model work
● Unblock technical challenges
○ Offset commit fencing
○ Concurrent transaction
65
What problems
are KIP-447
solving ?
● Offset commit fencing
● Concurrent transaction
66
● We are fencing on the transactional producer side,
which assumes a static partition assignment
What problems
are KIP-447
solving ?
● Offset commit fencing
● Concurrent transaction
67
● We are fencing on the transactional producer side,
which assumes a static partition assignment
● Consumer group partition assignments are dynamic
in practice
What problems
are KIP-447
solving ?
● Offset commit fencing
● Concurrent transaction
68
69
70
71
72
73
74
● We are fencing on the transactional producer side,
which assumes a static partition assignment
● Consumer group partition assignments are dynamic
in practice
● Action: fence zombie producer commit
What problems
are KIP-447
solving ?
● Offset commit fencing
● Concurrent transaction
75
● We are fencing on the transactional producer side,
which assumes a static partition assignment
● Consumer group partition assignments are dynamic
in practice
● Action: fence zombie producer commit
○ Different from epoch fencing
○ Utilize consumer group generation ~= epoch
What problems
are KIP-447
solving ?
● Offset commit fencing
● Concurrent transaction
76
77
78
79
80
81
82
83
● We are fencing on the transactional producer side,
which assumes a static partition assignment
● Consumer group partition assignments are dynamic
in practice
● Action: fence zombie producer commit
○ Different from epoch fencing
○ Utilize consumer group generation ~= epoch
● Add new APIs
What problems
are KIP-447
solving ?
● Offset commit fencing
● Concurrent transaction
84
try {
producer.beginTxn();
records = consumer.poll();
for (Record rec <- records) {
// process ..
producer.send(“output”, ..);
}
producer.sendOffsets(offsets);
producer.commitTxn();
} catch (KafkaException e) {
}txn-status: on-going, partitions: {output, offset}
85
try {
producer.beginTxn();
records = consumer.poll();
for (Record rec <- records) {
// process ..
producer.send(“output”, ..);
}
producer.sendOffsets(offsets,
consumer.groupMetadata());
producer.commitTxn();
} catch (KafkaException e) {
}
txn-status: on-going, partitions: {output, offset}
86
● We are fencing on the transactional producer side,
which assumes a static partition assignment
● Consumer group partition assignments are dynamic
in practice
● Action: fence zombie producer commit
○ Different from epoch fencing
○ Utilize consumer group generation ~= epoch
● Add new APIs
○ Expose group generation through
consumer#groupMetadata()
○ Commit transaction with consumer metadata through
producer#sendOffsetsToTransaction(offsets,
groupMetadata)
What problems
are KIP-447
solving ?
● Offset commit fencing
● Concurrent transaction
87
What problems
are KIP-447
solving ?
● Offset commit fencing
● Concurrent transaction
88
What problems
are KIP-447
solving ?
● Offset commit fencing
● Concurrent transaction
● Only one open transaction allowed for each input
partition
89
What problems
are KIP-447
solving ?
● Offset commit fencing
● Concurrent transaction
● Only one open transaction allowed for each input
partition
● Offset commit is the only critical section
90
What problems
are KIP-447
solving ?
● Offset commit fencing
● Concurrent transaction
● Only one open transaction allowed for each input
partition
● Offset commit is the only critical section
○ Observed: Broker uses pending offsets to indicate
other ongoing transaction
91
What problems
are KIP-447
solving ?
● Offset commit fencing
● Concurrent transaction
● Only one open transaction allowed for each input
partition
● Offset commit is the only critical section
○ Observed: Broker uses pending offsets to indicate
other ongoing transaction
○ Observed: consumer always needs to fetch offset after
rebalance
92
What problems
are KIP-447
solving ?
● Offset commit fencing
● Concurrent transaction
● Only one open transaction allowed for each input
partition
● Offset commit is the only critical section
○ Observed: Broker uses pending offsets to indicate
other ongoing transaction
○ Observed: consumer always needs to fetch offset after
rebalance
○ Action: OffsetFetchRequest will back-off until pending
offsets are cleared, either by previous transaction
complete or timeout
93
94
95
96
97
98
99
447 Summary
100
447 Summary
● Resolve the semantic mismatch between producer
and consumer
○ Offset commit fencing
○ Concurrent transaction
101
447 Summary
● Resolve the semantic mismatch between producer
and consumer
○ Offset commit fencing
○ Concurrent transaction
● Make the one producer per processing unit possible
102
Number of Input
Partitions
At Least Once
Growth of Producers
Number of
Applications
5 10 15 20 25 30
600
500
400
300
200
1
00
Exactly Once
103
Number of Input
Partitions
At Least Once
Growth of Producers
Number of
Applications
5 10 15 20 25 30
600
500
400
300
200
1
00
Exactly Once
Exactly Once After 447
104
Scale Testing
105
Prove the 447 scalability improvement to
break the limit
- At_least_once
- Exactly_once
- Exactly_once_beta (post KIP-447 EOS)
Scale Testing
106
Scale Testing
107
Scale Testing
● Num.brokers = 3
● Num.input.partitions = 200
● Num.output.partitions = 100
● Test.interval.ms = 4 min
● Num.threads = 3
● Num.records.second = 1000
● Commit.interval.ms = 1 second
● Num.instances = 10, 20, 30...
108
Scale Testing
● Num.brokers = 3
● Num.input.partitions = 200
● Num.output.partitions = 100
● Test.interval.ms = 4 min
● Num.threads = 3
● Num.records.second = 1000
● Commit.interval.ms = 1 second
● Num.instances = 10, 20, 30...
109
Scale Testing
● At_least_once and
exactly_once_beta perform
steadily
● Exactly_once (pre KIP-447)
throughput degrades
significantly around 20-25
applications
110
Opt-in on Kafka Streams
111
Upgrade Procedure
112
Upgrade Procedure
● Rolling bounce brokers to >= Apache Kafka 2.5
113
Upgrade Procedure
● Rolling bounce brokers to >= Apache Kafka 2.5
● Upgrade the stream application binary and keep the
PROCESSING_GUARATNEE setting at "exactly_once". Do the first rolling
bounce, and make sure the group is stable with every instance on 2.6 binary.
114
Upgrade Procedure
● Rolling bounce brokers to >= Apache Kafka 2.5
● Upgrade the stream application binary and keep the
PROCESSING_GUARATNEE setting at "exactly_once". Do the first rolling
bounce, and make sure the group is stable with every instance on 2.6 binary.
● Upgrade the PROCESSING_GUARANTEE setting to "exactly_once_beta" and do
a second rolling bounce to start using new thread producer for EOS.
115
Conclusion
116
1. Walkthrough Kafka transaction model
117
1. Walkthrough Kafka transaction model
2. The usability and scalability issues with “single writer”
118
1. Walkthrough Kafka transaction model
2. The usability and scalability issues with “single writer”
3. How KIP-447 solves the challenges
119
1. Walkthrough Kafka transaction model
2. The usability and scalability issues with “single writer”
3. How KIP-447 solves the challenges
4. How to adopt KIP-447 in Kafka Streams
120
Thank you!
121
- KIP-98 - Exactly Once Delivery and Transactional
Messaging - Apache Kafka
- KIP-447: Producer scalability for exactly once
semantics - Apache Kafka
Resources
Ad

More Related Content

What's hot (20)

Exactly-once Stream Processing with Kafka Streams
Exactly-once Stream Processing with Kafka StreamsExactly-once Stream Processing with Kafka Streams
Exactly-once Stream Processing with Kafka Streams
Guozhang Wang
 
Stream Application Development with Apache Kafka
Stream Application Development with Apache KafkaStream Application Development with Apache Kafka
Stream Application Development with Apache Kafka
Matthias J. Sax
 
Kick your database_to_the_curb_reston_08_27_19
Kick your database_to_the_curb_reston_08_27_19Kick your database_to_the_curb_reston_08_27_19
Kick your database_to_the_curb_reston_08_27_19
confluent
 
Robust Operations of Kafka Streams
Robust Operations of Kafka StreamsRobust Operations of Kafka Streams
Robust Operations of Kafka Streams
confluent
 
Event stream processing using Kafka streams
Event stream processing using Kafka streamsEvent stream processing using Kafka streams
Event stream processing using Kafka streams
Fredrik Vraalsen
 
Event sourcing - what could possibly go wrong ? Devoxx PL 2021
Event sourcing  - what could possibly go wrong ? Devoxx PL 2021Event sourcing  - what could possibly go wrong ? Devoxx PL 2021
Event sourcing - what could possibly go wrong ? Devoxx PL 2021
Andrzej Ludwikowski
 
Achieving a 50% Reduction in Cross-AZ Network Costs from Kafka (Uday Sagar Si...
Achieving a 50% Reduction in Cross-AZ Network Costs from Kafka (Uday Sagar Si...Achieving a 50% Reduction in Cross-AZ Network Costs from Kafka (Uday Sagar Si...
Achieving a 50% Reduction in Cross-AZ Network Costs from Kafka (Uday Sagar Si...
confluent
 
What's the time? ...and why? (Mattias Sax, Confluent) Kafka Summit SF 2019
What's the time? ...and why? (Mattias Sax, Confluent) Kafka Summit SF 2019What's the time? ...and why? (Mattias Sax, Confluent) Kafka Summit SF 2019
What's the time? ...and why? (Mattias Sax, Confluent) Kafka Summit SF 2019
confluent
 
Introducing Exactly Once Semantics in Apache Kafka with Matthias J. Sax
Introducing Exactly Once Semantics in Apache Kafka with Matthias J. SaxIntroducing Exactly Once Semantics in Apache Kafka with Matthias J. Sax
Introducing Exactly Once Semantics in Apache Kafka with Matthias J. Sax
Databricks
 
Real Time Streaming Data with Kafka and TensorFlow (Yong Tang, MobileIron) Ka...
Real Time Streaming Data with Kafka and TensorFlow (Yong Tang, MobileIron) Ka...Real Time Streaming Data with Kafka and TensorFlow (Yong Tang, MobileIron) Ka...
Real Time Streaming Data with Kafka and TensorFlow (Yong Tang, MobileIron) Ka...
confluent
 
Flink Forward Berlin 2017: Robert Metzger - Keep it going - How to reliably a...
Flink Forward Berlin 2017: Robert Metzger - Keep it going - How to reliably a...Flink Forward Berlin 2017: Robert Metzger - Keep it going - How to reliably a...
Flink Forward Berlin 2017: Robert Metzger - Keep it going - How to reliably a...
Flink Forward
 
Building Scalable and Extendable Data Pipeline for Call of Duty Games: Lesson...
Building Scalable and Extendable Data Pipeline for Call of Duty Games: Lesson...Building Scalable and Extendable Data Pipeline for Call of Duty Games: Lesson...
Building Scalable and Extendable Data Pipeline for Call of Duty Games: Lesson...
Yaroslav Tkachenko
 
Kafka Summit SF 2017 - MultiCluster, MultiTenant and Hierarchical Kafka Messa...
Kafka Summit SF 2017 - MultiCluster, MultiTenant and Hierarchical Kafka Messa...Kafka Summit SF 2017 - MultiCluster, MultiTenant and Hierarchical Kafka Messa...
Kafka Summit SF 2017 - MultiCluster, MultiTenant and Hierarchical Kafka Messa...
confluent
 
Production Ready Kafka on Kubernetes (Devandra Tagare, Lyft) Kafka Summit SF ...
Production Ready Kafka on Kubernetes (Devandra Tagare, Lyft) Kafka Summit SF ...Production Ready Kafka on Kubernetes (Devandra Tagare, Lyft) Kafka Summit SF ...
Production Ready Kafka on Kubernetes (Devandra Tagare, Lyft) Kafka Summit SF ...
confluent
 
KSQL: Streaming SQL for Kafka
KSQL: Streaming SQL for KafkaKSQL: Streaming SQL for Kafka
KSQL: Streaming SQL for Kafka
confluent
 
Exactly Once Delivery with Kafka - Kafka Tel-Aviv Meetup
Exactly Once Delivery with Kafka - Kafka Tel-Aviv MeetupExactly Once Delivery with Kafka - Kafka Tel-Aviv Meetup
Exactly Once Delivery with Kafka - Kafka Tel-Aviv Meetup
Natan Silnitsky
 
Apache kafka meet_up_zurich_at_swissre_from_zero_to_hero_with_kafka_connect_2...
Apache kafka meet_up_zurich_at_swissre_from_zero_to_hero_with_kafka_connect_2...Apache kafka meet_up_zurich_at_swissre_from_zero_to_hero_with_kafka_connect_2...
Apache kafka meet_up_zurich_at_swissre_from_zero_to_hero_with_kafka_connect_2...
confluent
 
Actors or Not: Async Event Architectures
Actors or Not: Async Event ArchitecturesActors or Not: Async Event Architectures
Actors or Not: Async Event Architectures
Yaroslav Tkachenko
 
Serverless and Streaming: Building ‘eBay’ by ‘Turning the Database Inside Out’
Serverless and Streaming: Building ‘eBay’ by ‘Turning the Database Inside Out’ Serverless and Streaming: Building ‘eBay’ by ‘Turning the Database Inside Out’
Serverless and Streaming: Building ‘eBay’ by ‘Turning the Database Inside Out’
confluent
 
Apache Kafka: New Features That You Might Not Know About
Apache Kafka: New Features That You Might Not Know AboutApache Kafka: New Features That You Might Not Know About
Apache Kafka: New Features That You Might Not Know About
Yaroslav Tkachenko
 
Exactly-once Stream Processing with Kafka Streams
Exactly-once Stream Processing with Kafka StreamsExactly-once Stream Processing with Kafka Streams
Exactly-once Stream Processing with Kafka Streams
Guozhang Wang
 
Stream Application Development with Apache Kafka
Stream Application Development with Apache KafkaStream Application Development with Apache Kafka
Stream Application Development with Apache Kafka
Matthias J. Sax
 
Kick your database_to_the_curb_reston_08_27_19
Kick your database_to_the_curb_reston_08_27_19Kick your database_to_the_curb_reston_08_27_19
Kick your database_to_the_curb_reston_08_27_19
confluent
 
Robust Operations of Kafka Streams
Robust Operations of Kafka StreamsRobust Operations of Kafka Streams
Robust Operations of Kafka Streams
confluent
 
Event stream processing using Kafka streams
Event stream processing using Kafka streamsEvent stream processing using Kafka streams
Event stream processing using Kafka streams
Fredrik Vraalsen
 
Event sourcing - what could possibly go wrong ? Devoxx PL 2021
Event sourcing  - what could possibly go wrong ? Devoxx PL 2021Event sourcing  - what could possibly go wrong ? Devoxx PL 2021
Event sourcing - what could possibly go wrong ? Devoxx PL 2021
Andrzej Ludwikowski
 
Achieving a 50% Reduction in Cross-AZ Network Costs from Kafka (Uday Sagar Si...
Achieving a 50% Reduction in Cross-AZ Network Costs from Kafka (Uday Sagar Si...Achieving a 50% Reduction in Cross-AZ Network Costs from Kafka (Uday Sagar Si...
Achieving a 50% Reduction in Cross-AZ Network Costs from Kafka (Uday Sagar Si...
confluent
 
What's the time? ...and why? (Mattias Sax, Confluent) Kafka Summit SF 2019
What's the time? ...and why? (Mattias Sax, Confluent) Kafka Summit SF 2019What's the time? ...and why? (Mattias Sax, Confluent) Kafka Summit SF 2019
What's the time? ...and why? (Mattias Sax, Confluent) Kafka Summit SF 2019
confluent
 
Introducing Exactly Once Semantics in Apache Kafka with Matthias J. Sax
Introducing Exactly Once Semantics in Apache Kafka with Matthias J. SaxIntroducing Exactly Once Semantics in Apache Kafka with Matthias J. Sax
Introducing Exactly Once Semantics in Apache Kafka with Matthias J. Sax
Databricks
 
Real Time Streaming Data with Kafka and TensorFlow (Yong Tang, MobileIron) Ka...
Real Time Streaming Data with Kafka and TensorFlow (Yong Tang, MobileIron) Ka...Real Time Streaming Data with Kafka and TensorFlow (Yong Tang, MobileIron) Ka...
Real Time Streaming Data with Kafka and TensorFlow (Yong Tang, MobileIron) Ka...
confluent
 
Flink Forward Berlin 2017: Robert Metzger - Keep it going - How to reliably a...
Flink Forward Berlin 2017: Robert Metzger - Keep it going - How to reliably a...Flink Forward Berlin 2017: Robert Metzger - Keep it going - How to reliably a...
Flink Forward Berlin 2017: Robert Metzger - Keep it going - How to reliably a...
Flink Forward
 
Building Scalable and Extendable Data Pipeline for Call of Duty Games: Lesson...
Building Scalable and Extendable Data Pipeline for Call of Duty Games: Lesson...Building Scalable and Extendable Data Pipeline for Call of Duty Games: Lesson...
Building Scalable and Extendable Data Pipeline for Call of Duty Games: Lesson...
Yaroslav Tkachenko
 
Kafka Summit SF 2017 - MultiCluster, MultiTenant and Hierarchical Kafka Messa...
Kafka Summit SF 2017 - MultiCluster, MultiTenant and Hierarchical Kafka Messa...Kafka Summit SF 2017 - MultiCluster, MultiTenant and Hierarchical Kafka Messa...
Kafka Summit SF 2017 - MultiCluster, MultiTenant and Hierarchical Kafka Messa...
confluent
 
Production Ready Kafka on Kubernetes (Devandra Tagare, Lyft) Kafka Summit SF ...
Production Ready Kafka on Kubernetes (Devandra Tagare, Lyft) Kafka Summit SF ...Production Ready Kafka on Kubernetes (Devandra Tagare, Lyft) Kafka Summit SF ...
Production Ready Kafka on Kubernetes (Devandra Tagare, Lyft) Kafka Summit SF ...
confluent
 
KSQL: Streaming SQL for Kafka
KSQL: Streaming SQL for KafkaKSQL: Streaming SQL for Kafka
KSQL: Streaming SQL for Kafka
confluent
 
Exactly Once Delivery with Kafka - Kafka Tel-Aviv Meetup
Exactly Once Delivery with Kafka - Kafka Tel-Aviv MeetupExactly Once Delivery with Kafka - Kafka Tel-Aviv Meetup
Exactly Once Delivery with Kafka - Kafka Tel-Aviv Meetup
Natan Silnitsky
 
Apache kafka meet_up_zurich_at_swissre_from_zero_to_hero_with_kafka_connect_2...
Apache kafka meet_up_zurich_at_swissre_from_zero_to_hero_with_kafka_connect_2...Apache kafka meet_up_zurich_at_swissre_from_zero_to_hero_with_kafka_connect_2...
Apache kafka meet_up_zurich_at_swissre_from_zero_to_hero_with_kafka_connect_2...
confluent
 
Actors or Not: Async Event Architectures
Actors or Not: Async Event ArchitecturesActors or Not: Async Event Architectures
Actors or Not: Async Event Architectures
Yaroslav Tkachenko
 
Serverless and Streaming: Building ‘eBay’ by ‘Turning the Database Inside Out’
Serverless and Streaming: Building ‘eBay’ by ‘Turning the Database Inside Out’ Serverless and Streaming: Building ‘eBay’ by ‘Turning the Database Inside Out’
Serverless and Streaming: Building ‘eBay’ by ‘Turning the Database Inside Out’
confluent
 
Apache Kafka: New Features That You Might Not Know About
Apache Kafka: New Features That You Might Not Know AboutApache Kafka: New Features That You Might Not Know About
Apache Kafka: New Features That You Might Not Know About
Yaroslav Tkachenko
 

Similar to Exactly-Once Made Easy: Transactional Messaging Improvement for Usability and Scalability (20)

Producer Performance Tuning for Apache Kafka
Producer Performance Tuning for Apache KafkaProducer Performance Tuning for Apache Kafka
Producer Performance Tuning for Apache Kafka
Jiangjie Qin
 
Kostas Kloudas - Extending Flink's Streaming APIs
Kostas Kloudas - Extending Flink's Streaming APIsKostas Kloudas - Extending Flink's Streaming APIs
Kostas Kloudas - Extending Flink's Streaming APIs
Ververica
 
blockchain-and-trusted-computing
blockchain-and-trusted-computingblockchain-and-trusted-computing
blockchain-and-trusted-computing
YongraeJo
 
Citi TechTalk Session 2: Kafka Deep Dive
Citi TechTalk Session 2: Kafka Deep DiveCiti TechTalk Session 2: Kafka Deep Dive
Citi TechTalk Session 2: Kafka Deep Dive
confluent
 
TDEA 2018 Kafka EOS (Exactly-once)
TDEA 2018 Kafka EOS (Exactly-once)TDEA 2018 Kafka EOS (Exactly-once)
TDEA 2018 Kafka EOS (Exactly-once)
Erhwen Kuo
 
SFBigAnalytics_20190724: Monitor kafka like a Pro
SFBigAnalytics_20190724: Monitor kafka like a ProSFBigAnalytics_20190724: Monitor kafka like a Pro
SFBigAnalytics_20190724: Monitor kafka like a Pro
Chester Chen
 
Eclipse Day India 2015 - Java bytecode analysis and JIT
Eclipse Day India 2015 - Java bytecode analysis and JITEclipse Day India 2015 - Java bytecode analysis and JIT
Eclipse Day India 2015 - Java bytecode analysis and JIT
Eclipse Day India
 
JVM Memory Model - Yoav Abrahami, Wix
JVM Memory Model - Yoav Abrahami, WixJVM Memory Model - Yoav Abrahami, Wix
JVM Memory Model - Yoav Abrahami, Wix
Codemotion Tel Aviv
 
Crossing Abstraction Barriers When Debugging In Dynamic Languages
Crossing Abstraction Barriers When Debugging In Dynamic LanguagesCrossing Abstraction Barriers When Debugging In Dynamic Languages
Crossing Abstraction Barriers When Debugging In Dynamic Languages
Bastian Kruck
 
Kotlin Backend Development 6 Yrs Recap. The Good, the Bad and the Ugly
Kotlin Backend Development 6 Yrs Recap. The Good, the Bad and the UglyKotlin Backend Development 6 Yrs Recap. The Good, the Bad and the Ugly
Kotlin Backend Development 6 Yrs Recap. The Good, the Bad and the Ugly
Haim Yadid
 
High Performance Erlang - Pitfalls and Solutions
High Performance Erlang - Pitfalls and SolutionsHigh Performance Erlang - Pitfalls and Solutions
High Performance Erlang - Pitfalls and Solutions
Yinghai Lu
 
Flink Forward Berlin 2017: Aljoscha Krettek - Talk Python to me: Stream Proce...
Flink Forward Berlin 2017: Aljoscha Krettek - Talk Python to me: Stream Proce...Flink Forward Berlin 2017: Aljoscha Krettek - Talk Python to me: Stream Proce...
Flink Forward Berlin 2017: Aljoscha Krettek - Talk Python to me: Stream Proce...
Flink Forward
 
ez-clang C++ REPL for bare-metal embedded devices
ez-clang C++ REPL for bare-metal embedded devicesez-clang C++ REPL for bare-metal embedded devices
ez-clang C++ REPL for bare-metal embedded devices
Stefan Gränitz
 
Transactions in Action: the Story of Exactly Once in Apache Kafka
Transactions in Action: the Story of Exactly Once in Apache KafkaTransactions in Action: the Story of Exactly Once in Apache Kafka
Transactions in Action: the Story of Exactly Once in Apache Kafka
HostedbyConfluent
 
Exactly-once Data Processing with Kafka Streams - July 27, 2017
Exactly-once Data Processing with Kafka Streams - July 27, 2017Exactly-once Data Processing with Kafka Streams - July 27, 2017
Exactly-once Data Processing with Kafka Streams - July 27, 2017
confluent
 
Talk Python To Me: Stream Processing in your favourite Language with Beam on ...
Talk Python To Me: Stream Processing in your favourite Language with Beam on ...Talk Python To Me: Stream Processing in your favourite Language with Beam on ...
Talk Python To Me: Stream Processing in your favourite Language with Beam on ...
Aljoscha Krettek
 
Kenneth Knowles - Apache Beam - A Unified Model for Batch and Streaming Data...
Kenneth Knowles -  Apache Beam - A Unified Model for Batch and Streaming Data...Kenneth Knowles -  Apache Beam - A Unified Model for Batch and Streaming Data...
Kenneth Knowles - Apache Beam - A Unified Model for Batch and Streaming Data...
Flink Forward
 
(Open) MPI, Parallel Computing, Life, the Universe, and Everything
(Open) MPI, Parallel Computing, Life, the Universe, and Everything(Open) MPI, Parallel Computing, Life, the Universe, and Everything
(Open) MPI, Parallel Computing, Life, the Universe, and Everything
Jeff Squyres
 
Presentation topalidis giorgos
Presentation topalidis giorgosPresentation topalidis giorgos
Presentation topalidis giorgos
Giorgos Topalidis
 
Presentation_Topalidis_Giorgos
Presentation_Topalidis_GiorgosPresentation_Topalidis_Giorgos
Presentation_Topalidis_Giorgos
Giorgos Topalidis
 
Producer Performance Tuning for Apache Kafka
Producer Performance Tuning for Apache KafkaProducer Performance Tuning for Apache Kafka
Producer Performance Tuning for Apache Kafka
Jiangjie Qin
 
Kostas Kloudas - Extending Flink's Streaming APIs
Kostas Kloudas - Extending Flink's Streaming APIsKostas Kloudas - Extending Flink's Streaming APIs
Kostas Kloudas - Extending Flink's Streaming APIs
Ververica
 
blockchain-and-trusted-computing
blockchain-and-trusted-computingblockchain-and-trusted-computing
blockchain-and-trusted-computing
YongraeJo
 
Citi TechTalk Session 2: Kafka Deep Dive
Citi TechTalk Session 2: Kafka Deep DiveCiti TechTalk Session 2: Kafka Deep Dive
Citi TechTalk Session 2: Kafka Deep Dive
confluent
 
TDEA 2018 Kafka EOS (Exactly-once)
TDEA 2018 Kafka EOS (Exactly-once)TDEA 2018 Kafka EOS (Exactly-once)
TDEA 2018 Kafka EOS (Exactly-once)
Erhwen Kuo
 
SFBigAnalytics_20190724: Monitor kafka like a Pro
SFBigAnalytics_20190724: Monitor kafka like a ProSFBigAnalytics_20190724: Monitor kafka like a Pro
SFBigAnalytics_20190724: Monitor kafka like a Pro
Chester Chen
 
Eclipse Day India 2015 - Java bytecode analysis and JIT
Eclipse Day India 2015 - Java bytecode analysis and JITEclipse Day India 2015 - Java bytecode analysis and JIT
Eclipse Day India 2015 - Java bytecode analysis and JIT
Eclipse Day India
 
JVM Memory Model - Yoav Abrahami, Wix
JVM Memory Model - Yoav Abrahami, WixJVM Memory Model - Yoav Abrahami, Wix
JVM Memory Model - Yoav Abrahami, Wix
Codemotion Tel Aviv
 
Crossing Abstraction Barriers When Debugging In Dynamic Languages
Crossing Abstraction Barriers When Debugging In Dynamic LanguagesCrossing Abstraction Barriers When Debugging In Dynamic Languages
Crossing Abstraction Barriers When Debugging In Dynamic Languages
Bastian Kruck
 
Kotlin Backend Development 6 Yrs Recap. The Good, the Bad and the Ugly
Kotlin Backend Development 6 Yrs Recap. The Good, the Bad and the UglyKotlin Backend Development 6 Yrs Recap. The Good, the Bad and the Ugly
Kotlin Backend Development 6 Yrs Recap. The Good, the Bad and the Ugly
Haim Yadid
 
High Performance Erlang - Pitfalls and Solutions
High Performance Erlang - Pitfalls and SolutionsHigh Performance Erlang - Pitfalls and Solutions
High Performance Erlang - Pitfalls and Solutions
Yinghai Lu
 
Flink Forward Berlin 2017: Aljoscha Krettek - Talk Python to me: Stream Proce...
Flink Forward Berlin 2017: Aljoscha Krettek - Talk Python to me: Stream Proce...Flink Forward Berlin 2017: Aljoscha Krettek - Talk Python to me: Stream Proce...
Flink Forward Berlin 2017: Aljoscha Krettek - Talk Python to me: Stream Proce...
Flink Forward
 
ez-clang C++ REPL for bare-metal embedded devices
ez-clang C++ REPL for bare-metal embedded devicesez-clang C++ REPL for bare-metal embedded devices
ez-clang C++ REPL for bare-metal embedded devices
Stefan Gränitz
 
Transactions in Action: the Story of Exactly Once in Apache Kafka
Transactions in Action: the Story of Exactly Once in Apache KafkaTransactions in Action: the Story of Exactly Once in Apache Kafka
Transactions in Action: the Story of Exactly Once in Apache Kafka
HostedbyConfluent
 
Exactly-once Data Processing with Kafka Streams - July 27, 2017
Exactly-once Data Processing with Kafka Streams - July 27, 2017Exactly-once Data Processing with Kafka Streams - July 27, 2017
Exactly-once Data Processing with Kafka Streams - July 27, 2017
confluent
 
Talk Python To Me: Stream Processing in your favourite Language with Beam on ...
Talk Python To Me: Stream Processing in your favourite Language with Beam on ...Talk Python To Me: Stream Processing in your favourite Language with Beam on ...
Talk Python To Me: Stream Processing in your favourite Language with Beam on ...
Aljoscha Krettek
 
Kenneth Knowles - Apache Beam - A Unified Model for Batch and Streaming Data...
Kenneth Knowles -  Apache Beam - A Unified Model for Batch and Streaming Data...Kenneth Knowles -  Apache Beam - A Unified Model for Batch and Streaming Data...
Kenneth Knowles - Apache Beam - A Unified Model for Batch and Streaming Data...
Flink Forward
 
(Open) MPI, Parallel Computing, Life, the Universe, and Everything
(Open) MPI, Parallel Computing, Life, the Universe, and Everything(Open) MPI, Parallel Computing, Life, the Universe, and Everything
(Open) MPI, Parallel Computing, Life, the Universe, and Everything
Jeff Squyres
 
Presentation topalidis giorgos
Presentation topalidis giorgosPresentation topalidis giorgos
Presentation topalidis giorgos
Giorgos Topalidis
 
Presentation_Topalidis_Giorgos
Presentation_Topalidis_GiorgosPresentation_Topalidis_Giorgos
Presentation_Topalidis_Giorgos
Giorgos Topalidis
 
Ad

More from Guozhang Wang (9)

Consensus in Apache Kafka: From Theory to Production.pdf
Consensus in Apache Kafka: From Theory to Production.pdfConsensus in Apache Kafka: From Theory to Production.pdf
Consensus in Apache Kafka: From Theory to Production.pdf
Guozhang Wang
 
Introduction to the Incremental Cooperative Protocol of Kafka
Introduction to the Incremental Cooperative Protocol of KafkaIntroduction to the Incremental Cooperative Protocol of Kafka
Introduction to the Incremental Cooperative Protocol of Kafka
Guozhang Wang
 
Apache Kafka from 0.7 to 1.0, History and Lesson Learned
Apache Kafka from 0.7 to 1.0, History and Lesson LearnedApache Kafka from 0.7 to 1.0, History and Lesson Learned
Apache Kafka from 0.7 to 1.0, History and Lesson Learned
Guozhang Wang
 
Building Realtim Data Pipelines with Kafka Connect and Spark Streaming
Building Realtim Data Pipelines with Kafka Connect and Spark StreamingBuilding Realtim Data Pipelines with Kafka Connect and Spark Streaming
Building Realtim Data Pipelines with Kafka Connect and Spark Streaming
Guozhang Wang
 
Building Stream Infrastructure across Multiple Data Centers with Apache Kafka
Building Stream Infrastructure across Multiple Data Centers with Apache KafkaBuilding Stream Infrastructure across Multiple Data Centers with Apache Kafka
Building Stream Infrastructure across Multiple Data Centers with Apache Kafka
Guozhang Wang
 
Introduction to Kafka Streams
Introduction to Kafka StreamsIntroduction to Kafka Streams
Introduction to Kafka Streams
Guozhang Wang
 
Apache Kafka at LinkedIn
Apache Kafka at LinkedInApache Kafka at LinkedIn
Apache Kafka at LinkedIn
Guozhang Wang
 
Behavioral Simulations in MapReduce
Behavioral Simulations in MapReduceBehavioral Simulations in MapReduce
Behavioral Simulations in MapReduce
Guozhang Wang
 
Automatic Scaling Iterative Computations
Automatic Scaling Iterative ComputationsAutomatic Scaling Iterative Computations
Automatic Scaling Iterative Computations
Guozhang Wang
 
Consensus in Apache Kafka: From Theory to Production.pdf
Consensus in Apache Kafka: From Theory to Production.pdfConsensus in Apache Kafka: From Theory to Production.pdf
Consensus in Apache Kafka: From Theory to Production.pdf
Guozhang Wang
 
Introduction to the Incremental Cooperative Protocol of Kafka
Introduction to the Incremental Cooperative Protocol of KafkaIntroduction to the Incremental Cooperative Protocol of Kafka
Introduction to the Incremental Cooperative Protocol of Kafka
Guozhang Wang
 
Apache Kafka from 0.7 to 1.0, History and Lesson Learned
Apache Kafka from 0.7 to 1.0, History and Lesson LearnedApache Kafka from 0.7 to 1.0, History and Lesson Learned
Apache Kafka from 0.7 to 1.0, History and Lesson Learned
Guozhang Wang
 
Building Realtim Data Pipelines with Kafka Connect and Spark Streaming
Building Realtim Data Pipelines with Kafka Connect and Spark StreamingBuilding Realtim Data Pipelines with Kafka Connect and Spark Streaming
Building Realtim Data Pipelines with Kafka Connect and Spark Streaming
Guozhang Wang
 
Building Stream Infrastructure across Multiple Data Centers with Apache Kafka
Building Stream Infrastructure across Multiple Data Centers with Apache KafkaBuilding Stream Infrastructure across Multiple Data Centers with Apache Kafka
Building Stream Infrastructure across Multiple Data Centers with Apache Kafka
Guozhang Wang
 
Introduction to Kafka Streams
Introduction to Kafka StreamsIntroduction to Kafka Streams
Introduction to Kafka Streams
Guozhang Wang
 
Apache Kafka at LinkedIn
Apache Kafka at LinkedInApache Kafka at LinkedIn
Apache Kafka at LinkedIn
Guozhang Wang
 
Behavioral Simulations in MapReduce
Behavioral Simulations in MapReduceBehavioral Simulations in MapReduce
Behavioral Simulations in MapReduce
Guozhang Wang
 
Automatic Scaling Iterative Computations
Automatic Scaling Iterative ComputationsAutomatic Scaling Iterative Computations
Automatic Scaling Iterative Computations
Guozhang Wang
 
Ad

Recently uploaded (20)

Jacob Murphy Australia - Excels In Optimizing Software Applications
Jacob Murphy Australia - Excels In Optimizing Software ApplicationsJacob Murphy Australia - Excels In Optimizing Software Applications
Jacob Murphy Australia - Excels In Optimizing Software Applications
Jacob Murphy Australia
 
Mode-Wise Corridor Level Travel-Time Estimation Using Machine Learning Models
Mode-Wise Corridor Level Travel-Time Estimation Using Machine Learning ModelsMode-Wise Corridor Level Travel-Time Estimation Using Machine Learning Models
Mode-Wise Corridor Level Travel-Time Estimation Using Machine Learning Models
Journal of Soft Computing in Civil Engineering
 
David Boutry - Specializes In AWS, Microservices And Python.pdf
David Boutry - Specializes In AWS, Microservices And Python.pdfDavid Boutry - Specializes In AWS, Microservices And Python.pdf
David Boutry - Specializes In AWS, Microservices And Python.pdf
David Boutry
 
Design Optimization of Reinforced Concrete Waffle Slab Using Genetic Algorithm
Design Optimization of Reinforced Concrete Waffle Slab Using Genetic AlgorithmDesign Optimization of Reinforced Concrete Waffle Slab Using Genetic Algorithm
Design Optimization of Reinforced Concrete Waffle Slab Using Genetic Algorithm
Journal of Soft Computing in Civil Engineering
 
twin tower attack 2001 new york city
twin  tower  attack  2001 new  york citytwin  tower  attack  2001 new  york city
twin tower attack 2001 new york city
harishreemavs
 
Transport modelling at SBB, presentation at EPFL in 2025
Transport modelling at SBB, presentation at EPFL in 2025Transport modelling at SBB, presentation at EPFL in 2025
Transport modelling at SBB, presentation at EPFL in 2025
Antonin Danalet
 
ML_Unit_V_RDC_ASSOCIATION AND DIMENSIONALITY REDUCTION.pdf
ML_Unit_V_RDC_ASSOCIATION AND DIMENSIONALITY REDUCTION.pdfML_Unit_V_RDC_ASSOCIATION AND DIMENSIONALITY REDUCTION.pdf
ML_Unit_V_RDC_ASSOCIATION AND DIMENSIONALITY REDUCTION.pdf
rameshwarchintamani
 
Working with USDOT UTCs: From Conception to Implementation
Working with USDOT UTCs: From Conception to ImplementationWorking with USDOT UTCs: From Conception to Implementation
Working with USDOT UTCs: From Conception to Implementation
Alabama Transportation Assistance Program
 
How to Build a Desktop Weather Station Using ESP32 and E-ink Display
How to Build a Desktop Weather Station Using ESP32 and E-ink DisplayHow to Build a Desktop Weather Station Using ESP32 and E-ink Display
How to Build a Desktop Weather Station Using ESP32 and E-ink Display
CircuitDigest
 
Autodesk Fusion 2025 Tutorial: User Interface
Autodesk Fusion 2025 Tutorial: User InterfaceAutodesk Fusion 2025 Tutorial: User Interface
Autodesk Fusion 2025 Tutorial: User Interface
Atif Razi
 
DED KOMINFO detail engginering design gedung
DED KOMINFO detail engginering design gedungDED KOMINFO detail engginering design gedung
DED KOMINFO detail engginering design gedung
nabilarizqifadhilah1
 
SICPA: Fabien Keller - background introduction
SICPA: Fabien Keller - background introductionSICPA: Fabien Keller - background introduction
SICPA: Fabien Keller - background introduction
fabienklr
 
Prediction of Flexural Strength of Concrete Produced by Using Pozzolanic Mate...
Prediction of Flexural Strength of Concrete Produced by Using Pozzolanic Mate...Prediction of Flexural Strength of Concrete Produced by Using Pozzolanic Mate...
Prediction of Flexural Strength of Concrete Produced by Using Pozzolanic Mate...
Journal of Soft Computing in Civil Engineering
 
Uses of drones in civil construction.pdf
Uses of drones in civil construction.pdfUses of drones in civil construction.pdf
Uses of drones in civil construction.pdf
surajsen1729
 
Slide share PPT of SOx control technologies.pptx
Slide share PPT of SOx control technologies.pptxSlide share PPT of SOx control technologies.pptx
Slide share PPT of SOx control technologies.pptx
vvsasane
 
Little Known Ways To 3 Best sites to Buy Linkedin Accounts.pdf
Little Known Ways To 3 Best sites to Buy Linkedin Accounts.pdfLittle Known Ways To 3 Best sites to Buy Linkedin Accounts.pdf
Little Known Ways To 3 Best sites to Buy Linkedin Accounts.pdf
gori42199
 
Generative AI & Large Language Models Agents
Generative AI & Large Language Models AgentsGenerative AI & Large Language Models Agents
Generative AI & Large Language Models Agents
aasgharbee22seecs
 
Artificial intelligence and machine learning.pptx
Artificial intelligence and machine learning.pptxArtificial intelligence and machine learning.pptx
Artificial intelligence and machine learning.pptx
rakshanatarajan005
 
introduction technology technology tec.pptx
introduction technology technology tec.pptxintroduction technology technology tec.pptx
introduction technology technology tec.pptx
Iftikhar70
 
hypermedia_system_revisit_roy_fielding .
hypermedia_system_revisit_roy_fielding .hypermedia_system_revisit_roy_fielding .
hypermedia_system_revisit_roy_fielding .
NABLAS株式会社
 
Jacob Murphy Australia - Excels In Optimizing Software Applications
Jacob Murphy Australia - Excels In Optimizing Software ApplicationsJacob Murphy Australia - Excels In Optimizing Software Applications
Jacob Murphy Australia - Excels In Optimizing Software Applications
Jacob Murphy Australia
 
David Boutry - Specializes In AWS, Microservices And Python.pdf
David Boutry - Specializes In AWS, Microservices And Python.pdfDavid Boutry - Specializes In AWS, Microservices And Python.pdf
David Boutry - Specializes In AWS, Microservices And Python.pdf
David Boutry
 
twin tower attack 2001 new york city
twin  tower  attack  2001 new  york citytwin  tower  attack  2001 new  york city
twin tower attack 2001 new york city
harishreemavs
 
Transport modelling at SBB, presentation at EPFL in 2025
Transport modelling at SBB, presentation at EPFL in 2025Transport modelling at SBB, presentation at EPFL in 2025
Transport modelling at SBB, presentation at EPFL in 2025
Antonin Danalet
 
ML_Unit_V_RDC_ASSOCIATION AND DIMENSIONALITY REDUCTION.pdf
ML_Unit_V_RDC_ASSOCIATION AND DIMENSIONALITY REDUCTION.pdfML_Unit_V_RDC_ASSOCIATION AND DIMENSIONALITY REDUCTION.pdf
ML_Unit_V_RDC_ASSOCIATION AND DIMENSIONALITY REDUCTION.pdf
rameshwarchintamani
 
How to Build a Desktop Weather Station Using ESP32 and E-ink Display
How to Build a Desktop Weather Station Using ESP32 and E-ink DisplayHow to Build a Desktop Weather Station Using ESP32 and E-ink Display
How to Build a Desktop Weather Station Using ESP32 and E-ink Display
CircuitDigest
 
Autodesk Fusion 2025 Tutorial: User Interface
Autodesk Fusion 2025 Tutorial: User InterfaceAutodesk Fusion 2025 Tutorial: User Interface
Autodesk Fusion 2025 Tutorial: User Interface
Atif Razi
 
DED KOMINFO detail engginering design gedung
DED KOMINFO detail engginering design gedungDED KOMINFO detail engginering design gedung
DED KOMINFO detail engginering design gedung
nabilarizqifadhilah1
 
SICPA: Fabien Keller - background introduction
SICPA: Fabien Keller - background introductionSICPA: Fabien Keller - background introduction
SICPA: Fabien Keller - background introduction
fabienklr
 
Uses of drones in civil construction.pdf
Uses of drones in civil construction.pdfUses of drones in civil construction.pdf
Uses of drones in civil construction.pdf
surajsen1729
 
Slide share PPT of SOx control technologies.pptx
Slide share PPT of SOx control technologies.pptxSlide share PPT of SOx control technologies.pptx
Slide share PPT of SOx control technologies.pptx
vvsasane
 
Little Known Ways To 3 Best sites to Buy Linkedin Accounts.pdf
Little Known Ways To 3 Best sites to Buy Linkedin Accounts.pdfLittle Known Ways To 3 Best sites to Buy Linkedin Accounts.pdf
Little Known Ways To 3 Best sites to Buy Linkedin Accounts.pdf
gori42199
 
Generative AI & Large Language Models Agents
Generative AI & Large Language Models AgentsGenerative AI & Large Language Models Agents
Generative AI & Large Language Models Agents
aasgharbee22seecs
 
Artificial intelligence and machine learning.pptx
Artificial intelligence and machine learning.pptxArtificial intelligence and machine learning.pptx
Artificial intelligence and machine learning.pptx
rakshanatarajan005
 
introduction technology technology tec.pptx
introduction technology technology tec.pptxintroduction technology technology tec.pptx
introduction technology technology tec.pptx
Iftikhar70
 
hypermedia_system_revisit_roy_fielding .
hypermedia_system_revisit_roy_fielding .hypermedia_system_revisit_roy_fielding .
hypermedia_system_revisit_roy_fielding .
NABLAS株式会社
 

Exactly-Once Made Easy: Transactional Messaging Improvement for Usability and Scalability

  • 1. 1 Exactly-Once Made Fast Boyang Chen: Engineer@Confluent Guozhang Wang: Engineer@Confluent
  • 2. 2 - Recap: exactly-once semantics (EOS) for Kafka - What cost are we paying for EOS today - Closing the gaps: usability and scalability Overview
  • 4. 4
  • 5. 5
  • 6. 6
  • 7. 7
  • 8. 8
  • 13. 13 The Kafka Approach for Exactly Once 1) Idempotent writes in order within a single topic partition 2) Transactional writes across multiple output topic partitions 3) Guarantee single writer for any input topic partitions [KIP-98, KIP-129]
  • 14. 14 The Kafka Approach for Exactly Once 1) Idempotent writes in order within a single topic partition 2) Transactional writes across multiple output topic partitions 3) Guarantee single writer for any input topic partitions [KIP-98, KIP-129]
  • 16. 16
  • 18. 18 txn-status: non-exist, partitions: {} producer.initTxn();
  • 19. 19 txn-status: empty, partitions: {} producer.initTxn(); non-exist
  • 20. 20 try { producer.beginTxn(); records = consumer.poll(); for (Record rec <- records) { // process .. } } catch (KafkaException e) { }txn-status: empty, partitions: {} producer.initTxn();
  • 21. 21 try { producer.beginTxn(); records = consumer.poll(); for (Record rec <- records) { // process .. producer.send(“output”, ..); } } catch (KafkaException e) { }txn-status: empty, partitions: {} producer.initTxn();
  • 22. 22 try { producer.beginTxn(); records = consumer.poll(); for (Record rec <- records) { // process .. producer.send(“output”, ..); } } catch (KafkaException e) { }txn-status: on-going, partitions: {output-0} producer.initTxn(); non-exist {}
  • 23. 23 try { producer.beginTxn(); records = consumer.poll(); for (Record rec <- records) { // process .. producer.send(“output”, ..); } } catch (KafkaException e) { }txn-status: on-going, partitions: {output-0} producer.initTxn();
  • 24. 24 try { producer.beginTxn(); records = consumer.poll(); for (Record rec <- records) { // process .. producer.send(“output”, ..); } } catch (KafkaException e) { }txn-status: on-going, partitions: {output-0} producer.initTxn();
  • 25. 25 try { producer.beginTxn(); records = consumer.poll(); for (Record rec <- records) { // process .. producer.send(“output”, ..); } } catch (KafkaException e) { }txn-status: on-going, partitions: {output-0} producer.initTxn();
  • 26. 26 try { producer.beginTxn(); records = consumer.poll(); for (Record rec <- records) { // process .. producer.send(“output”, ..); } producer.sendOffsets(..); } catch (KafkaException e) { }txn-status: on-going, partitions: {output-0} producer.initTxn();
  • 27. 27 try { producer.beginTxn(); records = consumer.poll(); for (Record rec <- records) { // process .. producer.send(“output”, ..); } producer.sendOffsets(..); } catch (KafkaException e) { }txn-status: on-going, partitions: {output-0, offset-0} producer.initTxn(); {output-0}
  • 28. 28 try { producer.beginTxn(); records = consumer.poll(); for (Record rec <- records) { // process .. producer.send(“output”, ..); } producer.sendOffsets(..); producer.commitTxn(); } catch (KafkaException e) { }txn-status: on-going, partitions: {output-0, offset-0} producer.initTxn();
  • 29. 29 try { producer.beginTxn(); records = consumer.poll(); for (Record rec <- records) { // process .. producer.send(“output”, ..); } producer.sendOffsets(..); producer.commitTxn(); } catch (KafkaException e) { }txn-status: prep-commit, partitions: {output-0, offset-0} producer.initTxn(); on-going
  • 30. 30 try { producer.beginTxn(); records = consumer.poll(); for (Record rec <- records) { // process .. producer.send(“output”, ..); } producer.sendOffsets(..); producer.commitTxn(); } catch (KafkaException e) { }txn-status: prep-commit, partitions: {output-0, offset-0} producer.initTxn();
  • 31. 31 try { producer.beginTxn(); records = consumer.poll(); for (Record rec <- records) { // process .. producer.send(“output”, ..); } producer.sendOffsets(..); producer.commitTxn(); } catch (KafkaException e) { }txn-status: prep-commit, partitions: {output-0, offset-0} producer.initTxn();
  • 32. 32 try { producer.beginTxn(); records = consumer.poll(); for (Record rec <- records) { // process .. producer.send(“output”, ..); } producer.sendOffsets(..); producer.commitTxn(); } catch (KafkaException e) { }txn-status: committed, partitions: {output-0, offset-0} producer.initTxn(); prep-commit
  • 33. 33 try { producer.beginTxn(); records = consumer.poll(); for (Record rec <- records) { // process .. producer.send(“output”, ..); } producer.sendOffsets(..); producer.commitTxn(); } catch (KafkaException e) { }txn-status: on-going, partitions: {output-0, offset-0} producer.initTxn();
  • 34. 34 try { producer.beginTxn(); records = consumer.poll(); for (Record rec <- records) { // process .. producer.send(“output”, ..); } producer.sendOffsets(..); producer.commitTxn(); } catch (KafkaException e) { producer.abortTxn(); }txn-status: on-going, partitions: {output-0, offset-0} producer.initTxn();
  • 35. 35 try { producer.beginTxn(); records = consumer.poll(); for (Record rec <- records) { // process .. producer.send(“output”, ..); } producer.sendOffsets(..); producer.commitTxn(); } catch (KafkaException e) { producer.abortTxn(); }txn-status: prep-abort, partitions: {output-0, offset-0} producer.initTxn(); on-going
  • 36. 36 try { producer.beginTxn(); records = consumer.poll(); for (Record rec <- records) { // process .. producer.send(“output”, ..); } producer.sendOffsets(..); producer.commitTxn(); } catch (KafkaException e) { producer.abortTxn(); }txn-status: prep-abort, partitions: {output-0, offset-0} producer.initTxn();
  • 37. 37 try { producer.beginTxn(); records = consumer.poll(); for (Record rec <- records) { // process .. producer.send(“output”, ..); } producer.sendOffsets(..); producer.commitTxn(); } catch (KafkaException e) { producer.abortTxn(); }txn-status: prep-abort, partitions: {output-0, offset-0} producer.initTxn();
  • 38. 38 try { producer.beginTxn(); records = consumer.poll(); for (Record rec <- records) { // process .. producer.send(“output”, ..); } producer.sendOffsets(..); producer.commitTxn(); } catch (KafkaException e) { producer.abortTxn(); }txn-status: aborted, partitions: {output-0, offset-0} producer.initTxn(); prep-abort
  • 39. 39 The Kafka Approach for Exactly Once: 1) Idempotent writes in order within a single topic partition 2) Transactional writes across multiple output topic partitions 3) Guarantee single writer for any input topic partitions
  • 40. 40
  • 41. 41
  • 42. 42 At a given time, an input partition should only be processed by a single client
  • 43. 43 At a given time, an input partition should only be processed by a single client Consumer Group
  • 44. 44 At a given time, an input partition should only be processed by a single client Consumer Group
  • 45. 45 At a given time, an input partition should only be processed by a single client Consumer Group
  • 46. 46 The “Single Writer” Fencing Problem
  • 47. 47 When Taking Over the Partition: 1) The previous txn must have completed commit or abort so there are no concurrent transactions. 2) Other clients will be fenced write processing results for those input partitions, a.k.a we have a “single writer”.
  • 48. 48 Transactional ID: defines single writer scope 1) Configured by the unique producer `transactional.id` property. 2) Enforced fencing by a monotonic epoch for each id. 3) Producer initialization await pending transaction completion.
  • 49. 49 Transactional ID: defines single writer scope 1) Configured by the unique producer `transactional.id` property. 2) Enforced fencing by a monotonic epoch for each id. 3) Producer initialization await pending transaction completion.
  • 50. 50 Transactional ID: defines single writer scope 1) Configured by the unique producer `transactional.id` property. 2) Enforced fencing by a monotonic epoch for each id. 3) Producer initialization await pending transaction completion.
  • 51. 51 Consumer Group txn.Id = A, epoch = 1 txn.Id = B, epoch = 1
  • 54. 54 Consumer Group txn.Id = A, epoch = 1 txn.Id = B, initializing...
  • 55. 55 Consumer Group txn.Id = A, epoch = 1 txn.Id = B, epoch = 2
  • 56. 56 Consumer Group txn.Id = A, epoch = 1 txn.Id = B, epoch = 2 Num. producer transaction IDs ~= num. input partitions Producers need to be dynamically created when rebalance
  • 58. 58 Number of Input Partitions Growth of Producers Number of Applications 5 10 15 20 25 30 600 500 400 300 200 1 00
  • 59. 59 Number of Input Partitions At Least Once Growth of Producers Number of Applications 5 10 15 20 25 30 600 500 400 300 200 1 00
  • 60. 60 Number of Input Partitions At Least Once Growth of Producers Number of Applications 5 10 15 20 25 30 600 500 400 300 200 1 00 Exactly Once
  • 63. 63 What problems are KIP-447 solving ? ● Make one producer per process model work
  • 64. 64 What problems are KIP-447 solving ? ● Make one producer per process model work ● Unblock technical challenges ○ Offset commit fencing ○ Concurrent transaction
  • 65. 65 What problems are KIP-447 solving ? ● Offset commit fencing ● Concurrent transaction
  • 66. 66 ● We are fencing on the transactional producer side, which assumes a static partition assignment What problems are KIP-447 solving ? ● Offset commit fencing ● Concurrent transaction
  • 67. 67 ● We are fencing on the transactional producer side, which assumes a static partition assignment ● Consumer group partition assignments are dynamic in practice What problems are KIP-447 solving ? ● Offset commit fencing ● Concurrent transaction
  • 68. 68
  • 69. 69
  • 70. 70
  • 71. 71
  • 72. 72
  • 73. 73
  • 74. 74 ● We are fencing on the transactional producer side, which assumes a static partition assignment ● Consumer group partition assignments are dynamic in practice ● Action: fence zombie producer commit What problems are KIP-447 solving ? ● Offset commit fencing ● Concurrent transaction
  • 75. 75 ● We are fencing on the transactional producer side, which assumes a static partition assignment ● Consumer group partition assignments are dynamic in practice ● Action: fence zombie producer commit ○ Different from epoch fencing ○ Utilize consumer group generation ~= epoch What problems are KIP-447 solving ? ● Offset commit fencing ● Concurrent transaction
  • 76. 76
  • 77. 77
  • 78. 78
  • 79. 79
  • 80. 80
  • 81. 81
  • 82. 82
  • 83. 83 ● We are fencing on the transactional producer side, which assumes a static partition assignment ● Consumer group partition assignments are dynamic in practice ● Action: fence zombie producer commit ○ Different from epoch fencing ○ Utilize consumer group generation ~= epoch ● Add new APIs What problems are KIP-447 solving ? ● Offset commit fencing ● Concurrent transaction
  • 84. 84 try { producer.beginTxn(); records = consumer.poll(); for (Record rec <- records) { // process .. producer.send(“output”, ..); } producer.sendOffsets(offsets); producer.commitTxn(); } catch (KafkaException e) { }txn-status: on-going, partitions: {output, offset}
  • 85. 85 try { producer.beginTxn(); records = consumer.poll(); for (Record rec <- records) { // process .. producer.send(“output”, ..); } producer.sendOffsets(offsets, consumer.groupMetadata()); producer.commitTxn(); } catch (KafkaException e) { } txn-status: on-going, partitions: {output, offset}
  • 86. 86 ● We are fencing on the transactional producer side, which assumes a static partition assignment ● Consumer group partition assignments are dynamic in practice ● Action: fence zombie producer commit ○ Different from epoch fencing ○ Utilize consumer group generation ~= epoch ● Add new APIs ○ Expose group generation through consumer#groupMetadata() ○ Commit transaction with consumer metadata through producer#sendOffsetsToTransaction(offsets, groupMetadata) What problems are KIP-447 solving ? ● Offset commit fencing ● Concurrent transaction
  • 87. 87 What problems are KIP-447 solving ? ● Offset commit fencing ● Concurrent transaction
  • 88. 88 What problems are KIP-447 solving ? ● Offset commit fencing ● Concurrent transaction ● Only one open transaction allowed for each input partition
  • 89. 89 What problems are KIP-447 solving ? ● Offset commit fencing ● Concurrent transaction ● Only one open transaction allowed for each input partition ● Offset commit is the only critical section
  • 90. 90 What problems are KIP-447 solving ? ● Offset commit fencing ● Concurrent transaction ● Only one open transaction allowed for each input partition ● Offset commit is the only critical section ○ Observed: Broker uses pending offsets to indicate other ongoing transaction
  • 91. 91 What problems are KIP-447 solving ? ● Offset commit fencing ● Concurrent transaction ● Only one open transaction allowed for each input partition ● Offset commit is the only critical section ○ Observed: Broker uses pending offsets to indicate other ongoing transaction ○ Observed: consumer always needs to fetch offset after rebalance
  • 92. 92 What problems are KIP-447 solving ? ● Offset commit fencing ● Concurrent transaction ● Only one open transaction allowed for each input partition ● Offset commit is the only critical section ○ Observed: Broker uses pending offsets to indicate other ongoing transaction ○ Observed: consumer always needs to fetch offset after rebalance ○ Action: OffsetFetchRequest will back-off until pending offsets are cleared, either by previous transaction complete or timeout
  • 93. 93
  • 94. 94
  • 95. 95
  • 96. 96
  • 97. 97
  • 98. 98
  • 100. 100 447 Summary ● Resolve the semantic mismatch between producer and consumer ○ Offset commit fencing ○ Concurrent transaction
  • 101. 101 447 Summary ● Resolve the semantic mismatch between producer and consumer ○ Offset commit fencing ○ Concurrent transaction ● Make the one producer per processing unit possible
  • 102. 102 Number of Input Partitions At Least Once Growth of Producers Number of Applications 5 10 15 20 25 30 600 500 400 300 200 1 00 Exactly Once
  • 103. 103 Number of Input Partitions At Least Once Growth of Producers Number of Applications 5 10 15 20 25 30 600 500 400 300 200 1 00 Exactly Once Exactly Once After 447
  • 105. 105 Prove the 447 scalability improvement to break the limit - At_least_once - Exactly_once - Exactly_once_beta (post KIP-447 EOS) Scale Testing
  • 107. 107 Scale Testing ● Num.brokers = 3 ● Num.input.partitions = 200 ● Num.output.partitions = 100 ● Test.interval.ms = 4 min ● Num.threads = 3 ● Num.records.second = 1000 ● Commit.interval.ms = 1 second ● Num.instances = 10, 20, 30...
  • 108. 108 Scale Testing ● Num.brokers = 3 ● Num.input.partitions = 200 ● Num.output.partitions = 100 ● Test.interval.ms = 4 min ● Num.threads = 3 ● Num.records.second = 1000 ● Commit.interval.ms = 1 second ● Num.instances = 10, 20, 30...
  • 109. 109 Scale Testing ● At_least_once and exactly_once_beta perform steadily ● Exactly_once (pre KIP-447) throughput degrades significantly around 20-25 applications
  • 112. 112 Upgrade Procedure ● Rolling bounce brokers to >= Apache Kafka 2.5
  • 113. 113 Upgrade Procedure ● Rolling bounce brokers to >= Apache Kafka 2.5 ● Upgrade the stream application binary and keep the PROCESSING_GUARATNEE setting at "exactly_once". Do the first rolling bounce, and make sure the group is stable with every instance on 2.6 binary.
  • 114. 114 Upgrade Procedure ● Rolling bounce brokers to >= Apache Kafka 2.5 ● Upgrade the stream application binary and keep the PROCESSING_GUARATNEE setting at "exactly_once". Do the first rolling bounce, and make sure the group is stable with every instance on 2.6 binary. ● Upgrade the PROCESSING_GUARANTEE setting to "exactly_once_beta" and do a second rolling bounce to start using new thread producer for EOS.
  • 116. 116 1. Walkthrough Kafka transaction model
  • 117. 117 1. Walkthrough Kafka transaction model 2. The usability and scalability issues with “single writer”
  • 118. 118 1. Walkthrough Kafka transaction model 2. The usability and scalability issues with “single writer” 3. How KIP-447 solves the challenges
  • 119. 119 1. Walkthrough Kafka transaction model 2. The usability and scalability issues with “single writer” 3. How KIP-447 solves the challenges 4. How to adopt KIP-447 in Kafka Streams
  • 121. 121 - KIP-98 - Exactly Once Delivery and Transactional Messaging - Apache Kafka - KIP-447: Producer scalability for exactly once semantics - Apache Kafka Resources
  翻译: