[ https://issues.apache.org/jira/browse/KAFKA-1827?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]
Jay Kreps resolved KAFKA-1827. ------------------------------ Resolution: Won't Fix Yeah this is interesting but currently out of scope. > Optimistic Locking when Producing Messages > ------------------------------------------ > > Key: KAFKA-1827 > URL: https://issues.apache.org/jira/browse/KAFKA-1827 > Project: Kafka > Issue Type: Improvement > Reporter: Daniel Schierbeck > > (I wasn't able to post to the ML, so I'm adding an issue instead. I hope > that's okay.) > I'm trying to design a system that uses Kafka as its primary data store by > persisting immutable events into a topic and keeping a secondary index in > another data store. The secondary index would store the "entities". Each > event would pertain to some "entity", e.g. a user, and those entities are > stored in an easily queriable way. > Kafka seems well suited for this, but there's one thing I'm having problems > with. I cannot guarantee that only one process writes events about an entity, > which makes the design vulnerable to integrity issues. > For example, say that a user can have multiple email addresses assigned, and > the EmailAddressRemoved event is published when the user removes one. There's > an integrity constraint, though: every user MUST have at least one email > address. As far as I can see, there's no way to stop two separate processes > from looking up a user entity, seeing that there are two email addresses > assigned, and each publish an event. The end result would violate the > contraint. > If I'm wrong in saying that this isn't possible I'd love some feedback! > My current thinking is that Kafka could relatively easily support this kind > of application with a small additional API. Kafka already has the abstract > notion of entities through its key-based retention policy. If the produce API > was modified in order to allow an integer OffsetConstraint, the following > algorithm could determine whether the request should proceed: > 1. For every key seen, keep track of the offset of the latest message > referencing the key. > 2. When an OffsetContraint is specified in the produce API call, compare that > value with the latest offset for the message key. > 2.1. If they're identical, allow the operation to continue. > 2.2. If they're not identical, fail with some OptimisticLockingFailure. > Would such a feature be completely out of scope for Kafka? -- This message was sent by Atlassian JIRA (v6.3.4#6332)