Current state: Accepted
Discussion thread: here
Please keep the discussion on the mailing list rather than commenting on the wiki (wiki discussions get unwieldy fast).
The stream module of Kafka has a window state store that stores the aggregated values for a key in a given time frame. The window store is implemented as an interface, this interface has a strange method named put(key, value), this method has does not have a timestamp as a parameter which is important to determine that to which window frame does the key belongs. In this method, the current record timestamp is used for determining the window frame(as specified in the description of the method), this constraint makes WindowStore error prone. It is also specified in the method description that method with a timestamp parameter should be used which already present in the interface which expects key, value, and start timestamp as well of the window to which the key belongs. Therefore by deprecating (and finally removing) the method put(key, value), we can prevent inconsistency.
Following is the method to be deprecated in the WindowStore interface.
We propose to deprecate the method WindowStore#put(key, value), as it has no timestamp specified in it, the timestamp is identified based on the current record and therefore does not satisfy the behavior of the window store. The timestamp is required as it is used to identify the window frame to which the key belongs.
Compatibility, Deprecation, and Migration Plan
Following are the list of the classes that implement this interface so also are needed to be updated.
Also, there are tests which are needed to be updated after deprecation of the specified method. Following are the list of test classes which are needed to update.
- SimpleBenchmark.java (benchmarking)
As here we are proposing to deprecate a method because the method does not satisfy the behaviour of the interface, the alternative would be to:-
- Update the method, so that the correct timestamp associated with the key can be accessed
- Since this API can be called by the user, updating the method can break the code. By this reason, this approach is not feasible.