Hi Alieh, Thanks for the KIP. I *really* don’t like adding a config which changes the behaviour of the flush() method. We already have too many configs. But I totally understand the problem that you’re trying to solve and some of the other suggestions in this thread seem neater.
Personally, I would add another method to KafkaProducer. Not an overload on flush() because this is not flush() at all. Using Matthias’s options, I prefer (3). Thanks, Andrew > On 20 Jun 2024, at 15:08, Lianet M. <liane...@gmail.com> wrote: > > Hi all, thanks for the KIP Alieh! > > LM1. Totally agree with Artem's point about the config not being the most > explicit/flexible way to express this capability. Getting then to Matthias > 4 options, what I don't like about 3 and 4 is that it seems they might not > age very well? Aren't we going to be wanting some other twist to the flush > semantics that will have us adding yet another param to it, or another > overloaded method? I truly don't have the context to answer that, but if it > feels like a realistic future maybe adding some kind FlushOptions params to > the flush would be better from an extensibility point of view. It would > only have the clearErrors option available for now but could accept any > other we may need. I find that this would remove the "ugliness" Matthias > pointed out for 3. and 4. > > LM2. No matter how we end up expressing the different semantics for flush, > let's make sure we update the KIP on the flush and commitTransaction java > docs. It currently states that flush "clears the last exception" and > commitTransaction "will NOT throw" if called after flush, but it really all > depends on the config/options/method used. > > LM3. I find it would be helpful to include an example to show the new flow > that we're unblocking (I see this as the great gain here): flush with clear > error option enabled -> catch and do whatever error handling we want -> > commitTransaction successfully > > Thanks! > > Lianet > > On Wed, Jun 19, 2024 at 11:26 PM Chris Egerton <fearthecel...@gmail.com> > wrote: > >> Hi Matthias, >> >> I like the alternatives you've listed. One more that might help is if, >> instead of overloading flush(), we overloaded commitTransaction() to >> something like commitTransaction(boolean tolerateRecordErrors). This seems >> slightly cleaner in that it takes the behavioral change we want, which only >> applies to transactional producers, to an API method that is only used for >> transactional producers. It would also avoid the issue of whether or not >> flush() (or a new variant of it with altered semantics) should throw or >> not. Thoughts? >> >> Hi Alieh, >> >> Thanks for the KIP, I like this direction a lot more than the pluggable >> handler! >> >> I share Artem's concerns that enabling this behavior via configuration >> doesn't seem like a great fit. It's likely that application code will be >> written in a style that only works with one type of behavior from >> transactional producers, so requiring that application code to declare its >> expectations for the behavior of its producer seems more appropriate than, >> e.g., allowing users deploying that application to tweak a configuration >> file that gets fed to producers spun up inside it. >> >> Cheers, >> >> Chris >> >> On Wed, Jun 19, 2024 at 10:32 PM Matthias J. Sax <mj...@apache.org> wrote: >> >>> Thanks for the KIP Alieh. I actually like the KIP as-is, but think >>> Arthem raises very good points... >>> >>> Seems we have four options on how to move forward? >>> >>> 1. add config to allow "silent error clearance" as the KIP proposes >>> 2. change flush() to clear error and let it throw >>> 3. add new flushAndThrow()` (or better name) which clears error and >>> throws >>> 4. add `flush(boolean clearAndThrow)` and let user pick (and deprecate >>> existing `flush()`) >>> >>> For (2), given that it would be a behavior change, we might also need a >>> public "feature flag" config. >>> >>> It seems, both (1) and (2) have the issue Artem mentioned. (3) and (4) >>> would be safer to this end, however, for both we kinda get an ugly API? >>> >>> Not sure right now if I have any preference. Seems we need to pick some >>> evil and that there is no clear best solution? Would be good to her from >>> others what they think >>> >>> >>> -Matthias >>> >>> >>> On 6/18/24 8:39 PM, Artem Livshits wrote: >>>> Hi Alieh, >>>> >>>> Thank you for the KIP. I have a couple of suggestions: >>>> >>>> AL1. We should throw an error from flush after we clear it. This >> would >>>> make it so that both "send + commit" and "send + flush + commit" (the >>>> latter looks like just a more verbose way to express the former, and it >>>> would be intuitive if it behaves the same) would throw if the >> transaction >>>> has an error (so if the code is written either way it's going be >>> correct). >>>> At the same time, the latter could be extended by the caller to >> intercept >>>> exceptions from flush, ignore as needed, and commit the transaction. >>> This >>>> solution would keep basic things simple (if someone has code that >> doesn't >>>> require advanced error handling, then basic "send + flush + commit" >> would >>>> do the right thing) and advanced things possible, an application can >> add >>>> try + catch around flush and ignore some errors. >>>> >>>> AL2. I'm not sure if config is the best way to express the >> modification >>> of >>>> the "flush" semantics -- the application logic that calls "flush" needs >>> to >>>> match the "flush" semantics and configuring semantics in a detached >> place >>>> creates a room for bugs due to discrepancies. This can be especially >> bad >>>> if the producer loads configuration from a file at run time, in that >>> case a >>>> mistake in configuration could break the application because it was >>> written >>>> to expect one "flush" semantics but the semantics is switched. Given >>> that >>>> the "flush" semantics needs to match the caller's expectation, a way to >>>> accomplish that would be to pass the caller's expectation to the >> "flush" >>>> call by either have a method with a different name or have an overload >>> with >>>> a Boolen flag that would configure the semantics (the current method >>> could >>>> just redirect to the new one). >>>> >>>> -Artem >>>> >>>> On Mon, Jun 17, 2024 at 9:09 AM Alieh Saeedi >>> <asae...@confluent.io.invalid> >>>> wrote: >>>> >>>>> Hi all, >>>>> >>>>> I'd like to kick off a discussion for KIP-1059 that suggests adding a >>> new >>>>> feature to the Producer flush() method. >>>>> >>>>> >>>>> >>> >> https://cwiki.apache.org/confluence/display/KAFKA/KIP-1059%3A+Enable+the+Producer+flush%28%29+method+to+clear+the+latest+send%28%29+error >>>>> >>>>> Cheers, >>>>> Alieh >>>>> >>>> >>> >>