Yeah I think that sums it up well. Either you computed a *possible* assignment,
or you returned something that makes it literally impossible for the
StreamsPartitionAssignor to decipher/translate into an actual group
assignment, in which case it should just fail

That's more or less it for the open questions that have been raised so far,
so I just want to remind folks that there's already a voting thread for
this. I cast my vote a few minutes ago so it should resurface in everyone's
inbox :)

On Thu, Apr 25, 2024 at 11:42 PM Rohan Desai <desai.p.ro...@gmail.com>
wrote:

> 117: as Sophie laid out, there are two cases here right:
> 1. cases that are considered invalid by the existing assignors but are
> still valid assignments in the sense that they can be used to generate a
> valid consumer group assignment (from the perspective of the consumer group
> protocol). An assignment that excludes a task is one such example, and
> Sophie pointed out a good use case for it. I also think it makes sense to
> allow these. It's hard to predict how a user might want to use the custom
> assignor, and its reasonable to expect them to use it with care and not
> hand-hold them.
> 2. cases that are not valid because it is impossible to compute a valid
> consumer group assignment from them. In this case it seems totally
> reasonable to just throw a fatal exception that gets passed to the uncaught
> exception handler. If this case happens then there is some bug in the
> user's assignor and its totally reasonable to fail the application in that
> case. We _could_ try to be more graceful and default to one of the existing
> assignors. But it's usually better to fail hard and fast when there is some
> illegal state detected imo.
>
> On Fri, Apr 19, 2024 at 4:18 PM Rohan Desai <desai.p.ro...@gmail.com>
> wrote:
>
> > Bruno, I've incorporated your feedback into the KIP document.
> >
> > On Fri, Apr 19, 2024 at 3:55 PM Rohan Desai <desai.p.ro...@gmail.com>
> > wrote:
> >
> >> Thanks for the feedback Bruno! For the most part I think it makes sense,
> >> but leaving a couple follow-up thoughts/questions:
> >>
> >> re 4: I think Sophie's point was slightly different - that we might want
> >> to wrap the return type for `assign` in a class so that its easily
> >> extensible. This makes sense to me. Whether we do that or not, we can
> have
> >> the return type be a Set instead of a Map as well.
> >>
> >> re 6: Yes, it's a callback that's called with the final assignment. I
> >> like your suggested name.
> >>
> >> On Fri, Apr 5, 2024 at 12:17 PM Rohan Desai <desai.p.ro...@gmail.com>
> >> wrote:
> >>
> >>> Thanks for the feedback Sophie!
> >>>
> >>> re1: Totally agree. The fact that it's related to the partition
> assignor
> >>> is clear from just `task.assignor`. I'll update.
> >>> re3: This is a good point, and something I would find useful
> personally.
> >>> I think its worth adding an interface that lets the plugin observe the
> >>> final assignment. I'll add that.
> >>> re4: I like the new `NodeAssignment` type. I'll update the KIP with
> that.
> >>>
> >>> On Thu, Nov 9, 2023 at 11:18 PM Rohan Desai <desai.p.ro...@gmail.com>
> >>> wrote:
> >>>
> >>>> Thanks for the feedback so far! I think pretty much all of it is
> >>>> reasonable. I'll reply to it inline:
> >>>>
> >>>> > 1. All the API logic is granular at the Task level, except the
> >>>> previousOwnerForPartition func. I’m not clear what’s the motivation
> >>>> behind it, does our controller also want to change how the
> >>>> partitions->tasks mapping is formed?
> >>>> You're right that this is out of place. I've removed this method as
> >>>> it's not needed by the task assignor.
> >>>>
> >>>> > 2. Just on the API layering itself: it feels a bit weird to have the
> >>>> three built-in functions (defaultStandbyTaskAssignment etc) sitting in
> >>>> the ApplicationMetadata class. If we consider them as some default
> util
> >>>> functions, how about introducing moving those into their own static
> util
> >>>> methods to separate from the ApplicationMetadata “fact objects” ?
> >>>> Agreed. Updated in the latest revision of the kip. These have been
> >>>> moved to TaskAssignorUtils
> >>>>
> >>>> > 3. I personally prefer `NodeAssignment` to be a read-only object
> >>>> containing the decisions made by the assignor, including the
> >>>> requestFollowupRebalance flag. For manipulating the half-baked results
> >>>> inside the assignor itself, maybe we can just be flexible to let
> users use
> >>>> whatever struts / their own classes even, if they like. WDYT?
> >>>> Agreed. Updated in the latest version of the kip.
> >>>>
> >>>> > 1. For the API, thoughts on changing the method signature to return
> a
> >>>> (non-Optional) TaskAssignor? Then we can either have the default
> >>>> implementation return new HighAvailabilityTaskAssignor or just have a
> >>>> default implementation class that people can extend if they don't
> want to
> >>>> implement every method.
> >>>> Based on some other discussion, I actually decided to get rid of the
> >>>> plugin interface, and instead use config to specify individual plugin
> >>>> behaviour. So the method you're referring to is no longer part of the
> >>>> proposal.
> >>>>
> >>>> > 3. Speaking of ApplicationMetadata, the javadoc says it's read only
> >>>> but
> >>>> theres methods that return void on it? It's not totally clear to me
> how
> >>>> that interface is supposed to be used by the assignor. It'd be nice
> if we
> >>>> could flip that interface such that it becomes part of the output
> instead
> >>>> of an input to the plugin.
> >>>> I've moved those methods to a util class. They're really utility
> >>>> methods the assignor might want to call to do some default or
> optimized
> >>>> assignment for some cases like rack-awareness.
> >>>>
> >>>> > 4. We should consider wrapping UUID in a ProcessID class so that we
> >>>> control
> >>>> the interface (there are a few places where UUID is directly used).
> >>>> I like it. Updated the proposal.
> >>>>
> >>>> > 5. What does NodeState#newAssignmentForNode() do? I thought the
> >>>> point was
> >>>> for the plugin to make the assignment? Is that the result of the
> >>>> default logic?
> >>>> It doesn't need to be part of the interface. I've removed it.
> >>>>
> >>>> > re 2/6:
> >>>>
> >>>> I generally agree with these points, but I'd rather hash that out in a
> >>>> PR than in the KIP review, as it'll be clearer what gets used how. It
> seems
> >>>> to me (committers please correct me if I'm wrong) that as long as
> we're on
> >>>> the same page about what information the interfaces are returning,
> that's
> >>>> ok at this level of discussion.
> >>>>
> >>>> On Tue, Nov 7, 2023 at 12:03 PM Rohan Desai <desai.p.ro...@gmail.com>
> >>>> wrote:
> >>>>
> >>>>> Hello All,
> >>>>>
> >>>>> I'd like to start a discussion on KIP-924 (
> >>>>>
> https://cwiki.apache.org/confluence/display/KAFKA/KIP-924%3A+customizable+task+assignment+for+Streams
> )
> >>>>> which proposes an interface to allow users to plug into the streams
> >>>>> partition assignor. The motivation section in the KIP goes into some
> more
> >>>>> detail on why we think this is a useful addition. Thanks in advance
> for
> >>>>> your feedback!
> >>>>>
> >>>>> Best Regards,
> >>>>>
> >>>>> Rohan
> >>>>>
> >>>>>
>

Reply via email to