[ https://issues.apache.org/jira/browse/KAFKA-156?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=13630835#comment-13630835 ]
Jay Kreps commented on KAFKA-156: --------------------------------- Scott--I am interested in implementing a deduplication scheme similar to what you propose. I think this would have several uses. This would definitely be post 0.8. I do think we are conflating the storage location (disk versus memory) with deduplication/commit mechanism. I claim the scheme you propose just avoids duplicates and is unrelated to writing data to disk. I have to say I am a little skeptical of the "fall back to disk thing". In our usage we have many thousands of servers and a small number of kafka servers with nice disks--I think this is fairly standard. The idea that involving thousands of crappy local disks in the data pipeline will decrease the empirical frequency of data loss seems dubious to me. But regardless of whether you buffer on disk or buffer in memory (as the client currently does). As long as the client has sufficient space to buffer until the server is available again there is no data loss. And indeed the replication fail-over is very fast so this really does work. As you point out, though that does lead to the possibility of duplicate messages. Which is where you proposal comes in. I had thought of a similar thing. Here was my idea: 1. Client provides a unique instance id for itself. 2. Each message contains the instance id and a per-client sequence number 3. Broker maintains a per-client highwater mark on the sequence number, periodically checkpointed to disk 4. In the event of a hard crash the broker rebuilds the highwater marks from the last checkpoint and the log 5. Broker discards any request containing a message from a client that has a sequence number less than or equal to the high-water mark. The advantage of this approach would be that it doesn't require a multi-phase produce, the disadvantage is that it requires assigning client ids. One question about your proposal. Let's say that the broker fails before sending the "Acknowledge Batch Commit", ownership of that partition fails over to another broker but that broker but the client doesn't know if the transaction was committed (and the broker died just before sending the ack) or was not committed. How can the producer then send to the other broker which won't have the same UUID info? > Messages should not be dropped when brokers are unavailable > ----------------------------------------------------------- > > Key: KAFKA-156 > URL: https://issues.apache.org/jira/browse/KAFKA-156 > Project: Kafka > Issue Type: Improvement > Reporter: Sharad Agarwal > Fix For: 0.8 > > > When none of the broker is available, producer should spool the messages to > disk and keep retrying for brokers to come back. > This will also enable brokers upgrade/maintenance without message loss. -- This message is automatically generated by JIRA. If you think it was sent incorrectly, please contact your JIRA administrators For more information on JIRA, see: http://www.atlassian.com/software/jira