3 ms·
If you have a consumer on some other node that does nothing more that a println statement, you will see that there will be more than once delivery. Exactly onc
by danielblazevski 9y ago
If you have a consumer on some other node that does nothing more that a println statement, you will see that there will be more than once delivery.
Exactly once seems to refer to exactly once write to kafka and processing in kafka streams that write back to kafka and don't do stuff like make external http requests, in which case you'll need your logic of at most or at least once to delivery results to wherever you're sending the http requests.
Confluence blogs do seem pretty misleading in terms of hiding these issues.
- thanatos_dem 9y agoI think the term they meant to use was “idempotent”, but that doesn’t get attention the same way that claiming to violate the FLP result does.
- danielblazevski 9y agoNot sure that I agree with that. I just think that they are opaque to what they really mean by exactly-once and definitely hide the fact that they do not offer exactly-once delivery.
- deleted 9y ago[deleted]
- thanatos_dem 9y agoWe can look at the ProduceRequest logic in their design doc - (https://docs.google.com/document/d/11Jqy_GjUGtdXJK94XGsEIK7CP1SnQGdp2eF0wSw9ra8/edit#bookmark=kix.x4k78mufyunt https://docs.google.com/document/d/11Jqy_GjUGtdXJK94XGsEIK7C...) Check the sequence number map to determine if the PID is already present. If it is not, check sequence number. If it is 0, insert the PID, epoch, and sequence number into the PID mapping table and proceed to append the entries. If the sequence is not zero, return the InvalidSequenceNumber error code. If the PID is present in the mapping, check the epoch. If the epoch is older than the current one, return InvalidProducerEpoch error code. If the epoch matches the current epoch, check the sequence number: If it matches the current sequence number, allow the append. If the sequence number is older than the current sequence number, return DuplicateSequenceNumber. If it is newer, return InvalidSequenceNumber. If the epoch is newer, check the sequence number. If it is 0, update the mapping and allow the append. If it is not 0, return InvalidSequenceNumber. That's a pretty straightforward approach of enforcing idempotency; checking producer and sequence IDs and throwing them out if they aren't correctly ordered. The other big addition to the code base was cross-partition transactions, which, while pretty cool, is a far cry from "Exactly once delivery".