死信主題分割區選擇

預設情況下,記錄會使用與原始記錄相同的分割區發布到死信主題。這表示死信主題必須至少具有與原始記錄一樣多的分割區。

若要變更此行為,請將 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 時,它會優先採用該 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 名稱,則應用程式有責任確保事先建立這些主題。