Hi Matthias, Thank you very much for the detailed feedback. Here are my opinions:
> Because there is no final result for non-windowed KTables, it seems that this new feature only make sense for the windowed-aggregation case? I think a little bit different. Of course, for windowed KTable, this feature provides the final state; for non-windowed KTables, it provides a view to the records received more than the predefined waiting time ago - excluding the records that are waiting for more events. > Thus, the signature of `Materialized` should take a `WindowStore` instead of a `KeyValueStore`? I reviewed the implementation following your comments and found the following: 1. `Materialized` instance includes the following: KeySerde, ValueSerde, StoreSupplier, and Queriable Name. 2. The other `Materialized` method variants in `KTable` are making use of KeySerde, ValueSerde, and Queriable Name only. (That is, StoreSupplier is ignored.) 3. `KTable#suppress(Suppressed, Materialized)` uses the Queriable Name only. StoreSupplier is also ignored. So, we have three choices for the method signature: 1. `KTable#suppress(Suppressed, String)` (i.e., passing the Queriable Name only): This is the simplest; however, it is inconsistent with the other Materialized variant methods. 2. `KTable#suppress(Suppressed, Materialized<K, V, KeyValueStore>)` (i.e., current proposal) This approach is harmless at this point, for StoreSupplier is ignored; However, since suppression can be used to both of `KeyValueStore` and `WindowStore`, this approach is not only weird but also leaving some potential risk to the future. (On second thoughts, I agree, this API design is bad and dangerous.) 3. `KTable#suppress(Suppressed, Materialized<K, V, StateStore>)` This approach embraces both of `KeyValueStore` and `WindowStore` cases. Since the concrete class type of `Suppressed` instance differs for the `StateStore`[^1], it seems like we can validate the arguments on the method call. (e.g., throw `IllegalArgumentException` if when `Suppressed` instance on `KeyValueStore` is given with `Materialized` instance of `WindowStore`.) This approach not only breaks the API consistency but also guards from a miss-usage of the API. How do you think? I am now making a try on the third approach. Thanks, Dongjin [^1]: `SuppressedInternal` for `KeyValueStore` and `FinalResultsSuppressionBuilder` for `WindowStore`. On Sat, Sep 12, 2020 at 3:29 AM Matthias J. Sax <mj...@apache.org> wrote: > Thanks for updating the KIP. > > I think there is still one open question. `suppress()` can be used on > non-windowed KTable for rate control, as well as on a windowed-KTable > (also for rate control, but actually mainly) for only emitting the final > result of a windowed aggregation. For the non-windowed case, we use a > KeyValueStore while for the windowed cases, we use a WindowStore. > > Because there is no final result for non-windowed KTables, it seems that > this new feature only make sense for the windowed-aggregation case? > Thus, the signature of `Materialized` should take a `WindowStore` > instead of a `KeyValueStore`? > > If that's correct, I am wondering: > > - Can we guard from a miss-usage of the API if the upstream KTable is > not windowed (or maybe it's not necessary to guard)? > - Can we actually implement it? We had issues with regard to KIP-300 to > materialize windowed-KTables? > > Would be worth to clarify upfront. Maybe, we even need a POC > implementation to verify that it works? > > > -Matthias > > > On 9/11/20 12:26 AM, Dongjin Lee wrote: > > Hi All, > > > > Here is the voting thread: > > > > https://lists.apache.org/thread.html/r5653bf2dafbb27b247bf20dbe6f070c151b3823d96c9c9ca94183e20%40%3Cdev.kafka.apache.org%3E > > > > Thanks, > > Dongjin > > > > On Fri, Sep 11, 2020 at 4:23 PM Dongjin Lee <dong...@apache.org> wrote: > > > >> Hi John, > >> > >> Thanks for the feedback. I will open the Vote thread now. > >> > >> Best, > >> Dongjin > >> > >> On Fri, Sep 11, 2020 at 2:00 AM John Roesler <vvcep...@apache.org> > wrote: > >> > >>> Hi Dongjin, > >>> > >>> Sorry for the delay. I'm glad you're still pushing this > >>> forward. It would be nice to get this in to the 2.7 release. > >>> > >>> I just took another look at the KIP, and it looks good to > >>> me! > >>> > >>> I think this is ready for a vote. > >>> > >>> Thanks, > >>> -John > >>> > >>> On Wed, 2020-08-05 at 22:04 +0900, Dongjin Lee wrote: > >>>> Hi All, > >>>> > >>>> I updated the KIP > >>>> < > >>> > > https://cwiki.apache.org/confluence/display/KAFKA/KIP-508%3A+Make+Suppression+State+Queriable > >>>> > >>>> and the implementation, following the discussion here. > >>>> > >>>> You must be working hard preparing the release of 2.6.0, so please > have > >>> a > >>>> look after your work is done. > >>>> > >>>> Thanks, > >>>> Dongjin > >>>> > >>>> On Sun, Mar 8, 2020 at 12:20 PM John Roesler <vvcep...@apache.org> > >>> wrote: > >>>> > >>>>> Thanks Matthias, > >>>>> > >>>>> Good idea. I've changed the ticket name and added a note > >>>>> clarifying that this ticket is not the same as > >>>>> https://issues.apache.org/jira/browse/KAFKA-7224 > >>>>> > >>>>> Incidentally, I learned that I never documented my reasons > >>>>> for abandoning my work on KAFKA-7224 ! I've now updated > >>>>> that ticket, too, so your question had an unexpected side-benefit. > >>>>> > >>>>> Thanks, > >>>>> -John > >>>>> > >>>>> On Sat, Mar 7, 2020, at 18:01, Matthias J. Sax wrote: > > Thanks for clarification. > > > > Can you maybe update the Jira ticket? Do we have a ticket for > > spill-to-disk? Maybe link to it and explain that it's two different > > things? Maybe even rename the ticket to something more clear, ie, > > "make suppress result queryable" or simliar? > > > > > > -Matthias > > > > On 3/7/20 1:58 PM, John Roesler wrote: > >>>>>>>> Hey Matthias, > >>>>>>>> > >>>>>>>> I’m sorry if the ticket was poorly stated. The ticket is to add a > > DSL overload to pass a Materialized argument to suppress. As a > >>>> result, > > the result of the suppression would be queriable. > >>>>>>>> This is unrelated to “persistent buffer” aka “spill-to-disk”. > >>>>>>>> > >>>>>>>> There was some confusion before about whether this ticket could be > > implemented as “query the buffer”. Maybe it can, but not trivially. > > The obvious way is just to add a new state store which we write the > > results into just before we forward. I.e., it’s exactly like the > > materialized variant of any stateless KTable operation. > >>>>>>>> Thanks, John > >>>>>>>> > >>>>>>>> On Sat, Mar 7, 2020, at 15:32, Matthias J. Sax wrote: Thanks for > >>>>>>>> the KIP Dongjin, > >>>>>>>> > >>>>>>>> I am still not sure if I can follow, what might also be caused by > >>>>>>>> the backing JIRA ticket (maybe John can clarify the intent of the > >>>>>>>> ticket as he created it): > >>>>>>>> > >>>>>>>> Currently, suppress() only uses an in-memory buffer and my > >>>>>>>> understanding of the Jira is, to add the ability to use a > >>>>>>>> persistent buffer (ie, spill to disk backed by RocksDB). > >>>>>>>> > >>>>>>>> Adding a persistent buffer is completely unrelated to allow > >>>>>>>> querying the buffer. In fact, one could query an in-memory buffer, > >>>>>>>> too. However, querying the buffer does not really seem to be > >>>> useful > >>>>>>>> as pointed out by John, as you can always query the upstream > >>>> KTable > >>>>>>>> store. > >>>>>>>> > >>>>>>>> Also note that for the emit-on-window-close case the result is > >>>>>>>> deleted from the buffer when it is emitted, and thus cannot be > >>>>>>>> queried any longe r. > >>>>>>>> > >>>>>>>> > >>>>>>>> Can you please clarify if you intend to allow spilling to disk or > >>>>>>>> if you intent to enable IQ (even if I don't see why querying make > >>>>>>>> sense, as the data is either upstream or deleted). Also, if you > >>>>>>>> want to enable IQ, why do we need all those new interfaces? The > >>>>>>>> result of a suppress() is a KTable that is the same as any other > >>>>>>>> key-value/windowed/sessions store? > >>>>>>>> > >>>>>>>> We should also have corresponding Jira tickets for different cases > >>>>>>>> to avoid the confusion I am in atm :) > >>>>>>>> > >>>>>>>> > >>>>>>>> -Matthias > >>>>>>>> > >>>>>>>> > >>>>>>>> On 2/27/20 8:21 AM, John Roesler wrote: > >>>>>>>>>>> Hi Dongjin, > >>>>>>>>>>> > >>>>>>>>>>> No problem; glad we got it sorted out. > >>>>>>>>>>> > >>>>>>>>>>> Thanks again for picking this up! -John > >>>>>>>>>>> > >>>>>>>>>>> On Wed, Feb 26, 2020, at 09:24, Dongjin Lee wrote: > >>>>>>>>>>>>> I was under the impression that you wanted to expand the > >>>>>>>>>>>>> scope of the KIP > >>>>>>>>>>>> to additionally allow querying the internal buffer, not > >>>>>>>>>>>> just the result. Can you clarify whether you are proposing > >>>>>>>>>>>> to allow querying the state of the internal buffer, the > >>>>>>>>>>>> result, or both? > >>>>>>>>>>>> > >>>>>>>>>>>> Sorry for the confusion. As we already talked with, we > >>>> only > >>>>>>>>>>>> need to query the suppressed output, not the internal > >>>>>>>>>>>> buffer. The current implementation is wrong. After > >>>> refining > >>>>>>>>>>>> the KIP and implementation accordingly I will notify you - > >>>>>>>>>>>> I must be confused, also. > >>>>>>>>>>>> > >>>>>>>>>>>> Thanks, Dongjin > >>>>>>>>>>>> > >>>>>>>>>>>> On Tue, Feb 25, 2020 at 12:17 AM John Roesler > >>>>>>>>>>>> <vvcep...@apache.org> wrote: > >>>>>>>>>>>> > >>>>>>>>>>>>> Hi Dongjin, > >>>>>>>>>>>>> > >>>>>>>>>>>>> Ah, I think I may have been confused. I 100% agree that > >>>>>>>>>>>>> we need a materialized variant for suppress(). Then, you > >>>>>>>>>>>>> could do: ...suppress(..., > >>>>>>>>>>>>> Materialized.as(“final-count”)) > >>>>>>>>>>>>> > >>>>>>>>>>>>> If that’s your proposal, then we are on the same page. > >>>>>>>>>>>>> > >>>>>>>>>>>>> I was under the impression that you wanted to expand the > >>>>>>>>>>>>> scope of the KIP to additionally allow querying the > >>>>>>>>>>>>> internal buffer, not just the result. Can you clarify > >>>>>>>>>>>>> whether you are proposing to allow querying the state of > >>>>>>>>>>>>> the internal buffer, the result, or both? > >>>>>>>>>>>>> > >>>>>>>>>>>>> Thanks, John > >>>>>>>>>>>>> > >>>>>>>>>>>>> On Thu, Feb 20, 2020, at 08:41, Dongjin Lee wrote: > >>>>>>>>>>>>>> Hi John, Thanks for your kind explanation with an > >>>>>>>>>>>>>> example. > >>>>>>>>>>>>>> > >>>>>>>>>>>>>>> But it feels like you're saying you're trying to do > >>>>>>>>>>>>>>> something different > >>>>>>>>>>>>>> than just query the windowed key and get back the > >>>>>>>>>>>>>> current count? > >>>>>>>>>>>>>> > >>>>>>>>>>>>>> Yes, for example, what if we need to retrieve the (all > >>>>>>>>>>>>>> or range) keys > >>>>>>>>>>>>> with > >>>>>>>>>>>>>> a closed window? In this example, let's imagine we > >>>> need > >>>>>>>>>>>>>> to retrieve only (key=A, window=10), not (key=A, > >>>>>>>>>>>>>> window=20). > >>>>>>>>>>>>>> > >>>>>>>>>>>>>> Of course, the value accompanied by a flushed key is > >>>>>>>>>>>>>> exactly the same to the one in the upstream KTable; > >>>>>>>>>>>>>> However, if our intention is not pointing out a > >>>>>>>>>>>>>> specific key but retrieving a group of unspecified > >>>>>>>>>>>>>> keys, we stuck > >>>>>>>>>>>>> in > >>>>>>>>>>>>>> trouble - since we can't be sure which key is flushed > >>>>>>>>>>>>>> out beforehand. > >>>>>>>>>>>>>> > >>>>>>>>>>>>>> One workaround would be materializing it with > >>>>>>>>>>>>>> `suppressed.filter(e -> > >>>>>>>>>>>>> true, > >>>>>>>>>>>>>> Materialized.as("final-count"))`. But I think > >>>> providing > >>>>>>>>>>>>>> a materialized variant for suppress method is better > >>>>>>>>>>>>>> than this workaround. > >>>>>>>>>>>>>> > >>>>>>>>>>>>>> Thanks, Dongjin > >>>>>>>>>>>>>> > >>>>>>>>>>>>>> On Thu, Feb 20, 2020 at 1:26 AM John Roesler > >>>>>>>>>>>>>> <vvcep...@apache.org> > >>>>>>>>>>>>> wrote: > >>>>>>>>>>>>>>> Thanks for the response, Dongjin, > >>>>>>>>>>>>>>> > >>>>>>>>>>>>>>> I'm sorry, but I'm still not following. It seems > >>>> like > >>>>>>>>>>>>>>> the view you > >>>>>>>>>>>>> would > >>>>>>>>>>>>>>> get on the "current state of the buffer" would > >>>> always > >>>>>>>>>>>>>>> be equivalent to the view of the upstream table. > >>>>>>>>>>>>>>> > >>>>>>>>>>>>>>> Let me try an example, and maybe you can point out > >>>>>>>>>>>>>>> the flaw in my reasoning. > >>>>>>>>>>>>>>> > >>>>>>>>>>>>>>> Let's say we're doing 10 ms windows with a grace > >>>>>>>>>>>>>>> period of zero. Let's also say we're computing a > >>>>>>>>>>>>>>> windowed count, and that we have a "final results" > >>>>>>>>>>>>>>> suppression after the count. Let's materialize the > >>>>>>>>>>>>>>> count as "Count" and the suppressed result as "Final > >>>>>>>>>>>>>>> Count". > >>>>>>>>>>>>>>> > >>>>>>>>>>>>>>> Suppose we get an input event: (time=10, key=A, > >>>>>>>>>>>>>>> value=...) > >>>>>>>>>>>>>>> > >>>>>>>>>>>>>>> Then, Count will look like: > >>>>>>>>>>>>>>> > >>>>>>>>>>>>>>>> window | key | value | | 10 | A | 1 | > >>>>>>>>>>>>>>> > >>>>>>>>>>>>>>> The (internal) suppression buffer will contain: > >>>>>>>>>>>>>>> > >>>>>>>>>>>>>>>> window | key | value | | 10 | A | 1 | > >>>>>>>>>>>>>>> > >>>>>>>>>>>>>>> The record is still buffered because the window > >>>>>>>>>>>>>>> isn't closed yet. Final Count is an empty table: > >>>>>>>>>>>>>>> > >>>>>>>>>>>>>>>> window | key | value | > >>>>>>>>>>>>>>> > >>>>>>>>>>>>>>> --------------- > >>>>>>>>>>>>>>> > >>>>>>>>>>>>>>> Now, we get a second event: (time=15, key=A, > >>>>>>>>>>>>>>> value=...) > >>>>>>>>>>>>>>> > >>>>>>>>>>>>>>> Then, Count will look like: > >>>>>>>>>>>>>>> > >>>>>>>>>>>>>>>> window | key | value | | 10 | A | 2 | > >>>>>>>>>>>>>>> > >>>>>>>>>>>>>>> The (internal) suppression buffer will contain: > >>>>>>>>>>>>>>> > >>>>>>>>>>>>>>>> window | key | value | | 10 | A | 2 | > >>>>>>>>>>>>>>> > >>>>>>>>>>>>>>> The record is still buffered because the window > >>>>>>>>>>>>>>> isn't closed yet. Final Count is an empty table: > >>>>>>>>>>>>>>> > >>>>>>>>>>>>>>>> window | key | value | > >>>>>>>>>>>>>>> > >>>>>>>>>>>>>>> --------------- > >>>>>>>>>>>>>>> > >>>>>>>>>>>>>>> Finally, we get a third event: (time=20, key=A, > >>>>>>>>>>>>>>> value=...) > >>>>>>>>>>>>>>> > >>>>>>>>>>>>>>> Then, Count will look like: > >>>>>>>>>>>>>>> > >>>>>>>>>>>>>>>> window | key | value | | 10 | A | 2 | | > >>>>>>>>>>>>>>> 20 | A | 1 | > >>>>>>>>>>>>>>> > >>>>>>>>>>>>>>> The (internal) suppression buffer will contain: > >>>>>>>>>>>>>>> > >>>>>>>>>>>>>>>> window | key | value | | 20 | A | 1 | > >>>>>>>>>>>>>>> > >>>>>>>>>>>>>>> Note that window 10 has been flushed out, because > >>>>>>>>>>>>>>> it's now closed. And window 20 is buffered because > >>>> it > >>>>>>>>>>>>>>> isn't closed yet. Final Count is now: > >>>>>>>>>>>>>>> > >>>>>>>>>>>>>>>> window | key | value | | 10 | A | 2 | > >>>>>>>>>>>>>>> > >>>>>>>>>>>>>>> --------------- > >>>>>>>>>>>>>>> > >>>>>>>>>>>>>>> Reading your email, I can't figure out what value > >>>>>>>>>>>>>>> there is in querying > >>>>>>>>>>>>> the > >>>>>>>>>>>>>>> internal suppression buffer, since it only contains > >>>>>>>>>>>>>>> exactly the same > >>>>>>>>>>>>> value > >>>>>>>>>>>>>>> as the upstream table, for each key that is still > >>>>>>>>>>>>>>> buffered. But it feels > >>>>>>>>>>>>> like > >>>>>>>>>>>>>>> you're saying you're trying to do something > >>>> different > >>>>>>>>>>>>>>> than just query > >>>>>>>>>>>>> the > >>>>>>>>>>>>>>> windowed key and get back the current count? > >>>>>>>>>>>>>>> > >>>>>>>>>>>>>>> Thanks, -John > >>>>>>>>>>>>>>> > >>>>>>>>>>>>>>> > >>>>>>>>>>>>>>> On Wed, Feb 19, 2020, at 09:49, Dongjin Lee wrote: > >>>>>>>>>>>>>>>> Hi John, > >>>>>>>>>>>>>>>> > >>>>>>>>>>>>>>>> 'The intermediate state of the suppression' in KIP > >>>>>>>>>>>>>>>> does not mean the > >>>>>>>>>>>>>>> state > >>>>>>>>>>>>>>>> of upstream KTable - sure, the state of the > >>>>>>>>>>>>>>>> upstream KTable can be > >>>>>>>>>>>>>>> queried > >>>>>>>>>>>>>>>> by materializing the operator immediately before > >>>>>>>>>>>>>>>> the suppress as you > >>>>>>>>>>>>>>> shown. > >>>>>>>>>>>>>>>> What I meant in KIP was the final state of the > >>>>>>>>>>>>>>>> buffer, which is not > >>>>>>>>>>>>>>> emitted > >>>>>>>>>>>>>>>> yet. (I agree, the current description may be > >>>>>>>>>>>>>>>> confusing; it would be > >>>>>>>>>>>>>>> better > >>>>>>>>>>>>>>>> to change it with 'the current state of the > >>>>>>>>>>>>>>>> suppression' or 'the > >>>>>>>>>>>>> results > >>>>>>>>>>>>>>> of > >>>>>>>>>>>>>>>> the suppression', like the Jira issue > >>>>>>>>>>>>>>>> <https://issues.apache.org/jira/browse/KAFKA-8403 > >>>>> > >>>>>>>>>>>>>>>> states.) > >>>>>>>>>>>>>>>> > >>>>>>>>>>>>>>>> For a little bit more about the motivation, here > >>>> is > >>>>>>>>>>>>>>>> one of my > >>>>>>>>>>>>>>> experience: I > >>>>>>>>>>>>>>>> had to build a monitoring application which > >>>>>>>>>>>>>>>> collects signals from IoT devices (say, a > >>>>>>>>>>>>>>>> semiconductor production line.) If the number of > >>>>>>>>>>>>>>> collected > >>>>>>>>>>>>>>>> signals within the time window is much less than > >>>>>>>>>>>>>>>> the expected, there > >>>>>>>>>>>>> may > >>>>>>>>>>>>>>> be > >>>>>>>>>>>>>>>> some problems like network hiccup in the systems. > >>>>>>>>>>>>>>>> We wanted to build > >>>>>>>>>>>>> the > >>>>>>>>>>>>>>>> system in the form of a dashboard, but could not > >>>> by > >>>>>>>>>>>>>>>> lack of > >>>>>>>>>>>>> materializing > >>>>>>>>>>>>>>>> feature. It was precisely the case of querying > >>>> only > >>>>>>>>>>>>>>>> the final > >>>>>>>>>>>>> results of > >>>>>>>>>>>>>>> a > >>>>>>>>>>>>>>>> windowed aggregation, as the Jira issue > >>>>>>>>>>>>>>>> <https://issues.apache.org/jira/browse/KAFKA-8403 > >>>>> > >>>>>>>>>>>>>>>> states. We > >>>>>>>>>>>>> finally > >>>>>>>>>>>>>>> ended > >>>>>>>>>>>>>>>> in implementing the system in an email alerting > >>>>>>>>>>>>>>>> system like this < > >>>>>>>>>>>>> > >>>> https://www.confluent.io/blog/kafka-streams-take-on-watermarks-an > > d-t > > riggers/ > >>>>>>>>>>>>>>>> > >>>>>>>> and had to collect the keys and windows of trouble by hand. > >>>>>>>>>>>>>>>> I think these kinds of use cases would be much > >>>>>>>>>>>>>>>> common. Should it be described in the KIP much > >>>> more > >>>>>>>>>>>>>>>> in detail? > >>>>>>>>>>>>>>>> > >>>>>>>>>>>>>>>> Thanks, Dongjin > >>>>>>>>>>>>>>>> > >>>>>>>>>>>>>>>> On Sat, Feb 15, 2020 at 4:43 AM John Roesler > >>>>>>>>>>>>>>>> <vvcep...@apache.org> > >>>>>>>>>>>>>>> wrote: > >>>>>>>>>>>>>>>>> Hi Dongjin, > >>>>>>>>>>>>>>>>> > >>>>>>>>>>>>>>>>> Thanks for the KIP! > >>>>>>>>>>>>>>>>> > >>>>>>>>>>>>>>>>> Can you explain more about why the internal data > >>>>>>>>>>>>>>>>> structures of > >>>>>>>>>>>>>>> suppression > >>>>>>>>>>>>>>>>> should be queriable? The motivation just says > >>>>>>>>>>>>>>>>> that users might > >>>>>>>>>>>>> want to > >>>>>>>>>>>>>>> do > >>>>>>>>>>>>>>>>> it, which seems like it could justify literally > >>>>>>>>>>>>>>>>> anything :) > >>>>>>>>>>>>>>>>> > >>>>>>>>>>>>>>>>> One design point of Suppression is that if you > >>>>>>>>>>>>>>>>> wanted to query the > >>>>>>>>>>>>>>> “final > >>>>>>>>>>>>>>>>> state”, you can Materialize the suppress itself > >>>>>>>>>>>>>>>>> (which is why it > >>>>>>>>>>>>> needs > >>>>>>>>>>>>>>> the > >>>>>>>>>>>>>>>>> variant); if you wanted to query the > >>>>>>>>>>>>>>>>> “intermediate state”, you can materialize the > >>>>>>>>>>>>>>>>> operator immediately before the suppress. > >>>>>>>>>>>>>>>>> > >>>>>>>>>>>>>>>>> Example: > >>>>>>>>>>>>>>>>> > >>>>>>>>>>>>>>>>> ...count(Materialized.as(“intermediate”)) > >>>>>>>>>>>>>>>>> .supress(untilWindowClosed(), > >>>>>>>>>>>>>>>>> Materialized.as(“final”)) > >>>>>>>>>>>>>>>>> > >>>>>>>>>>>>>>>>> I’m not sure what use case would require > >>>>>>>>>>>>>>>>> actually fetching from the internal buffers. > >>>>>>>>>>>>>>>>> > >>>>>>>>>>>>>>>>> Thanks, John > >>>>>>>>>>>>>>>>> > >>>>>>>>>>>>>>>>> > >>>>>>>>>>>>>>>>> On Fri, Feb 14, 2020, at 07:55, Dongjin Lee > >>>>>>>>>>>>>>>>> wrote: > >>>>>>>>>>>>>>>>>> Hi devs, > >>>>>>>>>>>>>>>>>> > >>>>>>>>>>>>>>>>>> I'd like to reboot the discussion on KIP-508, > >>>>>>>>>>>>>>>>>> which aims to > >>>>>>>>>>>>> support a > >>>>>>>>>>>>>>>>>> Materialized variant of KTable#suppress. It > >>>>>>>>>>>>>>>>>> was initially > >>>>>>>>>>>>> submitted > >>>>>>>>>>>>>>>>> several > >>>>>>>>>>>>>>>>>> months ago but closed by the inactivity. > >>>>>>>>>>>>>>>>>> > >>>>>>>>>>>>>>>>>> - KIP: > >>>>>>>>>>>>>>>>>> > >>>>>>>>>>>>> > >>>> https://cwiki.apache.org/confluence/display/KAFKA/KIP-508%3A+Make > > +Su > > ppression+State+Queriable > >>>>>>>> - Jira: https://issues.apache.org/jira/browse/KAFKA-8403 > >>>>>>>>>>>>>>>>>> All kinds of feedback will be greatly > >>>>>>>>>>>>>>>>>> appreciated. > >>>>>>>>>>>>>>>>>> > >>>>>>>>>>>>>>>>>> Best, Dongjin > >>>>>>>>>>>>>>>>>> > >>>>>>>>>>>>>>>>>> -- *Dongjin Lee* > >>>>>>>>>>>>>>>>>> > >>>>>>>>>>>>>>>>>> *A hitchhiker in the mathematical world.* > >>>>>>>>>>>>>>>>>> *github: > >>>>>>>>>>>>>>>>>> <http://goog_969573159/> > >>>> github.com/dongjinleekr > >>>>>>>>>>>>>>>>>> > >>>>>>>>>>>>>>>>>> > > <https://github.com/dongjinleekr>linkedin: > >>>>>>>>>>>>>>>>> kr.linkedin.com/in/dongjinleekr > >>>>>>>>>>>>>>>>>> <https://kr.linkedin.com/in/dongjinleekr > >>>>> speakerdeck: > > speakerdeck.com/dongjin > >>>>>>>>>>>>>>>>>> <https://speakerdeck.com/dongjin>* > >>>>>>>>>>>>>>>>>> > >>>>>>>>>>>>>>>> > >>>>>>>>>>>>>>>> -- *Dongjin Lee* > >>>>>>>>>>>>>>>> > >>>>>>>>>>>>>>>> *A hitchhiker in the mathematical world.* *github: > >>>>>>>>>>>>>>>> <http://goog_969573159/>github.com/dongjinleekr > >>>>>>>>>>>>>>>> <https://github.com/dongjinleekr>linkedin: > >>>>>>>>>>>>>>> kr.linkedin.com/in/dongjinleekr > >>>>>>>>>>>>>>>> <https://kr.linkedin.com/in/dongjinleekr > >>>>> speakerdeck: > > speakerdeck.com/dongjin > >>>>>>>>>>>>>>>> <https://speakerdeck.com/dongjin>* > >>>>>>>>>>>>>>>> > >>>>>>>>>>>>>> > >>>>>>>>>>>>>> -- *Dongjin Lee* > >>>>>>>>>>>>>> > >>>>>>>>>>>>>> *A hitchhiker in the mathematical world.* *github: > >>>>>>>>>>>>>> <http://goog_969573159/>github.com/dongjinleekr > >>>>>>>>>>>>>> <https://github.com/dongjinleekr>linkedin: > >>>>>>>>>>>>> kr.linkedin.com/in/dongjinleekr > >>>>>>>>>>>>>> <https://kr.linkedin.com/in/dongjinleekr>speakerdeck: > >>>>>>>>>>>>> speakerdeck.com/dongjin > >>>>>>>>>>>>>> <https://speakerdeck.com/dongjin>* > >>>>>>>>>>>>>> > >>>>>>>>>>>> -- *Dongjin Lee* > >>>>>>>>>>>> > >>>>>>>>>>>> *A hitchhiker in the mathematical world.* *github: > >>>>>>>>>>>> <http://goog_969573159/>github.com/dongjinleekr > >>>>>>>>>>>> <https://github.com/dongjinleekr>linkedin: > >>>>>>>>>>>> kr.linkedin.com/in/dongjinleekr > >>>>>>>>>>>> <https://kr.linkedin.com/in/dongjinleekr>speakerdeck: > >>>>>>>>>>>> speakerdeck.com/dongjin <https://speakerdeck.com/dongjin > >>>>> * > >>>>>>>>>>>> > >>>>>> > >>>> > >>>> > >>> > >>> > >> > >> -- > >> *Dongjin Lee* > >> > >> *A hitchhiker in the mathematical world.* > >> > >> > >> > >> > >> *github: <http://goog_969573159/>github.com/dongjinleekr > >> <https://github.com/dongjinleekr>keybase: > https://keybase.io/dongjinleekr > >> <https://keybase.io/dongjinleekr>linkedin: > kr.linkedin.com/in/dongjinleekr > >> <https://kr.linkedin.com/in/dongjinleekr>speakerdeck: > speakerdeck.com/dongjin > >> <https://speakerdeck.com/dongjin>* > >> > > > > > > -- *Dongjin Lee* *A hitchhiker in the mathematical world.* *github: <http://goog_969573159/>github.com/dongjinleekr <https://github.com/dongjinleekr>keybase: https://keybase.io/dongjinleekr <https://keybase.io/dongjinleekr>linkedin: kr.linkedin.com/in/dongjinleekr <https://kr.linkedin.com/in/dongjinleekr>speakerdeck: speakerdeck.com/dongjin <https://speakerdeck.com/dongjin>*