Event Streams 的已知限制
如果您在使用 Event Streams時發現問題,請檢閱下列已知限制及暫行解決方法。
如果 Kafka 引導伺服器失敗,Java Kafka 呼叫不會進行失效接手
問題
Java™ 虛擬機器 (JVM) 會快取 DNS 查閱。 當 JVM 解析主機名稱的 IP 位址時,它會快取指定期間 (稱為存活時間 (TTL)) 的 IP 位址。 部分 Java 配置會設定 JVM TTL,因此在重新啟動 JVM 之前永遠不會重新整理主機名稱的 IP 位址。 配置範例是具有安全管理程式的配置。
暫行解決方法
因為 Event Streams 使用 Kafka 引導伺服器 URL 搭配多個 IP 位址以取得高可用性,所以不是所有分配管理系統 IP 位址都為 Kafka 用戶端所知,如此便導致無法失效接手到有效的分配管理系統。 在這些情況下,失效接手需要重新要求分配管理系統 URL 的 IP 位址,才能取得工作中的 IP 位址。 建議您將 JVM 配置為具有 30 到 60 秒的 TTL 值。 此值可確保如果引導伺服器的 IP 位址有問題,Kafka 用戶端可以透過查詢 DNS 來查閱並使用新的 IP 位址。
請參閱 java.security 檔中的下列範例:
# The Java-level namelookup cache policy for successful lookups:
#
# any negative value: caching forever
# any positive value: the number of seconds to cache an address for
# zero: do not cache
#
# default value is forever (FOREVER). For security reasons, this
# caching is made forever when a security manager is set. When a security
# manager is not set, the default behavior in this implementation
# is to cache for 30 seconds.
#
# NOTE: setting this to anything other than the default value can have
# serious security implications. Do not set it unless
# you are sure you are not exposed to DNS spoofing attack.
#
#networkaddress.cache.ttl=-1
如何修改 JVM 的 TTL
-
若要修改所有應用程式的 JVM TTL,請在
<$JAVA_HOME>/jre/lib/security/java.security檔案中設定networkaddress.cache.ttl值。 -
若要修改特定應用程式的 JVM TTL,請在應用程式碼中設定
networkaddress.cache.ttl。java.security.Security.setProperty("networkaddress.cache.ttl" , "30");
Java Kafka 呼叫可能逾時
問題
有時 Kafka Java 用戶端呼叫找不到 Kafka。 失敗的原因是 Kafka 用戶端針對每一個引導伺服器判定相同的失敗 IP 位址。 Kafka 用戶端會嘗試每個分配管理系統的 IP 位址(也就是相同的失敗 IP 位址),然後不正確地判斷 Kafka 關閉。 如果在 DNS 查詢中傳回多個 IP 位址,則 Kafka 用戶端會使用清單中傳回的第一個 IP 位址。
暫行解決方法
在等待足夠長的 JVM DNS 快取讓分配管理系統 URL 到期之後,請重試呼叫。 在後續的 Kafka 呼叫中,DNS 查詢會傳回工作中分配管理系統 IP 位址。
Kafka 改善提案 (KIP) #302 (可作為 Kafka 2.1.1 中的選項,依預設會從 2.6.0中併入) 可確保 Kafka 用戶端會嘗試所有可用的分配管理系統 IP 位址,而不是子集,因此單一 IP 位址中的失敗不會導致失敗。
您需要使用下列其中一種方法來選擇此功能:
-
在配置參數
client.dns.lookup的「消費者」和「生產者」內容中指定新的容許值:client.dns.lookup: "use_all_dns_ips" -
使用常數
CommonClientConfigs.CLIENT_DNS_LOOKUP_CONFIG: ClientDnsLookup.USE_ALL_DNS_IPS。
主題及分割區
- 主題名稱限制為最多 200 個字元。
- 一個主題的預設分割區數目是一 (1)。
在 Kafka 中建立及刪除主題
在 Kafka 中,主題建立及刪除是非同步作業,可能需要一些時間才能完成。 避免依賴快速建立及刪除主題,或快速刪除及重建主題的使用型樣。