【问题标题】:Why Kafka care about the hostname?为什么 Kafka 关心主机名?
【发布时间】:2020-01-13 08:07:10
【问题描述】:

我使用下面的代码进行了测试,以将数据发送到主题。卡夫卡是

kafka_2.12-1.1.0

代码是

import kafka
print(kafka.version.__version__)
from kafka import KafkaProducer 
producer = KafkaProducer(
    bootstrap_servers=['172.25.44.238:9092'],
    sasl_mechanism="PLAIN",
    api_version=(0, 10),
    retries=2
)
f = producer.send("test", "some")
f.get()

如果我像这样更改服务器配置:

listeners=PLAINTEXT://172.25.44.238:9092

然后我的代码就可以向我的主题发送数据了

如果我像这样更改默认的服务器配置:

listeners=PLAINTEXT://:9092

那我的代码会报错:

kafka.errors.KafkaTimeoutError: KafkaTimeoutError: Batch for TopicPartition(topic='test', partition=0) containing 1 record(s) expired: 30 seconds have passed since batch creation plus linger time

不同的是,第二个默认使用主机名。是的,我运行生产者代码的机器无法重新使用 kafka 主机名。但我也没有在生产者代码中使用主机名。所以它不应该导致错误。那么为什么主机名很重要呢?

【问题讨论】:

  • 你从哪里得到“第二个将默认使用主机名”?我很确定它会使用localhost

标签: apache-kafka kafka-python


【解决方案1】:

我认为您误解了“引导”的概念。

您提供的地址仅建立初始连接。客户实际使用的地址由advertised.listeners 定义。

在我看来,listeners 应该始终是://0.0.0.0,然后您使用操作系统级别的防火墙设置来限制访问。是的,默认是主机名,这意味着只有主机可以与代理通信

【讨论】:

  • 并非如此 - 配置多个侦听器完全有效,for example in a Docker setup
  • @daniu listeners 应始终为 0.0.0.0... 没有理由将 Docker 服务名称用作 bind addressadvertised.listeners 应始终指向任何潜在客户可解析的地址。
  • 嗯,那配置项为什么会存在呢?我假设它应该用于限制访问,例如出于安全原因。如果我从一个子网获取入站流量并将流量路由到另一个子网,我是否不需要配置两个非0.0.0.0 接口?
  • @daniu IMO,您可以使用操作系统级别的防火墙来限制接口。当然,您可以使用listeners=192.168.0.0 绑定到该子网,但这并不常见
猜你喜欢
  • 2016-08-31
  • 2021-10-25
  • 2016-11-13
  • 2016-05-24
  • 1970-01-01
  • 1970-01-01
  • 2017-09-29
  • 2014-01-05
  • 2020-10-20
相关资源
最近更新 更多