python访问kafka生产send与消费poll很慢的原因分
生产send与消费poll很慢的原因分析
kafka版本为kafka_2.12-2.7.0消费时主要表现在poll()几乎是卡住不动,分两种情况:
一、使用listeners的hostname,同时客户端配置hosts
-
server.properties的配置:<code>listeners=PLAINTEXT://eas-61-13-20-41:9092</code>
-
访问时使用的是:<code>consumers = KafkaConsumer(bootstrap_servers="192.168.1.1:9092", group_id='wxk',auto_offset_reset='earliest')</code>
-
而本地电脑的hots文件未增加<code>IP hostname</code>的配置
此时如果在hots中增加<code>ip hostname</code>的配置,则可解决此问题。
二、使用listeners的IP监听
- server.properties的配置:<code>listeners = PLAINTEXT://192.168.1.1:9092</code>
- 客户端访问时使用<code>consumers = KafkaConsumer(bootstrap_servers="192.168.1.1:9092", group_id='wxk',auto_offset_reset='earliest')</code>
- <font color=red>此时客户端消费时不影响</font>
三、不显式配置listeners
- server.properties的配置:<code>#listeners=PLAINTEXT://:9092</code>,保持默认的注释,而不显式配置。
- 访问时使用<code>consumers = KafkaConsumer(bootstrap_servers="192.168.1.1:9092", group_id='wxk',auto_offset_reset='earliest')</code>,此时<font color=red><code>consumers.poll()</code>就会卡住</font>,需要增加客户端电脑的hosts配置。
四、分析其问题原因
根据kafka配置文件server.properties的解释:
# The address the socket server listens on. It will get the value returned from
# java.net.InetAddress.getCanonicalHostName() if not configured.
# FORMAT:
# listeners = listener_name://host_name:port
# EXAMPLE:
# listeners = PLAINTEXT://your.host.name:9092
#listeners=PLAINTEXT://:9092
# Hostname and port the broker will advertise to producers and consumers. If not set,
# it uses the value for "listeners" if configured. Otherwise, it will use the value
# returned from java.net.InetAddress.getCanonicalHostName().
#advertised.listeners=PLAINTEXT://your.host.name:9092
按照配置文件中的解释,如果没有配置listeners时则使用java.net.InetAddress.getCanonicalHostName(),同时Hostname and port the broker will advertise to producers and consumers,如果未设置advertised.listeners,则依次使用listeners、ava.net.InetAddress.getCanonicalHostName().
至次已经明确,如果未显示配置使用IP,则kafka会使用hostname监听,此时客户端使用IP访问,则由于没有域名与IP的对应关系,导致访问非常慢(卡住不动的状态)。
五、结论
- 最好是在server.properties的配置文件是,使用IP显示配置listeners
- 其次是在客户端电脑中修改hosts文件,增加hostname与ip的配置。