记一次kafka配置的坑

背景:

项目迁移至云平台各项要求按照云平台规则。kafka配置修改等操作要通过平台界面。

项目程序分为核心节点和省份节点,通过kafka进行消息传递。

现象:

起初消息收发正常,进行下一步调试,期间同事进行了扩容,暂停几天后消息无法发送,报错如下。

 无法创建topic。而使用扩容前的测试topic则是可以正常收发消息的。

判断:

1、怀疑kafka配置auto.create.topics.enable=false,使程序无法自动创建topic,改为true,仍不行。

2、通过kafka控制平台手动创建topic,还是不可以。

3、怀疑是扩容新增机器导致,停掉新增服务器并在配置中去掉。依然不行。

排查:

 扩容前的topic可以,新的topic为什么不行呢?于是在程序中打印所能获取到的topic列表

Seq<String> allTopics = zkUtils.getAllTopics();
    Iterator<String> iterator = allTopics.iterator();
    while (iterator.hasNext()){
       String next = iterator.next();
        logger.info("all topics-----> {}",next);
    }

发现只有测试的topic,推断应该是zk节点的问题,于是查看旧的topic和新的topic在zk上的路径,果然不同:

扩容前topic在zk上的路径:/brokers/topics

扩容后新的路径:/xxxkafka/467624363/xxx-xxxkafka/brokers/topics

但是!在获取topic时又没有指定zk路径,于是在代码中加了一行测试一下

zkClient.getAcl("/xxxkafka/467624363/xxx-xxxkafka/brokers/topics");

 试图指定路径来获取新的topic列表,但是报错

java.lang.RuntimeException: trying to get acls on non existing node  /xxxkafka/467624363/xxx-xxxkafka/brokers/topics

看来不能从代码层面解决这个问题,那就在配置上找。

解决: 

在kafka配置文件server.properties中看到(不知什么时候被改了)

zookeeper.connect=10.123.20.123:12013/xxxkafka/467624363/xxx-xxxkafka 

而程序中kafka设置的zk

ZkUtils.apply("10.123.20.123:12013", 30000, 30000, false)

 于是修改程序的配置为和kafka配置zookeeper.connect=  的相同

ZkUtils.apply("10.123.20.123:12013/xxxkafka/467624363/xxx-xxxkafka ", 30000, 30000, false)

问题解决!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
你好!关于在Spring Boot中配置Kafka,你可以按照以下步骤进行操作: 1. 导入Kafka依赖:在你的Spring Boot项目的`pom.xml`文件中,添加以下依赖: ```xml <dependency> <groupId>org.springframework.kafka</groupId> <artifactId>spring-kafka</artifactId> </dependency> ``` 2. 配置Kafka属性:在`application.properties`或`application.yml`文件中添加Kafka的连接属性,例如: ```properties spring.kafka.bootstrap-servers=localhost:9092 spring.kafka.consumer.group-id=my-group spring.kafka.consumer.auto-offset-reset=earliest ``` 3. 创建生产者:使用`KafkaTemplate`类创建一个Kafka生产者,示例代码如下: ```java import org.springframework.beans.factory.annotation.Autowired; import org.springframework.kafka.core.KafkaTemplate; import org.springframework.stereotype.Service; @Service public class KafkaProducerService { private final KafkaTemplate<String, String> kafkaTemplate; @Autowired public KafkaProducerService(KafkaTemplate<String, String> kafkaTemplate) { this.kafkaTemplate = kafkaTemplate; } public void sendMessage(String topic, String message) { kafkaTemplate.send(topic, message); } } ``` 4. 创建消费者:使用`@KafkaListener`注解创建一个Kafka消费者,示例代码如下: ```java import org.springframework.kafka.annotation.KafkaListener; import org.springframework.stereotype.Service; @Service public class KafkaConsumerService { @KafkaListener(topics = "my-topic", groupId = "my-group") public void receiveMessage(String message) { System.out.println("Received message: " + message); // 处理收到的消息逻辑 } } ``` 以上是一个简单的Kafka配置和使用示例。你可以根据自己的需求修改和扩展这些代码。希望能对你有所帮助!如有更多问题,请随时提问。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值