死信主題分割槽選擇

預設情況下,記錄被髮布到死信主題時使用與原始記錄相同的分割槽。這意味著死信主題必須至少擁有與原始記錄相同數量的分割槽。

要改變這種行為,可以將一個 DlqPartitionFunction 實現作為 @Bean 新增到應用上下文中。應用中只能存在一個這樣的 Bean。該函式會接收消費者組、失敗的 ConsumerRecord 和異常作為引數。例如,如果您總是想路由到分割槽 0,可以使用

@Bean
public DlqPartitionFunction partitionFunction() {
    return (group, record, ex) -> 0;
}
如果您將消費者繫結的 dlqPartitions 屬性設定為 1(並且 binder 的 minPartitionCount 等於 1),則無需提供 DlqPartitionFunction;框架將始終使用分割槽 0。如果您將消費者繫結的 dlqPartitions 屬性設定為大於 1 的值(或 binder 的 minPartitionCount 大於 1),則**必須**提供一個 DlqPartitionFunction bean,即使分割槽數量與原始主題的分割槽數量相同。

也可以為 DLQ 主題定義自定義名稱。為此,可以在應用上下文中建立一個 DlqDestinationResolver 實現作為 @Bean。當 binder 檢測到這樣的 bean 時,它將優先使用,否則將使用 dlqName 屬性。如果兩者都未找到,則預設使用 error.<destination>.<group>。以下是 DlqDestinationResolver 作為 @Bean 的示例。

@Bean
public DlqDestinationResolver dlqDestinationResolver() {
    return (rec, ex) -> {
        if (rec.topic().equals("word1")) {
            return "topic1-dlq";
        }
        else {
            return "topic2-dlq";
        }
    };
}

在提供 DlqDestinationResolver 實現時需要記住一件重要的事情,那就是 binder 中的 provisioner 不會自動為應用建立主題。這是因為 binder 無法推斷出該實現可能傳送到的所有 DLQ 主題的名稱。因此,如果您使用這種策略提供 DLQ 名稱,則應用有責任確保這些主題事先被建立。