您如何配置 Spring Cloud Sleuth kafka zipkin 发件人以缩短保留期?

How do you configure Spring Cloud Sleuth kafka zipkin sender to reduce the retention period?

我正在尝试进行设置,以便在我部署新环境时,spring cloud sleuth zipkin 发件人使用的 zipkin Kafka 主题的保留期很短,因为它将得到处理通过其他方式,否则它将被忽略(在开发人员机器上)。

我试着添加这个

@Bean("zipkin")
public NewTopic zipkin() {

  return TopicBuilder.name("zipkin")
    .config(TopicConfig.RETENTION_MS_CONFIG, String.valueOf(Duration.ofMinutes(2).getSeconds() * 1000))
    .compact()
    .replicas(1)
    .build();
}

但这没有用,因为主题已经创建并配置好了。我知道我能做到

kafka-configs --bootstrap-server $_KAFKA_BOOTSTRAP_SERVER --alter --topic zipkin --add-config retention.ms=2000

但我希望它在 Spring 应用程序上设置。

您需要使用 AdminClient 实例来修改现有的主题配置

Spring-Kafka 不在应用程序上下文中提供 AdminClient 因此需要构建它而不是让它为您自动装配。以下代码显示了如何通过使用环境中提供的 bootstrap 服务器创建 AdminClient 并设置多个属性来实现。

    /**
     * Retention time for zipkin messages.  Defaults to 2 minutes.
     */
    @Value("${zipkin.retention.ms:120000}")
    private long zipkinRetentionMs;

    /**
     * Segment bytes size for zipkin.  Defaults to 10MB.
     */
    @Value("${zipkin.segment.bytes:10485760}")
    private long zipkinSegmentBytes;

    @Value("${spring.kafka.bootstrap-servers}")
    private String bootstrapServers;

    @PostConstruct
    public void fixZipkin() {

        try (final var adminClient = AdminClient.create(Map.of(AdminClientConfig.BOOTSTRAP_SERVERS_CONFIG, bootstrapServers))) {
            adminClient.incrementalAlterConfigs(
                Map.of(
                    new ConfigResource(ConfigResource.Type.TOPIC, "zipkin"),
                    List.of(
                        new AlterConfigOp(
                            new ConfigEntry(TopicConfig.RETENTION_MS_CONFIG, String.valueOf(zipkinRetentionMs)),
                            AlterConfigOp.OpType.SET
                        ),
                        new AlterConfigOp(
                            new ConfigEntry(TopicConfig.SEGMENT_BYTES_CONFIG, String.valueOf(zipkinSegmentBytes)),
                            AlterConfigOp.OpType.SET
                        )
                    )));
        } finally {

        }

    }