首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >春天卡夫卡。即使autoCreateTopics属性为false,也会创建非阻塞重试主题。

春天卡夫卡。即使autoCreateTopics属性为false,也会创建非阻塞重试主题。
EN

Stack Overflow用户
提问于 2021-12-08 10:08:10
回答 2查看 478关注 0票数 0

我正试图使用Spring-Kafka2.8.0和非阻塞重试功能为我的项目实现非阻塞重试。

我做了以下工作。autoCreateTopics属性是假的!

代码语言:javascript
运行
复制
    @KafkaListener(
            id = "customListenerId",
            idIsGroup = false,
            topics = "main-topic-1, main-topic-2")
    @RetryableTopic(
            autoCreateTopics = "false",
            fixedDelayTopicStrategy = FixedDelayStrategy.SINGLE_TOPIC,
            backoff = @Backoff(delay = 10000),
            attempts = "6",
            kafkaTemplate = "kafkaTemplate",
            include = {
                    AerospikeException.Timeout.class,
                    QueryTimeoutException.class,
                    HystrixRuntimeException.class})
    public void consumePerTopic(@Header(KafkaHeaders.RECEIVED_TOPIC) String topic,
                                @Payload byte[] payload,
                                Acknowledgment acknowledgment) {
        processor.process(objectMapper.readValue(payload, CreateRequest.class));
        acknowledgment.acknowledge();
    }

我得到了下面的集成测试,它使用kafka作为嵌入式容器。测试模拟db连接问题-测试中的代码必须抛出在使用者中声明为可还原的AerospikeException.Timeout。

代码语言:javascript
运行
复制
@Test
    void shouldNotCreateEntityForTopicsWhenDbTimedOutAndProduceRetryMessages() {
        performWithDbLatency(Duration.ofMillis(1000), () -> {
            var createEntityIdempotencyKeys = entityKafkaSteps.sendCreateRequestToAllTopicsWithIdempotency(
                    getCreateEntityRequest("entity-owner-a"));

            retryEntityKafkaSteps.consumeRetryCreateRequestsByIdempotencyKeys(createEntityIdempotencyKeys);
        });
    }

我对嵌入式kafka容器的配置如下

代码语言:javascript
运行
复制
embedded:
  kafka:
    topicsToCreate: main-topic-1, main-topic-2

我理解卡夫卡的默认行为是允许自动主题的创建。这个测试正在成功地通过,但据我所知,autoCreateTopics属性应该阻止retry和dlt主题的创建,即使它在kafka ->中是允许的,并且测试必须失败,因为代理中没有retry和dlt主题。

请澄清这是一种预期的行为,还是我遗漏了什么?如果要通过RetryTopicConfiguration bean使用doNotAutoCreateRetryTopics()方法声明重试功能,则存在相同的行为。

非常感谢。

编辑的:我主要关心的是:

  1. 我禁止spring使用autoCreateTopics = "false"为我的用户创建retry和dlt主题。
  2. 我使用属性在嵌入式容器中创建主主题-1和主主题-2。(Kafka broker默认属性为allow.auto.create.topics = true)
  3. 在运行时,我可以看到主-主题-1-重试,主-主题-1-dlt,主-主题-2-重试和主-主题-2-DLT仍然被创建。

我正在使用playtika测试容器库

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2021-12-08 13:48:16

没有autoCreateTopics = "false"仅仅意味着框架将不会创建主题;它与代理是否被配置为创建它们无关。

@EmbeddedKafka(topics = ...)将始终创建主题。

若要禁用嵌入式kafka broker中的主题创建,请使用

@EmbeddedKafka(brokerProperties = "auto.create.topics.enable:false")

不要在那里指定任何topics

也可以将使用者属性allow.auto.create.topics设置为false;它覆盖代理属性(如果为真)。

allow.auto.create.topics

票数 0
EN

Stack Overflow用户

发布于 2021-12-08 20:44:34

@Gary非常感谢您的耐心--我终于理解了根本原因。主题不是由spring创建的,而是由连接到retry的使用者创建的,在我的测试-> broker中,dlt主题允许它这样做,->主题是自动创建的。

谢谢你的帮助!

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70273184

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档