死信主題分割槽選擇

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

要改變此行為,請在應用程式上下文中新增一個 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 時,它將優先使用,否則將使用 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 的實現時,需要記住一件重要的事情,那就是繫結器中的 provisioner 不會自動為應用程式建立主題。這是因為繫結器無法推斷出實現可能傳送到的所有 DLQ 主題的名稱。因此,如果您使用此策略提供 DLQ 名稱,應用程式有責任確保這些主題事先已建立。

© . This site is unofficial and not affiliated with VMware.