跳到主要内容
版本:5.0.1

死信主题分区选择

DeepSeek V3 中英对照 Dead-Letter Topic Partition Selection

默认情况下,记录会使用与原记录相同的分区发布到死信主题。这意味着死信主题的分区数必须至少与原记录的分区数相同。

要改变此行为,请将 DlqPartitionFunction 实现作为 @Bean 添加到应用程序上下文中。此类 bean 只能存在一个。该函数会接收消费者组、失败的 ConsumerRecord 和异常作为参数。例如,如果始终希望路由到分区 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 时,它将优先使用该 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 名称,应用程序有责任确保这些主题已预先创建。