SlideShare ist ein Scribd-Unternehmen logo
1 von 198
Downloaden Sie, um offline zu lesen
1
Revisiting Exactly Once
Semantics (EOS)
Jason Gustafson: Engineer@Confluent
2
- Review exactly once mechanics
- Identify the remaining gaps
- Discuss how they are being addressed
Overview
3
Kafka EOS
4
A B C D E
Read
Process
Write
Input
Output
5
A B C D E
Read
Process
Write
Input
Output
6
A B C D E
A’
Read
Process
Write
Input
Output
7
A B C D E
A’
Read
Process
Write
Input
Output
8
A B C D E
A’ B’ C’
Read
Process
Write
Input
Output
9
A B C D E
A’ B’ C’
Read
Process
Write
Input
Output
10
A B C D E
A’ B’ C’ D’ E’
Read
Process
Write
Input
Output
11
1 1 1 1 1 1 1 1
Read
Process
Write
Input
Output
12
1 1 1 1 1 1 1 1
Read
Process
Write
Input
Output
13
1 1 1 1 1 1 1 1
2
Read
Process
Write
Input
Output
14
1 1 1 1 1 1 1 1
2
Read
Process
Write
Input
Output
15
1 1 1 1 1 1 1 1
2 4
Read
Process
Write
Input
Output
16
1 1 1 1 1 1 1 1
2 4
Read
Process
Write
Input
Output
17
1 1 1 1 1 1 1 1
2 4 2
Read
Process
Write
Input
Output
18
A B C D E
Read
Process
Write
Input
Output
19
A B C D E
Read
Process
Write
Input
Output
20
A B C D E
B’
Read
Process
Write
Input
Output
A’
21
A B C D E
B’
Read
Process
Write
Input
Output
A’
22
A B C D E
B’ D’
Read
Process
Write
Input
Output
A’ C’ E’
23
A B C D E
A’ B’
Read
Process
Write
Input
Output
24
A B C D E
A’ B’
Read
Process
Write
Input
Output
2
Position
25
A B C D E
A’ B’
Read
Process
Write
Input
Output
2
Position
ReadPosition
26
A B C D E
A’ B’
Read
Process
Write
Input
Output
2
Position
ReadPosition
WritePosition
27
A B C D E
A’ B’
Read
Process
Write
Input
Output
2
Position
ReadPosition
WritePosition
28
A B C D E
A’ B’ C’ D’
Read
Process
Write
Input
Output
2
Position
ReadPosition
WritePosition
29
A B C D E
A’ B’ C’ D’
Read
Process
Write
Input
Output
2 4
Position
ReadPosition
WritePosition
30
A B C D E
A’ B’ C’ D’
Read
Process
Write
Input
Output
2 4
Position
ReadPosition
WritePosition
31
A B C D E
A’ B’ C’ D’ E’
Read
Process
Write
Input
Output
2 4
Position
ReadPosition
WritePosition
32
A B C D E
A’ B’ C’ D’ E’
Read
Process
Write
Input
Output
2 4 5
Position
ReadPosition
WritePosition
33
A B C D E
A’ B’ C’ D’ E’
Read
Process
Write
Input
Output
2 4 5
Position
ReadPosition
WritePosition
Atomic
34
Read
Process
Write
ReadPosition
WritePosition
Atomic
The Kafka Approach:
1) Transactional writes across multiple
partitions
2) Protocol to guarantee single writer
35
Read
Process
Write
ReadPosition
WritePosition
Atomic
The Kafka Approach:
1) Transactional writes across multiple
partitions
2) Protocol to guarantee single writer
36
Kafka Transactions
37
Read
Process
Write
ReadPosition
WritePosition
Atomic
38
Read
Process
Write
ReadPosition
WritePosition
Atomic
AddPartition
Write
BeginTxn
CommitTxn
39
Output (O)
Status
Partitions
A B C D E
Input
Position (P)
Transaction Log
AddPartition
Write
BeginTxn
CommitTxn
40
Output (O)
Status
Partitions
A B C D E
Input
Position (P)
Transaction Log
AddPartition
Write
BeginTxn
CommitTxn
41
Output (O)
ongoing
(O)
Status
Partitions
A B C D E
Input
Position (P)
Transaction Log
AddPartition
Write
BeginTxn
CommitTxn
42
Output (O)
A’ B’
ongoing
(O)
Status
Partitions
A B C D E
Input
Position (P)
Transaction Log
AddPartition
Write
BeginTxn
CommitTxn
43
Output (O)
A’ B’
ongoing ongoing
(O) (O, P)
Status
Partitions
A B C D E
Input
Position (P)
Transaction Log
AddPartition
Write
BeginTxn
CommitTxn
44
Output (O)
2
A’ B’
ongoing ongoing
(O) (O, P)
Status
Partitions
A B C D E
Input
Position (P)
Transaction Log
AddPartition
Write
BeginTxn
CommitTxn
45
Output (O)
2
A’ B’
ongoing ongoing
prepare
commit
(O) (O, P) (O, P)
Status
Partitions
A B C D E
Input
Position (P)
Transaction Log
AddPartition
Write
BeginTxn
CommitTxn
46
Output (O)
2
A’ B’
ongoing ongoing
prepare
commit
(O) (O, P) (O, P)
Status
Partitions
A B C D E
Input
Position (P)
Transaction Log
AddPartition
Write
BeginTxn
CommitTxn
47
Output (O)
2
A’ B’
ongoing ongoing
prepare
commit
(O) (O, P) (O, P)
Status
Partitions
A B C D E
Input
Position (P)
Transaction Log
AddPartition
Write
BeginTxn
CommitTxn
48
Output (O)
2
A’ B’
ongoing ongoing
prepare
commit
done
commit
(O) (O, P) (O, P) ()
Status
Partitions
A B C D E
Input
Position (P)
Transaction Log
AddPartition
Write
BeginTxn
CommitTxn
49
Output (O)
2
A’ B’
done
commit
()
Status
Partitions
A B C D E
Input
Position (P)
Transaction Log
AddPartition
Write
BeginTxn
CommitTxn
50
Output (O)
2
A’ B’
done
commit
()
Status
Partitions
A B C D E
Input
Position (P)
Transaction Log
AddPartition
Write
BeginTxn
CommitTxn
51
Output (O)
2 5
A’ B’ C’ D’ E’
done
commit
ongoing ongoing
() (O) (O, P)
Status
Partitions
A B C D E
Input
Position (P)
Transaction Log
AddPartition
Write
BeginTxn
CommitTxn
52
Output (O)
2 5
A’ B’ C’ D’ E’
done
commit
ongoing ongoing
() (O) (O, P)
Status
Partitions
A B C D E
Input
Position (P)
Transaction Log
AddPartition
Write
BeginTxn
CommitTxn
Timeout
AbortTxn
53
Output (O)
2 5
A’ B’ C’ D’ E’
done
commit
ongoing ongoing
prepare
abort
() (O) (O, P) (O, P)
Status
Partitions
A B C D E
Input
Position (P)
Transaction Log
AddPartition
Write
BeginTxn
CommitTxn
Timeout
AbortTxn
54
Output (O)
2 5
A’ B’ C’ D’ E’
done
commit
ongoing ongoing
prepare
abort
() (O) (O, P) (O, P)
Status
Partitions
A B C D E
Input
Position (P)
Transaction Log
AddPartition
Write
BeginTxn
CommitTxn
Timeout
AbortTxn
55
Output (O)
2 5
A’ B’ C’ D’ E’
done
commit
ongoing ongoing
prepare
abort
finish
abort
() (O) (O, P) (O, P) ()
Status
Partitions
A B C D E
Input
Position (P)
Transaction Log
AddPartition
Write
BeginTxn
CommitTxn
Timeout
AbortTxn
56
Output (O)
2 5
A’ B’ C’ D’ E’
done
commit
ongoing ongoing
prepare
abort
finish
abort
() (O) (O, P) (O, P) ()
Status
Partitions
A B C D E
Input
Position (P)
Transaction Log
AddPartition
Write
BeginTxn
CommitTxn
Timeout
AbortTxn
57
Read
Process
Write
ReadPosition
WritePosition
Atomic
The Kafka Approach:
1) Transactional writes across multiple
partitions
2) Protocol to guarantee single writer
58
Single Writer
(WTF is a transactional ID?)
59
A B C D E
Input Output
Processor
60
A B C
Input
Output
Processor 1
D E F
G H I
Processor 2
Processor 3
61
OutputA B C
Input
D E F
G H I
Processor 1
Processor 2
Processor 3
62
OutputA B C
Input
D E F
G H I
“Single writer” does not mean that an
output partition has only one writer.
Processor 1
Processor 2
Processor 3
63
OutputA B C
Input
D E F
G H I
The guarantee we need is that there is a
single writer tied to each input partition.
Processor 1
Processor 2
Processor 3
64
Consumer Group
OutputA B C
Input
D E F
G H I
Processor 1
Processor 2
Processor 3
65
Consumer Group
OutputA B C
Input
D E F
G H I
Processor 1
Processor 2
Processor 3
66
Processor 1
Consumer Group
OutputA B C
Input
D E F
G H I
Processor 2
Processor 3
67
The Initialization Problem
68
Processor 2
A B C D E F
A’
Input
Output
1
Position
Read
Process
Write
ReadPosition
WritePosition
Processor 1
Read
Process
Write
ReadPosition
WritePosition
69
Processor 2
A B C D E F
A’ B’ C’
Input
Output
1 3
Position
Read
Process
Write
ReadPosition
WritePosition
Processor 1
Read
Process
Write
ReadPosition
WritePosition
70
Processor 2
A B C D E F
A’ B’ C’
Input
Output
1 3
Position
Read
Process
Write
ReadPosition
WritePosition
Processor 1
Read
Process
Write
ReadPosition
WritePosition
Transaction committing but
not complete
71
Processor 2
A B C D E F
A’ B’ C’
Input
Output
1 3
Position
Read
Process
Write
ReadPosition
WritePosition
Processor 1
Read
Process
Write
ReadPosition
WritePosition
Transaction committing but
not complete
72
Processor 2
A B C D E F
A’ B’ C’
Input
Output
1 3
Position
Read
Process
Write
ReadPosition
WritePosition
Processor 1
Read
Process
Write
ReadPosition
WritePosition
Input partition reassigned
to processor 2
73
Processor 2
A B C D E F
A’ B’ C’ B’
Input
Output
1 3 2
Position
Read
Process
Write
ReadPosition
WritePosition
Processor 1
Read
Process
Write
ReadPosition
WritePosition
Processor 2 reads latest
committed position of 1
74
Processor 2
A B C D E F
A’ B’ C’ B’
Input
Output
1 3 2
Position
Read
Process
Write
ReadPosition
WritePosition
Processor 1
Read
Process
Write
ReadPosition
WritePosition
Transaction from processor
1 completes
75
The Fencing Problem
76
Processor 1’
A B C D E F
A’ B’ C’
Input
Output
1
Position
Read
Process
Write
ReadPosition
WritePosition
Processor 1
Read
Process
Write
ReadPosition
WritePosition
Processor 1 has an
ongoing transaction
77
Processor 1’
A B C D E F
A’ B’ C’
Input
Output
1
Position
Read
Process
Write
ReadPosition
WritePosition
Processor 1
Read
Process
Write
ReadPosition
WritePosition
Processor 1 is partitioned
from the cluster
78
Processor 1’
A B C D E F
A’ B’ C’
Input
Output
1
Position
Read
Process
Write
ReadPosition
WritePosition
Processor 1
Read
Process
Write
ReadPosition
WritePosition
Partition reassigned to
processor 2
79
Processor 1’
A B C D E F
A’ B’ C’
Input
Output
1
Position
Read
Process
Write
ReadPosition
WritePosition
Processor 1
Read
Process
Write
ReadPosition
WritePosition
Transaction is aborted
80
Processor 1’
A B C D E F
A’ B’ C’ B’
Input
Output
1 2
Position
Read
Process
Write
ReadPosition
WritePosition
Processor 1
Read
Process
Write
ReadPosition
WritePosition
81
Processor 1’
A B C D E F
A’ B’ C’ B’
Input
Output
1 2
Position
Read
Process
Write
ReadPosition
WritePosition
Processor 1
Read
Process
Write
ReadPosition
WritePosition
Processor 1 is able to
communicate again
82
Processor 1’
A B C D E F
A’ B’ C’ B’ D’
Input
Output
1 2
Position
Read
Process
Write
ReadPosition
WritePosition
Processor 1
Read
Process
Write
ReadPosition
WritePosition
83
Processor 1’
A B C D E F
A’ B’ C’ B’ D’
Input
Output
1 2
Position
Read
Process
Write
ReadPosition
WritePosition
Processor 1
Read
Process
Write
ReadPosition
WritePosition
84
● Configured by the producer `transactional.id`
property
● Defines a single writer scope
● Enforced by a monotonic epoch
● Initialization protocol to await pending
transaction completion
Transactional ID
85
Bump Epoch
Is Transaction
In Progress?
Begin Abort
Is Transaction
Completing?
Await
Completion
Yes
Yes
No
Return New
Epoch
No
Transactional Id
Initialization
86
Bump Epoch
Is Transaction
In Progress?
Begin Abort
Is Transaction
Completing?
Await
Completion
Yes
Yes
No
Return New
Epoch
No
Transactional Id
Initialization
87
Bump Epoch
Is Transaction
In Progress?
Begin Abort
Is Transaction
Completing?
Await
Completion
Yes
Yes
No
Return New
Epoch
No
Transactional Id
Initialization
88
Bump Epoch
Is Transaction
In Progress?
Begin Abort
Is Transaction
Completing?
Await
Completion
Yes
Yes
No
Return New
Epoch
No
Transactional Id
Initialization
89
Bump Epoch
Is Transaction
In Progress?
Begin Abort
Is Transaction
Completing?
Await
Completion
Yes
Yes
No
Return New
Epoch
No
Transactional Id
Initialization
90
Consumer Group
A B C
Input
Processor 1
D E F
H I J
Processor 2
Processor 3
txnl.id=A
epoch=1
txnl.id=B
epoch=1
txnl.id=C
epoch=1
91
Processor 1
Consumer Group
A B C
Input
D E F
H I J
txnl.id=A
epoch=1
txnl.id=B
epoch=1
txnl.id=C
epoch=1
Processor 2
Processor 3
92
Processor 1
Consumer Group
A B C
Input
D E F
H I J
txnl.id=A
epoch=2
txnl.id=B
epoch=1
txnl.id=C
epoch=1
Processor 2
Processor 3
93
Read
Process
Write
ReadPosition
WritePosition
The Kafka Approach:
1) Transactional writes across multiple
partitions
2) Protocol to guarantee single writer
Atomic
94
Read
Process
Write
ReadPosition
WritePosition
Atomic
Bump transactional ID
epoch and await pending
transaction completion
95
Read
Process
Write
ReadPosition
WritePosition
Atomic
Multi-partition
transactional write
protected by epoch
Bump transactional ID
epoch and await pending
transaction completion
96
EOS In Code
979797
EOS In Code
consumer.assign(partitions)
producer.initTransactions()
while (true) {
input, offsets = consumer.poll()
output = process(input)
producer.beginTransaction()
producer.send(output)
producer.sendOffsets(offsets)
producer.commitTransaction()
}
989898
EOS In Code
consumer.assign(partitions)
producer.initTransactions()
while (true) {
input, offsets = consumer.poll()
output = process(input)
producer.beginTransaction()
producer.send(output)
producer.sendOffsets(offsets)
producer.commitTransaction()
}
999999
EOS In Code
consumer.assign(partitions)
producer.initTransactions()
while (true) {
input, offsets = consumer.poll()
output = process(input)
producer.beginTransaction()
producer.send(output)
producer.sendOffsets(offsets)
producer.commitTransaction()
}
100
EOS Producer Scalability
101
Consumer Group
OutputA B C
Input
Processor
D E F
G H I
Processor
Processor
102
Kafka Streams
Application
OutputA B C
Input
Thread
D E F
G H I
Thread
Thread
103
Kafka Streams
Application
OutputA B C
Input
Thread
D E F
G H I
Thread
Thread
104
Streams Thread
Consumer Producer
state
state
state
Input Partition
Assignment
Output
Partitions
105
Streams Thread
Consumer Producer
state
state
state
Input Partition
Assignment
Output
Partitions
Task
106
Streams Thread
Consumer Producer
state
state
state
Input Partition
Assignment
Output
Partitions
For EOS, how do we guarantee single
writer scope for each input partition?
107
0 1 2 3 4 5t=0
At t=0, we have one
thread which is assigned
all partitions
108
0 1 2 3 4 5t=0
At t=1, the group
rebalances and we have
two threads
0 1t=1 2 3 4 5
109
0 1 2 3 4 5t=0
We must track the
transactional state
dependence across
rebalances!
0 1t=1 2 3 4 5
110
0 1 2 3 4 5t=0
We must track the
transactional state
dependence across
rebalances!
0 1t=1 2 3 4 5
t=2 0 1 2 3 4 5
111
0 1 2 3 4 5t=0
0 1t=1 2 3 4 5
t=2 0 1 2 3 4 5
0 1 2 3 4 5t=3
We must track the
transactional state
dependence across
rebalances!
112
Streams Thread
Consumer Producer
state
state
state
Input Partition
Assignment
Output
Partitions
113
Streams Thread
Consumer
Producer(s)
state
state
state
Input Partition
Assignment
Output
Partitions
114
0 1 2 3 4 5t=0
transactional.id = input partition
115
t=0
transactional.id = input partition0 1t=1 2 3 4 5
0 1 2 3 4 5
116
t=0
transactional.id = input partitiont=1
t=2 0 1 2 3 4 5
0 1 2 3 4 5
0 1 2 3 4 5
117
t=0
t=1
t=2
t=3 0 1 2 3 4 5
transactional.id = input partition
0 1 2 3 4 5
0 1 2 3 4 5
0 1 2 3 4 5
118
Streams Thread
Consumer
Producer(s)
state
state
state
Input Partition
Assignment
Output
Partitions
119
Record
Accumulator
Anatomy of the Kafka
Producer
IO
Thread
Network
Layer
Buffer Pool
Txn
Manager
120
What is the problem?
121
● The transactional producer assumes a static
assignment of input partitions
● Consumer group partition assignments are
dynamic
What is the
problem?
122122122
What is the
problem? consumer.assign(partitions)
producer.initTransactions()
while (true) {
input, offsets = consumer.poll()
output = process(input)
producer.beginTransaction()
producer.send(output)
producer.sendOffsets(offsets)
producer.commitTransaction()
}
123123123
What is the
problem? consumer.assign(partitions)
producer.initTransactions()
while (true) {
input, offsets = consumer.poll()
output = process(input)
producer.beginTransaction()
producer.send(output)
producer.sendOffsets(offsets)
producer.commitTransaction()
}
124124124
What is the
problem? consumer.subscribe(topics)
producer.initTransactions()
while (true) {
input, offsets = consumer.poll()
output = process(input)
producer.beginTransaction()
producer.send(output)
producer.sendOffsets(offsets)
producer.commitTransaction()
}
125
How to fix this
126
1. Allow the producer to multiplex many
transactional IDs
Options
127
Txn
Manager
Record
Accumulator
Anatomy of the Kafka
Producer
IO
Thread
Network
Layer
Buffer Pool
128
Txn
Manager
Txn
Manager
Record
Accumulator
Anatomy of the Kafka
Producer
IO
Thread
Network
Layer
Buffer Pool Txn
Manager
129
Record
Accumulator
Record
Accumulator
Txn
Manager
Txn
Manager
Record
Accumulator
Anatomy of the Kafka
Producer
IO
Thread
Network
Layer
Buffer Pool Txn
Manager
130
1. Allow the producer to multiplex many
transactional IDs
Options
131
1. Allow the producer to multiplex many
transactional IDs
2. Producer pooling for better resource sharing
Options
132
1. Allow the producer to multiplex many
transactional IDs
2. Producer pooling for better resource sharing
3. Address the assignment dependency problem
Options
133
1. Allow the producer to multiplex many
transactional IDs
2. Producer pooling for better resource sharing
3. Address the assignment dependency problem
Options
134
KIP-447
135
Txn Coordinator 1
Txn Coordinator 2
Txn Coordinator 3
Kafka Streams
Application
Thread
Thread
Thread
136
Txn Coordinator 1
Txn Coordinator 2
Txn Coordinator 3
Kafka Streams
Application
Thread
Thread
Thread
txnl.id=A
137
Txn Coordinator 1
Txn Coordinator 2
Txn Coordinator 3
Kafka Streams
Application
Thread
Thread
Thread
txnl.id=A
txnl.id=B
138
Txn Coordinator 1
Txn Coordinator 2
Txn Coordinator 3
Kafka Streams
Application
Thread
Thread
Thread
txnl.id=A
txnl.id=B
txnl.id=C
txnl.id=D
txnl.id=E
139
1. Use the shared group id to find the transaction
coordinator
KIP-447
Recipe
140
Txn Coordinator 1
Txn Coordinator 2
Txn Coordinator 3
Kafka Streams
Application
Thread
Thread
Thread
141
1. Use the shared group id to find the transaction
coordinator
2. Make the transaction coordinator aware of
group partition assignments
KIP-447
Recipe
142
0 1 2 3 4 5t=0
0 1t=1 2 3 4 5
t=2 0 1 2 3 4 5
0 1 2 3 4 5t=3
143
0 1 2 3 4 5generation=0
0 1generation=1 2 3 4 5
generation=2 0 1 2 3 4 5
0 1 2 3 4 5generation=3
144
1. Use the shared group id to find the transaction
coordinator
2. Make the transaction coordinator aware of
group partition assignments
3. Add logic to initialize and fence with
consideration of assignment
KIP-447
Recipe
145
Bump Epoch
Is Transaction
In Progress?
Begin Abort
Is Transaction
Completing?
Await
Completion
Yes
Yes
No
Return New
Epoch
No
Transactional Id
Initialization
146
Bump Epoch
Is Transaction
In Progress?
Begin Abort
Is Transaction
Completing?
Await
Completion
Yes
Yes
No
Return New
Epoch
No
Transaction
Assignment
Initialization
For all
assigned
partitions:
147
1. Use the shared group id to find the transaction
coordinator
2. Make the transaction coordinator aware of
group partition assignments
3. Add logic to initialize and fence with
consideration of assignment
4. Expose all this in a nice API
KIP-447
Recipe
148148148
KIP-447
In Code
consumer.subscribe(topics)
producer.initTxn()
while (true) {
input, offsets = consumer.poll()
output = process(input)
producer.beginTransaction()
producer.send(output)
producer.sendOffsets(offsets)
producer.commitTransaction()
}
149149149
KIP-447
In Code consumer.subscribe(topics,
onAssignment(partitions, gen) {
producer.initTxn(partitions, gen)
})
while (true) {
input, offsets = consumer.poll()
output = process(input)
producer.beginTransaction()
producer.send(output)
producer.sendOffsets(offsets)
producer.commitTransaction()
}
150
Streams Thread
Consumer Producer
state
state
state
Input Partition
Assignment
Output
Partitions
151
Error Resiliency
152
kafka-producer-network-thread | producer-1] ERROR o.a.k.clients.producer.internals.Sender -
[Producer clientId=producer-1] The broker returned
org.apache.kafka.common.errors.UnknownProducerIdException: This exception is
raised by the broker if it could not locate the producer metadata associated with the producerId in
question. This could happen if, for instance, the producer's records were deleted because their
retention time had elapsed. Once the last records of the producerId are removed, the producer's
metadata is removed from the broker, and future appends by the producer will return this
exception. for topic-partition foo-0 at offset -1. This indicates data loss on the broker, and
should be investigated.
153
Record
Accumulator
Anatomy of the Kafka
Producer
IO
Thread
Network
Layer
Buffer Pool
Txn
Manager
154
Record
Accumulator
Anatomy of the Kafka
Producer
IO
Thread
Network
Layer
Buffer Pool
Txn
Manager
155
Partition
Sequence
Number
foo-0 5
bar-1 23
baz-0 16
State Machine
Anatomy of the
Transaction Manager
state: InTransaction
156
Offset
ProducerId
Epoch
Sequence
Log
Broker Partition State
0 1 2 3 4
3 0 0 1 0
2 1 1 1 2
1 1 2 1 1
157
0 1 2 3 4
3 0 0 1 0
2 1 1 1 2
1 1 2 1 1
Offset
ProducerId
Epoch
Sequence
Log
Broker Partition State
ProducerId Epoch Sequence
0 2 1
1 1 1
3 2 1
Producer
State Cache
158
0 1 2 3 4 5
3 0 0 1 0 1
2 1 1 1 2 1
1 1 2 1 1 2
Offset
ProducerId
Epoch
Sequence
Log
Broker Partition State
ProducerId Epoch Sequence
0 2 1
1 1 2
3 2 1
Producer
State Cache
159
0 1 2 3 4 5 6
3 0 0 1 0 1 0
2 1 1 1 2 1 2
1 1 2 1 1 2 2
Offset
ProducerId
Epoch
Sequence
Log
Broker Partition State
ProducerId Epoch Sequence
0 2 2
1 1 2
3 2 1
Producer
State Cache
160
0 1 2 3 4 5 6
3 0 0 1 0 1 0
2 1 1 1 2 1 2
1 1 2 1 1 2 2
Offset
ProducerId
Epoch
Sequence
Log
Broker Partition State
ProducerId Epoch Sequence
0 2 2
1 1 2
3 2 1
Producer
State Cache
Records deleted after hitting
retention limit
161
4 5 6
0 1 0
2 1 2
1 2 2
Offset
ProducerId
Epoch
Sequence
Log
Broker Partition State
ProducerId Epoch Sequence
0 2 2
1 1 2
3 2 1
Producer
State Cache
162
4 5 6
0 1 0
2 1 2
1 2 2
Offset
ProducerId
Epoch
Sequence
Log
Broker Partition State
ProducerId Epoch Sequence
0 2 2
1 1 2
Producer
State Cache
163
Well..
164
- Used to change the partition key in Kafka
Streams
- Once repartitioned data has been consumed, it
is no longer needed
- Proactively actively delete unneeded data!
Repartition
Topics
165
0 1 2 3 4 5 6
3 0 0 1 0 1 0
2 1 1 1 2 1 2
1 1 2 1 1 2 2
Offset
ProducerId
Epoch
Sequence
Log
Broker Partition State
ProducerId Epoch Sequence
0 2 2
1 1 2
3 2 1
Producer
State Cache
166
0 1 2 3 4 5 6
3 0 0 1 0 1 0
2 1 1 1 2 1 2
1 1 2 1 1 2 2
Offset
ProducerId
Epoch
Sequence
Log
Broker Partition State
ProducerId Epoch Sequence
0 2 2
1 1 2
3 2 1
Producer
State Cache
167
Offset
ProducerId
Epoch
Sequence
Log
Broker Partition State
ProducerId Epoch Sequence
0 2 2
1 1 2
3 2 1
Producer
State Cache
168
Offset
ProducerId
Epoch
Sequence
Log
Broker Partition State
ProducerId Epoch Sequence
Producer
State Cache
169
How to fix this
170
Log
171
Log
172
m
Log
ProducerId Epoch Sequence
0 2 1
1 1 1
m.snapshot
173
m
Log
ProducerId Epoch Sequence
0 2 1
1 1 1
m.snapshot
174
m
Log
ProducerId Epoch Sequence
0 3 5
1 1 1
n.snapshot
n
ProducerId Epoch Sequence
0 2 1
1 1 1
m.snapshot
175
m
Log
ProducerId Epoch Sequence
0 3 5
1 1 1
n.snapshot
n
ProducerId Epoch Sequence
0 2 1
1 1 1
m.snapshot
176
m
Log
ProducerId Epoch Sequence
0 3 5
n.snapshot
n
ProducerId Epoch Sequence
0 2 1
1 1 1
m.snapshot
177
Maybe just don’t do that?
178
m
Log
ProducerId Epoch Sequence
0 3 5
1 1 1
n.snapshot
n
ProducerId Epoch Sequence
0 2 1
1 1 1
m.snapshot
179
Don’t forget about replication
180
m n
replica 1
ProducerId Epoch Sequence
0 3 5
1 1 1
n.snapshot
ProducerId Epoch Sequence
0 2 1
1 1 1
m.snapshot
181
m n
replica 1
ProducerId Epoch Sequence
0 3 5
1 1 1
n.snapshot
ProducerId Epoch Sequence
0 2 1
1 1 1
m.snapshot
replica 2
182
m n
replica 1
ProducerId Epoch Sequence
0 3 5
1 1 1
n.snapshot
ProducerId Epoch Sequence
0 2 1
1 1 1
m.snapshot
replica 2
183
m n
replica 1
ProducerId Epoch Sequence
0 3 5
1 1 1
n.snapshot
ProducerId Epoch Sequence
0 2 1
1 1 1
m.snapshot
replica 2
ProducerId Epoch Sequence
0 3 5
184
● Log record deletion
● Log start offset inconsistency
● Unclean leader election
Sequence
Conflicts
185
KIP-360
186
replica 1
ProducerId Epoch Sequence
0 3 5
1 1 1
State Cache
replica 2
ProducerId Epoch Sequence
0 3 5
State Cache
187
replica 1
(leader)
ProducerId Epoch Sequence
0 3 5
1 1 1
State Cache
replica 2
(follower)
ProducerId Epoch Sequence
0 3 5
State Cache
188
replica 1
(leader)
ProducerId Epoch Sequence
0 3 5
1 1 3
replica 2
(follower)
ProducerId Epoch Sequence
0 3 5
State Cache State Cache
189
replica 1
(leader)
ProducerId Epoch Sequence
0 3 5
1 1 3
replica 2
(follower)
ProducerId Epoch Sequence
0 3 5
1 1 3
State Cache State Cache
190
replica 1
(follower)
ProducerId Epoch Sequence
0 3 5
1 1 1
replica 2
(leader)
ProducerId Epoch Sequence
0 3 5
State Cache State Cache
191
replica 1
(follower)
ProducerId Epoch Sequence
0 3 5
1 1 1
replica 2
(leader)
ProducerId Epoch Sequence
0 3 5
1 2 2
State Cache State Cache
192
replica 1
(follower)
ProducerId Epoch Sequence
0 3 5
1 2 2
replica 2
(leader)
ProducerId Epoch Sequence
0 3 5
1 2 2
State Cache State Cache
193
Error Current Impact Future Recovery
OutOfOrderSequence FATAL Abort transaction, bump
epoch and continue
UnknownProducerId FATAL Abort transaction, bump
epoch and continue
KIP-360 Error Handling
194
Error Current Impact Future Recovery
OutOfOrderSequence FATAL Abort transaction, bump
epoch and continue
UnknownProducerId FATAL Abort transaction, bump
epoch and continue
ProducerFenced FATAL Rejoin consumer group,
reinitialize transaction state
KIP-360/KIP-447 Error Handling
195
Conclusion
196
Kafka has an elegant transaction model which has held up well.
To reach full maturity:
● Address the producer/consumer semantic mismatch
● Improve producer resilience to errors
197
Thank you!
198
- KIP-447:
https://cwiki.apache.org/confluence/display/KAFK
A/KIP-447%3A+Producer+scalability+for+exactly+o
nce+semantics
- KIP-360:
https://cwiki.apache.org/confluence/display/KAFK
A/KIP-360%3A+Improve+handling+of+unknown+pro
ducer
- Contribute to Apache Kafka:
https://kafka.apache.org/contributing
- Join Confluent: https://www.confluent.io/careers/
Resources

Weitere ähnliche Inhalte

Was ist angesagt?

Composing and Executing Parallel Data Flow Graphs wth Shell Pipes
Composing and Executing Parallel Data Flow Graphs wth Shell PipesComposing and Executing Parallel Data Flow Graphs wth Shell Pipes
Composing and Executing Parallel Data Flow Graphs wth Shell Pipes
Vinoth Chandar
 
FPGA design with CλaSH
FPGA design with CλaSHFPGA design with CλaSH
FPGA design with CλaSH
Conrad Parker
 
CSW2017 Henry li how to find the vulnerability to bypass the control flow gua...
CSW2017 Henry li how to find the vulnerability to bypass the control flow gua...CSW2017 Henry li how to find the vulnerability to bypass the control flow gua...
CSW2017 Henry li how to find the vulnerability to bypass the control flow gua...
CanSecWest
 

Was ist angesagt? (20)

Why scala is not my ideal language and what I can do with this
Why scala is not my ideal language and what I can do with thisWhy scala is not my ideal language and what I can do with this
Why scala is not my ideal language and what I can do with this
 
Like loggly using open source
Like loggly using open sourceLike loggly using open source
Like loggly using open source
 
Dynamo: Not Just For Datastores
Dynamo: Not Just For DatastoresDynamo: Not Just For Datastores
Dynamo: Not Just For Datastores
 
Composing and Executing Parallel Data Flow Graphs wth Shell Pipes
Composing and Executing Parallel Data Flow Graphs wth Shell PipesComposing and Executing Parallel Data Flow Graphs wth Shell Pipes
Composing and Executing Parallel Data Flow Graphs wth Shell Pipes
 
Code generation with javac plugin
Code generation with javac pluginCode generation with javac plugin
Code generation with javac plugin
 
Reactive server with netty
Reactive server with nettyReactive server with netty
Reactive server with netty
 
Making our Future better
Making our Future betterMaking our Future better
Making our Future better
 
AWS re:Invent 2018 notes
AWS re:Invent 2018 notesAWS re:Invent 2018 notes
AWS re:Invent 2018 notes
 
FPGA design with CλaSH
FPGA design with CλaSHFPGA design with CλaSH
FPGA design with CλaSH
 
Fluentd vs. Logstash for OpenStack Log Management
Fluentd vs. Logstash for OpenStack Log ManagementFluentd vs. Logstash for OpenStack Log Management
Fluentd vs. Logstash for OpenStack Log Management
 
An Introduction to Twisted
An Introduction to TwistedAn Introduction to Twisted
An Introduction to Twisted
 
CSW2017 Henry li how to find the vulnerability to bypass the control flow gua...
CSW2017 Henry li how to find the vulnerability to bypass the control flow gua...CSW2017 Henry li how to find the vulnerability to bypass the control flow gua...
CSW2017 Henry li how to find the vulnerability to bypass the control flow gua...
 
How we use Twisted in Launchpad
How we use Twisted in LaunchpadHow we use Twisted in Launchpad
How we use Twisted in Launchpad
 
Networking and Go: An Epic Journey
Networking and Go: An Epic JourneyNetworking and Go: An Epic Journey
Networking and Go: An Epic Journey
 
What is new in Go 1.8
What is new in Go 1.8What is new in Go 1.8
What is new in Go 1.8
 
Behavioral Reflection
Behavioral ReflectionBehavioral Reflection
Behavioral Reflection
 
Knit, Chisel, Hack: Building Programs in Guile Scheme (Strange Loop 2016)
Knit, Chisel, Hack: Building Programs in Guile Scheme (Strange Loop 2016)Knit, Chisel, Hack: Building Programs in Guile Scheme (Strange Loop 2016)
Knit, Chisel, Hack: Building Programs in Guile Scheme (Strange Loop 2016)
 
Virtual Machines Lecture
Virtual Machines LectureVirtual Machines Lecture
Virtual Machines Lecture
 
Optimizing with persistent data structures (LLVM Cauldron 2016)
Optimizing with persistent data structures (LLVM Cauldron 2016)Optimizing with persistent data structures (LLVM Cauldron 2016)
Optimizing with persistent data structures (LLVM Cauldron 2016)
 
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 ...
 

Ähnlich wie Exactly Once Semantics Revisited (Jason Gustafson, Confluent) Kafka Summit NYC 2019

Formal Verification of Transactional Interaction Contract
Formal Verification of Transactional Interaction ContractFormal Verification of Transactional Interaction Contract
Formal Verification of Transactional Interaction Contract
Gera Shegalov
 
Formal Verification of Web Service Interaction Contracts
Formal Verification of Web Service Interaction ContractsFormal Verification of Web Service Interaction Contracts
Formal Verification of Web Service Interaction Contracts
Gera Shegalov
 

Ähnlich wie Exactly Once Semantics Revisited (Jason Gustafson, Confluent) Kafka Summit NYC 2019 (20)

Presto overview
Presto overviewPresto overview
Presto overview
 
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
 
Exactly-Once Made Easy: Transactional Messaging Improvement for Usability and...
Exactly-Once Made Easy: Transactional Messaging Improvement for Usability and...Exactly-Once Made Easy: Transactional Messaging Improvement for Usability and...
Exactly-Once Made Easy: Transactional Messaging Improvement for Usability and...
 
WCM Transfer Services
WCM Transfer Services WCM Transfer Services
WCM Transfer Services
 
Exactly-Once Made Easy: Transactional Messaging Improvement for Usability and...
Exactly-Once Made Easy: Transactional Messaging Improvement for Usability and...Exactly-Once Made Easy: Transactional Messaging Improvement for Usability and...
Exactly-Once Made Easy: Transactional Messaging Improvement for Usability and...
 
Big Data Day LA 2016/ Hadoop/ Spark/ Kafka track - Data Provenance Support in...
Big Data Day LA 2016/ Hadoop/ Spark/ Kafka track - Data Provenance Support in...Big Data Day LA 2016/ Hadoop/ Spark/ Kafka track - Data Provenance Support in...
Big Data Day LA 2016/ Hadoop/ Spark/ Kafka track - Data Provenance Support in...
 
Formal Verification of Transactional Interaction Contract
Formal Verification of Transactional Interaction ContractFormal Verification of Transactional Interaction Contract
Formal Verification of Transactional Interaction Contract
 
Event Stream Processing with BeepBeep 3
Event Stream Processing with BeepBeep 3Event Stream Processing with BeepBeep 3
Event Stream Processing with BeepBeep 3
 
Digital System Design Lab Report - VHDL ECE
Digital System Design Lab Report - VHDL ECEDigital System Design Lab Report - VHDL ECE
Digital System Design Lab Report - VHDL ECE
 
Apache Flink: Better, Faster & Uncut - Piotr Nowojski, data Artisans
Apache Flink: Better, Faster & Uncut - Piotr Nowojski, data ArtisansApache Flink: Better, Faster & Uncut - Piotr Nowojski, data Artisans
Apache Flink: Better, Faster & Uncut - Piotr Nowojski, data Artisans
 
UM2019 Extended BPF: A New Type of Software
UM2019 Extended BPF: A New Type of SoftwareUM2019 Extended BPF: A New Type of Software
UM2019 Extended BPF: A New Type of Software
 
Memory efficient pytorch
Memory efficient pytorchMemory efficient pytorch
Memory efficient pytorch
 
Debug Information And Where They Come From
Debug Information And Where They Come FromDebug Information And Where They Come From
Debug Information And Where They Come From
 
State Management in Apache Flink : Consistent Stateful Distributed Stream Pro...
State Management in Apache Flink : Consistent Stateful Distributed Stream Pro...State Management in Apache Flink : Consistent Stateful Distributed Stream Pro...
State Management in Apache Flink : Consistent Stateful Distributed Stream Pro...
 
ML Visuals.pptx
ML Visuals.pptxML Visuals.pptx
ML Visuals.pptx
 
Formal Verification of Web Service Interaction Contracts
Formal Verification of Web Service Interaction ContractsFormal Verification of Web Service Interaction Contracts
Formal Verification of Web Service Interaction Contracts
 
C++ nots
C++ notsC++ nots
C++ nots
 
05viewing2d
05viewing2d05viewing2d
05viewing2d
 
2D viewing
2D viewing2D viewing
2D viewing
 
effective_r27
effective_r27effective_r27
effective_r27
 

Mehr von confluent

Mehr von confluent (20)

Catch the Wave: SAP Event-Driven and Data Streaming for the Intelligence Ente...
Catch the Wave: SAP Event-Driven and Data Streaming for the Intelligence Ente...Catch the Wave: SAP Event-Driven and Data Streaming for the Intelligence Ente...
Catch the Wave: SAP Event-Driven and Data Streaming for the Intelligence Ente...
 
Santander Stream Processing with Apache Flink
Santander Stream Processing with Apache FlinkSantander Stream Processing with Apache Flink
Santander Stream Processing with Apache Flink
 
Unlocking the Power of IoT: A comprehensive approach to real-time insights
Unlocking the Power of IoT: A comprehensive approach to real-time insightsUnlocking the Power of IoT: A comprehensive approach to real-time insights
Unlocking the Power of IoT: A comprehensive approach to real-time insights
 
Workshop híbrido: Stream Processing con Flink
Workshop híbrido: Stream Processing con FlinkWorkshop híbrido: Stream Processing con Flink
Workshop híbrido: Stream Processing con Flink
 
Industry 4.0: Building the Unified Namespace with Confluent, HiveMQ and Spark...
Industry 4.0: Building the Unified Namespace with Confluent, HiveMQ and Spark...Industry 4.0: Building the Unified Namespace with Confluent, HiveMQ and Spark...
Industry 4.0: Building the Unified Namespace with Confluent, HiveMQ and Spark...
 
AWS Immersion Day Mapfre - Confluent
AWS Immersion Day Mapfre   -   ConfluentAWS Immersion Day Mapfre   -   Confluent
AWS Immersion Day Mapfre - Confluent
 
Eventos y Microservicios - Santander TechTalk
Eventos y Microservicios - Santander TechTalkEventos y Microservicios - Santander TechTalk
Eventos y Microservicios - Santander TechTalk
 
Q&A with Confluent Experts: Navigating Networking in Confluent Cloud
Q&A with Confluent Experts: Navigating Networking in Confluent CloudQ&A with Confluent Experts: Navigating Networking in Confluent Cloud
Q&A with Confluent Experts: Navigating Networking in Confluent Cloud
 
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
 
Build real-time streaming data pipelines to AWS with Confluent
Build real-time streaming data pipelines to AWS with ConfluentBuild real-time streaming data pipelines to AWS with Confluent
Build real-time streaming data pipelines to AWS with Confluent
 
Q&A with Confluent Professional Services: Confluent Service Mesh
Q&A with Confluent Professional Services: Confluent Service MeshQ&A with Confluent Professional Services: Confluent Service Mesh
Q&A with Confluent Professional Services: Confluent Service Mesh
 
Citi Tech Talk: Event Driven Kafka Microservices
Citi Tech Talk: Event Driven Kafka MicroservicesCiti Tech Talk: Event Driven Kafka Microservices
Citi Tech Talk: Event Driven Kafka Microservices
 
Confluent & GSI Webinars series - Session 3
Confluent & GSI Webinars series - Session 3Confluent & GSI Webinars series - Session 3
Confluent & GSI Webinars series - Session 3
 
Citi Tech Talk: Messaging Modernization
Citi Tech Talk: Messaging ModernizationCiti Tech Talk: Messaging Modernization
Citi Tech Talk: Messaging Modernization
 
Citi Tech Talk: Data Governance for streaming and real time data
Citi Tech Talk: Data Governance for streaming and real time dataCiti Tech Talk: Data Governance for streaming and real time data
Citi Tech Talk: Data Governance for streaming and real time data
 
Confluent & GSI Webinars series: Session 2
Confluent & GSI Webinars series: Session 2Confluent & GSI Webinars series: Session 2
Confluent & GSI Webinars series: Session 2
 
Data In Motion Paris 2023
Data In Motion Paris 2023Data In Motion Paris 2023
Data In Motion Paris 2023
 
Confluent Partner Tech Talk with Synthesis
Confluent Partner Tech Talk with SynthesisConfluent Partner Tech Talk with Synthesis
Confluent Partner Tech Talk with Synthesis
 
The Future of Application Development - API Days - Melbourne 2023
The Future of Application Development - API Days - Melbourne 2023The Future of Application Development - API Days - Melbourne 2023
The Future of Application Development - API Days - Melbourne 2023
 
The Playful Bond Between REST And Data Streams
The Playful Bond Between REST And Data StreamsThe Playful Bond Between REST And Data Streams
The Playful Bond Between REST And Data Streams
 

Kürzlich hochgeladen

Cloud Frontiers: A Deep Dive into Serverless Spatial Data and FME
Cloud Frontiers:  A Deep Dive into Serverless Spatial Data and FMECloud Frontiers:  A Deep Dive into Serverless Spatial Data and FME
Cloud Frontiers: A Deep Dive into Serverless Spatial Data and FME
Safe Software
 
Architecting Cloud Native Applications
Architecting Cloud Native ApplicationsArchitecting Cloud Native Applications
Architecting Cloud Native Applications
WSO2
 
Modular Monolith - a Practical Alternative to Microservices @ Devoxx UK 2024
Modular Monolith - a Practical Alternative to Microservices @ Devoxx UK 2024Modular Monolith - a Practical Alternative to Microservices @ Devoxx UK 2024
Modular Monolith - a Practical Alternative to Microservices @ Devoxx UK 2024
Victor Rentea
 

Kürzlich hochgeladen (20)

Apidays New York 2024 - APIs in 2030: The Risk of Technological Sleepwalk by ...
Apidays New York 2024 - APIs in 2030: The Risk of Technological Sleepwalk by ...Apidays New York 2024 - APIs in 2030: The Risk of Technological Sleepwalk by ...
Apidays New York 2024 - APIs in 2030: The Risk of Technological Sleepwalk by ...
 
Cloud Frontiers: A Deep Dive into Serverless Spatial Data and FME
Cloud Frontiers:  A Deep Dive into Serverless Spatial Data and FMECloud Frontiers:  A Deep Dive into Serverless Spatial Data and FME
Cloud Frontiers: A Deep Dive into Serverless Spatial Data and FME
 
"I see eyes in my soup": How Delivery Hero implemented the safety system for ...
"I see eyes in my soup": How Delivery Hero implemented the safety system for ..."I see eyes in my soup": How Delivery Hero implemented the safety system for ...
"I see eyes in my soup": How Delivery Hero implemented the safety system for ...
 
Understanding the FAA Part 107 License ..
Understanding the FAA Part 107 License ..Understanding the FAA Part 107 License ..
Understanding the FAA Part 107 License ..
 
Vector Search -An Introduction in Oracle Database 23ai.pptx
Vector Search -An Introduction in Oracle Database 23ai.pptxVector Search -An Introduction in Oracle Database 23ai.pptx
Vector Search -An Introduction in Oracle Database 23ai.pptx
 
Architecting Cloud Native Applications
Architecting Cloud Native ApplicationsArchitecting Cloud Native Applications
Architecting Cloud Native Applications
 
Polkadot JAM Slides - Token2049 - By Dr. Gavin Wood
Polkadot JAM Slides - Token2049 - By Dr. Gavin WoodPolkadot JAM Slides - Token2049 - By Dr. Gavin Wood
Polkadot JAM Slides - Token2049 - By Dr. Gavin Wood
 
WSO2's API Vision: Unifying Control, Empowering Developers
WSO2's API Vision: Unifying Control, Empowering DevelopersWSO2's API Vision: Unifying Control, Empowering Developers
WSO2's API Vision: Unifying Control, Empowering Developers
 
Six Myths about Ontologies: The Basics of Formal Ontology
Six Myths about Ontologies: The Basics of Formal OntologySix Myths about Ontologies: The Basics of Formal Ontology
Six Myths about Ontologies: The Basics of Formal Ontology
 
Apidays New York 2024 - Passkeys: Developing APIs to enable passwordless auth...
Apidays New York 2024 - Passkeys: Developing APIs to enable passwordless auth...Apidays New York 2024 - Passkeys: Developing APIs to enable passwordless auth...
Apidays New York 2024 - Passkeys: Developing APIs to enable passwordless auth...
 
Apidays New York 2024 - Scaling API-first by Ian Reasor and Radu Cotescu, Adobe
Apidays New York 2024 - Scaling API-first by Ian Reasor and Radu Cotescu, AdobeApidays New York 2024 - Scaling API-first by Ian Reasor and Radu Cotescu, Adobe
Apidays New York 2024 - Scaling API-first by Ian Reasor and Radu Cotescu, Adobe
 
Connector Corner: Accelerate revenue generation using UiPath API-centric busi...
Connector Corner: Accelerate revenue generation using UiPath API-centric busi...Connector Corner: Accelerate revenue generation using UiPath API-centric busi...
Connector Corner: Accelerate revenue generation using UiPath API-centric busi...
 
Apidays New York 2024 - The value of a flexible API Management solution for O...
Apidays New York 2024 - The value of a flexible API Management solution for O...Apidays New York 2024 - The value of a flexible API Management solution for O...
Apidays New York 2024 - The value of a flexible API Management solution for O...
 
Modular Monolith - a Practical Alternative to Microservices @ Devoxx UK 2024
Modular Monolith - a Practical Alternative to Microservices @ Devoxx UK 2024Modular Monolith - a Practical Alternative to Microservices @ Devoxx UK 2024
Modular Monolith - a Practical Alternative to Microservices @ Devoxx UK 2024
 
How to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected WorkerHow to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected Worker
 
Strategize a Smooth Tenant-to-tenant Migration and Copilot Takeoff
Strategize a Smooth Tenant-to-tenant Migration and Copilot TakeoffStrategize a Smooth Tenant-to-tenant Migration and Copilot Takeoff
Strategize a Smooth Tenant-to-tenant Migration and Copilot Takeoff
 
TrustArc Webinar - Unlock the Power of AI-Driven Data Discovery
TrustArc Webinar - Unlock the Power of AI-Driven Data DiscoveryTrustArc Webinar - Unlock the Power of AI-Driven Data Discovery
TrustArc Webinar - Unlock the Power of AI-Driven Data Discovery
 
MS Copilot expands with MS Graph connectors
MS Copilot expands with MS Graph connectorsMS Copilot expands with MS Graph connectors
MS Copilot expands with MS Graph connectors
 
ICT role in 21st century education and its challenges
ICT role in 21st century education and its challengesICT role in 21st century education and its challenges
ICT role in 21st century education and its challenges
 
FWD Group - Insurer Innovation Award 2024
FWD Group - Insurer Innovation Award 2024FWD Group - Insurer Innovation Award 2024
FWD Group - Insurer Innovation Award 2024
 

Exactly Once Semantics Revisited (Jason Gustafson, Confluent) Kafka Summit NYC 2019