如何限制Kafka生产者仅向指定端口投递数据?
Kafka 端口投递限制问题
我的配置与操作
我已完成Kafka的server.properties配置:
listeners=PLAINTEXT://:29092, SSL://:29093
同时完成了SSL相关配置,可通过29092端口进行明文连接,通过29093端口进行SSL连接。
我尝试通过以下代码向29093端口生产数据:
props.put(ProducerConfig.BOOTSTRAP_SERVERS_CONFIG, System.getProperty("kafkaPort", "localhost:29093")); // SSL相关配置已在props中完成 Producer<Long, String> producer = new KafkaProducer<>(props, new LongSerializer(), new StringSerializer()); final ProducerRecord<Long, String> record = new ProducerRecord<>(System.getProperty("kafkaTopic", "dqerror"), content); RecordMetadata metadata = producer.send(record).get();
但发布后发现dqerror主题在两个端口都能被访问到,且通过任意端口都能获取到数据。请问是否可以限制仅向指定端口投递数据?
问题解答
首先要澄清核心误解:Kafka的主题是集群级别的全局资源,不存在“按端口创建主题”或“向指定端口投递数据”的概念。你看到的现象本质是:
- 29092和29093只是同一个broker提供的两种不同连接入口(明文/SSL),它们指向的是同一个Kafka实例和同一套主题数据。
- 当你通过29093端口创建主题并发送数据后,主题本身就存在于broker中,自然可以通过另一个端口(29092)访问到——这不是数据被投递到了两个端口,而是同一个主题数据可以通过不同连接方式被访问。
为什么会出现这种情况?
Kafka的listeners配置只是客户端初始连接broker的入口:
- 客户端通过配置的bootstrap端口(比如29093)和broker建立连接后,broker会将自己的
advertised.listeners(如果未配置则默认使用listeners)返回给客户端。 - 后续客户端的所有数据发送、请求操作,都会使用这个返回的地址,而不是初始连接的端口。
- 主题在Kafka中是全局存储的,和连接端口无关,所以任何能连接到broker的客户端(不管用哪个端口),都能访问到所有主题。
如何实现类似“限制仅通过指定端口操作数据”的需求?
如果你想限制只能通过SSL端口(29093)进行生产/消费,可以通过以下两种方式:
关闭明文端口
修改server.properties,只保留SSL listener:listeners=SSL://:29093这样客户端只能通过SSL端口连接broker,完全禁止明文访问。
使用ACL权限控制
给不同的listener设置权限,限制只有通过SSL listener的客户端才能操作目标主题:- 首先给listener命名(方便在ACL中区分):
listeners=PLAINTEXT://:29092, SSL://:29093 listener.security.protocol.map=PLAINTEXT:PLAINTEXT,SSL:SSL - 然后创建ACL规则,允许只有通过SSL listener的用户对
dqerror主题进行生产操作:kafka-acls.sh --authorizer-properties zookeeper.connect=localhost:2181 --add --allow-principal User:your-ssl-user --operation Write --topic dqerror --listener SSL - 同时可以禁止明文端口的用户操作该主题:
kafka-acls.sh --authorizer-properties zookeeper.connect=localhost:2181 --add --deny-principal User:* --operation Write --topic dqerror --listener PLAINTEXT
- 首先给listener命名(方便在ACL中区分):
内容的提问来源于stack exchange,提问作者vel
相关产品推荐
相关产品推荐

