[ 
https://issues.apache.org/jira/browse/KAFKA-14546?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=17774202#comment-17774202
 ] 

James Olsen edited comment on KAFKA-14546 at 10/11/23 7:11 PM:
---------------------------------------------------------------

I'm still hoping for a solution to this issue.  I can understand the reluctance 
to allow a {{Partitioner}} to return {{RecordMetadata.UNKNOWN_PARTITION}} 
however there is another solution that would work.  As my requirement discussed 
above is to ensure consistent partitioning for each Topic using a single 
{{{}Partitioner{}}}, it would be suitable to have the {{Partitioner}} indicate 
to the {{KafkaProducer}} if it handles the Topic.  This could be implemented as 
follows:

 
{code:java}
public interface Partitioner ... {
...
    default boolean partitionsTopic(String topic) {
        return true;
    }
...
}
{code}
 

{{KafkaProducer}} would call this method first and fallback to default 
partitioning if it returns {{{}false{}}}.  This would be backwards compatible 
with existing code and have minimal overhead.


was (Author: jim_b_o):
I'm still hoping for a solution to this issue.  I can understand the reluctance 
to allow a `Partitioner` to return `RecordMetadata.UNKNOWN_PARTITION` however 
there is another solution that would work.  As my requirement discussed above 
is to ensure consistent partitioning for each Topic using a single Partitioner, 
it would be suitable to have the `Partitioner` indicate to the `KafkaProducer` 
if it handles the Topic.  This could be implemented as follows:

 
{code:java}
public interface Partitioner ... {
...
    default boolean partitionsTopic(String topic) {
        return true;
    }
...
}
{code}
 

`KafkaProducer` would call this method first and fallback to default 
partitioning if it returns `false`.  This would be backwards compatible with 
existing code and have minimal overhead.

> Allow Partitioner to return -1 to indicate default partitioning
> ---------------------------------------------------------------
>
>                 Key: KAFKA-14546
>                 URL: https://issues.apache.org/jira/browse/KAFKA-14546
>             Project: Kafka
>          Issue Type: Improvement
>          Components: producer 
>    Affects Versions: 3.3.1
>            Reporter: James Olsen
>            Priority: Major
>
> Prior to KIP-794 it was possible to create a custom Partitioner that could 
> delegate to the DefaultPartitioner.  DefaultPartitioner has been deprecated 
> so we can now only delegate to BuiltInPartitioner.partitionForKey which does 
> not handle a non-keyed message.  Hence there is now no mechanism for a custom 
> Partitioner to fallback to default partitioning, e.g. for the non-keyed 
> sticky case.
> I would like to propose that KafkaProducer.partition(...) not throw 
> IllegalArgumentException if the Partitioner returns 
> RecordMetadata.UNKNOWN_PARTITION and instead continue with the default 
> behaviour.  Maybe with a configuration flag to enable this behaviour so as 
> not to break existing expectations?
> Why was Partitioner delegation with default fallback useful?
>  # A single Producer can be used to write to multiple Topics where each Topic 
> may have different partitioning requirements.  The Producer can only have a 
> single Partitioner so the Partitioner needs to be able to switch behaviour 
> based on the Topic, including the need to fallback to default behaviour if a 
> given Topic does not have a custom requirement.
>  # Multiple services may need to produce to the same Topic and these services 
> may be authored by different teams.  A single custom Partitioner that 
> encapsulates all Topic specific partitioning logic can be used by all teams 
> at all times for all Topics ensuring that mistakes are not made.



--
This message was sent by Atlassian Jira
(v8.20.10#820010)

Reply via email to