Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> Android開發 >> 關於android開發 >> 記一次kafka producer連接緩慢的排查

記一次kafka producer連接緩慢的排查

編輯:關於android開發

記一次kafka producer連接緩慢的排查


現象:
kafka producer通過SSL連接kafka broker,發送消息。
能夠發送成功,但連接非常緩慢,發送一條消息接近50秒。

環境:
kafka broker位於數據中心,通過端口映射暴露到公網。
內網IP:10.1.1.1
公網IP:x.x.x.x (映射 9093 端口到內網的10.1.1.1:9093)

內網訪問broker使用PLAINTEXT,外網訪問broker使用SSL。

broker配置(只網絡相關配置)
  1. ssl.keystore.location=server.keystore.jks
  2. ssl.keystore.password=xxx
  3. ssl.key.password=xxx
  4. ssl.truststore.location=server.truststore.jks
  5. ssl.truststore.password=xxx
  6. ssl.client.auth=required
  7. listeners=PLAINTEXT://0.0.0.0:9092,SSL://:9093
  8. advertised.listeners=PLAINTEXT://10.1.1.1:9092,SSL://x.x.x.x:9093

producer在外網,通過SSL訪問。配置:
  1. bootstrap.servers=x.x.x.x:9093
  2. ssl.protocol=SSL
  3. security.protocol=SSL
  4. ssl.keystore.location=client.keystore.jks
  5. ssl.keystore.password=xxx
  6. ssl.key.password=xxx
  7. ssl.truststore.location=client.truststore.jks
  8. ssl.truststore.password=xxx

producer日志:
  1. 14:01:23.367 [main] INFO org.apache.kafka.common.utils.AppInfoParser - Kafka version : 0.9.0.1
  2. 14:01:23.367 [main] INFO org.apache.kafka.common.utils.AppInfoParser - Kafka commitId : 23c69d62a0cabf06
  3. 14:01:44.856 [main] INFO org.apache.kafka.clients.producer.KafkaProducer - Closing the Kafka producer with timeoutMillis = 9223372036854775807 ms.

排查:
在producer一側,使用tcpdump觀察9093端口,發現SSL握手成功,也有數據傳輸,
但是從producer啟動到發送出syn,間隔10多秒。

後來去掉對9093端口的過濾,觀察所有端口,發現在137端口有name query,
發送了3次,花費了10多秒。
137端口是windows的NETBIOS協議,看來producer是在向broker查詢主機信息。

然後,通過jstack查看producer的線程堆棧,發現在getHostByAddr處等待。
到這時,才懷疑是不是因為取不到broker的主機名。

在producer一側的hosts文件裡配置主機名 "x.x.x.x serverx" 之後,故障解決,
producer非常快就結束了消息發送。


總結:
這次故障,是因為客戶端無法根據服務器的IP獲取主機名,一直等待到超時,所以造成處理緩慢。

最終通過配置hosts解決。
(如果使用DNS的話,看來需要配置反向解析。)


producer的配置裡直接設置的是broker的ip,為什麼客戶端還要調用getHostByAddr呢?
這個問題還沒有弄明白,猜測是因為SSL協議需要校驗服務器證書,會用服務器的域名和
證書的cn比對吧?

  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved