死信主题分区选择
默认情况下,记录会发布到死信主题(Dead-Letter topic),并使用与原始记录相同的分区。这意味着死信主题必须至少拥有与原始记录相同数量的分区。
要更改此行为,请将 DlqPartitionFunction
实现作为 @Bean
添加到应用程序上下文中。只能存在一个这样的 bean。该函数会接收到消费者组、失败的 ConsumerRecord
以及异常。例如,如果您总是希望路由到分区 0,可以使用以下代码:
@Bean
public DlqPartitionFunction partitionFunction() {
return (group, record, ex) -> 0;
}
@Bean
public DlqPartitionFunction partitionFunction() {
return (group, record, ex) -> 0;
}
如果你将消费者绑定的 dlqPartitions
属性设置为 1(并且绑定器的 minPartitionCount
等于 1
),则不需要提供 DlqPartitionFunction
;框架将始终使用分区 0。如果你将消费者绑定的 dlqPartitions
属性设置为大于 1
的值(或者绑定器的 minPartitionCount
大于 1
),你必须提供一个 DlqPartitionFunction
bean,即使分区计数与原始主题的相同。
也可以为 DLQ 主题定义一个自定义名称。为此,请将 DlqDestinationResolver
的实现作为 @Bean
创建到应用程序上下文中。当绑定器检测到这样的 bean 时,它将优先使用,否则它将使用 dlqName
属性。如果两者都未找到,它将默认使用 error.<destination>.<group>
。以下是一个作为 @Bean
的 DlqDestinationResolver
示例。
@Bean
public DlqDestinationResolver dlqDestinationResolver() {
return (rec, ex) -> {
if (rec.topic().equals("word1")) {
return "topic1-dlq";
}
else {
return "topic2-dlq";
}
};
}
在为 DlqDestinationResolver
提供实现时,需要记住的一个重要事项是,绑定器中的配置器不会为应用程序自动创建主题。这是因为绑定器无法推断实现可能发送到的所有 DLQ 主题的名称。因此,如果使用此策略提供 DLQ 名称,应用程序有责任确保这些主题事先已创建。