Restrições conhecidas para o Event Streams

Se você encontrar um problema enquanto usa o Event Streams, revise as restrições e soluções alternativas conhecidas, a seguir.

As chamadas do Java Kafka não executarão failover se um servidor de autoinicialização Kafka falhar

Problema

A Máquina virtual Java™ (JVM) armazena em cache as consultas de DNS. Quando a JVM resolve um endereço IP para um nome de host, ele armazena em cache o endereço IP por um período especificado, que é conhecido como o tempo de vida (TTL). Algumas configurações Java definem o TTL da JVM para que ele nunca atualize um endereço IP do nome do host até que a JVM seja reiniciada. Uma configuração de exemplo é aquela que tem um gerenciador de segurança.

Solução alternativa

Como o Event Streams usa URLs do servidor de autoinicialização Kafka com múltiplos endereços IP para alta disponibilidade, nem todos os endereços IP do broker são conhecidos pelo cliente Kafka, o que evita o failover para um broker ativo. Nesses casos, um failover requer uma nova consulta dos endereços IP para as URLs do broker para obter um endereço IP ativo. Recomenda-se configurar a sua JVM com um valor TTL de 30 a 60 segundos. Esse valor assegura que se um endereço IP do servidor de autoinicialização tiver problemas, o cliente Kafka poderá consultar e usar um novo endereço IP consultando o DNS.

Veja o exemplo a seguir a partir do arquivo 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

Como modificar o TTL da JVM

  • Para modificar o TTL da JVM para todos os aplicativos, configure o valor networkaddress.cache.ttl no arquivo <$JAVA_HOME>/jre/lib/security/java.security.

  • Para modificar o TTL da JVM para um aplicativo específico, configure o networkaddress.cache.ttl em seu código de aplicativo.

    java.security.Security.setProperty("networkaddress.cache.ttl" , "30");
    

Chamadas do Java Kafka podem atingir o tempo limite

Problema

Às vezes, uma chamada do cliente Java Kafka falha ao localizar o Kafka. A causa da falha é que o cliente Kafka determinou o mesmo endereço IP com falha para cada um dos servidores de autoinicialização. O cliente Kafka tenta o endereço IP de cada broker (que é o mesmo endereço IP com falha) e determina incorretamente que o Kafka está inativo. O cliente Kafka usará o primeiro endereço IP que é retornado na lista, se vários endereços IP forem retornados na consulta de DNS.

Solução alternativa

Tente novamente suas chamadas depois de aguardar o tempo suficiente para que o cache DNS da JVM para as URLs do broker expire. Em chamadas subsequentes do Kafka, um endereço IP do broker ativo é retornado da consulta DNS.

Um Kafka Improvement Proposal (KIP) #302 (disponível como uma opção a partir do Kafka 2.1.1 e incluído por padrão a partir do 2.6.0) assegura que os clientes Kafka tentem todos os endereços IP do broker disponíveis e não um subconjunto, portanto, uma falha em um único endereço IP não causa uma falha.

É necessário optar por essa funcionalidade usando um dos métodos a seguir:

  • Especifique um novo valor permitido nas propriedades de Consumidor e Produtor do parâmetro de configuração client.dns.lookup:

    client.dns.lookup: "use_all_dns_ips"
    
  • Use as constantes CommonClientConfigs.CLIENT_DNS_LOOKUP_CONFIG: ClientDnsLookup.USE_ALL_DNS_IPS.

Tópicos e partições

  • Os nomes de tópicos estão restritos a um máximo de 200 caracteres.
  • O número padrão de partições para um tópico é um.

Criando e excluindo tópicos no Kafka

No Kafka, a criação e a exclusão de tópico são operações assíncronas que podem levar algum tempo para serem concluídas. Evite os padrões de uso que contam com a rápida criação e exclusão de tópicos, ou sobre a exclusão rápida e a recriação de tópicos.