Kafka SASL рукопожатие занимает слишком много времени

Описание: аутентификация с использованием SASL/SCRAM или SASL/PLAINTEXT занимает около 9 секунд. Это нормально?

Как воспроизвести:

  • Один экземпляр брокера Kafka (v1.1.0)
  • Один производитель C# (Confluent Kafka Client v0.11.4), который делает следующее:
       

    var producerConfig =    
               PropertiesUtils.ReadPropertiesFile("producer.properties");

           using (var producer = new Producer(producerConfig, null, new StringSerializer(Encoding.UTF8)))
           {
               while (true)
               {
                   Console.Write("message: ");
                   string msg = Console.ReadLine();

                   producer.ProduceAsync("test-topic", null, msg);
               }
           }

  • Один потребитель C# (Confluent Kafka Client v0.11.4), который выполняет следующие действия:
        

    var config = PropertiesUtils.ReadPropertiesFile("consumer.properties");

            using (var consumer = new Consumer(config, null, new StringDeserializer(Encoding.UTF8)))
            {
                consumer.OnMessage += (_, msg)
                      =>
                {
                    Console.WriteLine(msg.Value);
                };

                consumer.OnError += (_, error)
                  => Console.WriteLine($"Error: {error}");

                consumer.OnConsumeError += (_, msg)
                  => Console.WriteLine($"Consume error ({msg.TopicPartitionOffset}): {msg.Error}");

                consumer.Subscribe("test-topic");

                while (true)
                {
                    try
                    {
                        consumer.Poll(TimeSpan.FromMilliseconds(1000));
                    }
                    catch(Exception e)
                    {
                        Console.WriteLine(e.Message);
                    }
                }
            }

  • server.properties:

    broker.id = 0
    num.network.threads = 3
    num.io.threads = 8

    socket.send.buffer.bytes = 102400
    socket.receive.buffer.bytes = 102400
    socket.request.max.bytes = 104857600
    session.timeout.ms = 1000

    group.initial.rebalance.delay.ms = 0

    слушатели =SASL_SSL:// локальный:9093

    ssl.keystore.type = JKS
    ssl.keystore.location =...
    ssl.keystore.password =...
    ssl.key.password =...

    ssl.truststore.type = JKS
    ssl.truststore.location =...
    ssl.truststore.password =...

    ssl.protocol = TLS
    ssl.enabled.protocols = TLSv1.2, TLSv1.1, TLSv1
    ssl.client.auth = требуемая
    security.inter.broker.protocol = SASL_SSL
    ssl.secure.random.implementation = SHA1PRNG

    sasl.enabled.mechanisms = ОБЫЧНАЯ, SCRAM-SHA-256
    sasl.mechanism.inter.broker.protocol = РАВНИНА

    log.dirs =...
    num.partitions = 1
    num.recovery.threads.per.data.dir = 1

    offsets.topic.replication.factor = 1
    transaction.state.log.replication.factor = 1
    transaction.state.log.min.isr = 1

    log.retention.hours = 168
    log.retention.bytes = 1073741824
    log.segment.bytes = 1073741824
    log.retention.check.interval.ms = 300000
    num.replica.fetchers = 1

    zookeeper.connect = локальный: 2181
    zookeeper.connection.timeout.ms = 6000
    group.initial.rebalance.delay.ms = 0

  • consumer.properties:

    bootstrap.servers = локальный:9093
    group.id = тест-потребитель-группа
    fetch.min.bytes = 1
    fetch.wait.max.ms = 1
    auto.offset.reset = последняя
    socket.blocking.max.ms = 1
    fetch.error.backoff.ms = 1
    ssl.ca.location =...
    ssl.certificate.location =...
    ssl.key.location =...
    ssl.key.password =..
    security.protocol = SASL_SSL
    sasl.mechanisms = РАВНИНА
    sasl.username =...
    sasl.password =...

  • producer.properties

    bootstrap.servers = локальный:9093
    не compression.type= нет
    linger.ms=0
    повторные попытки = 0 подтверждений = 0

    ssl.ca.location =...
    ssl.certificate.location =...
    ssl.key.location =...
    ssl.key.password =...

    security.protocol = SASL_SSL
    sasl.mechanisms = РАВНИНА
    sasl.username =...
    sasl.password =...

  • Запустите потребителя. Требуется приблизительно 9 секунд, чтобы завершить рукопожатие SASL от запроса до завершения. Вот журнал:

    [2018-07-06 17: 03: 37,673] ОТЛАДКА Установите состояние сервера SASL в HANDSHAKE_OR_VERSIONS_REQUEST (org.apache.kafka.common.security.authenticator.SaslServerAuthenticator) [2018-07-06 17:03:37,673] Обработка запроса Kafka API_VERSIONS (org.apache.kafka.common.security.authenticator.SaslServerAuthenticator) [2018-07-06 17:03:37,673] ОТЛАДКА Установите состояние сервера SASL в HANDSHAKE_REQUEST (org.apache.kafka.common.security.authenticatorver.AaslSerer) [2018-07-06 17: 03: 37,673] Отладка Обработка запроса Кафки SASL_HANDSHAKE (org.apache.kafka.common.security.authenticator.SaslServerAuthenticator) [2018-07-06 17:03:37, 674] Отладка с использованием механизма SASL "PLAIN" предоставляется клиентом (org.apache.kafka.common.security.authenticator.SaslServerAuthenticator) [2018-07-06 17:03:46, 805] ОТЛАДКА Установите состояние сервера SASL в AUTHENTICATE (org.apache.kafka.common).security.authenticator.SaslServerAuthenticator) [2018-07-06 17:03:46,807] ОТЛАДКА Установите состояние сервера SASL на ЗАВЕРШЕНО (org.apache.kafka.common.security.authenti cator.SaslServerAuthenticator)

Замечания:

  • Я наблюдал ту же продолжительность при запуске продюсера, а также

  • Я наблюдал ту же продолжительность при аутентификации с использованием SCRAM-256

  • Я наблюдал ту же продолжительность при запуске клиентов Java (kafka-console-consumer а также kafka-console-producer)

ОБНОВЛЕНИЕ: в соответствии с рекомендациями @edenhill Когда я настраивал посредника на виртуальной машине Ubuntu и подключал клиентов из Windows, задержка больше не наблюдается. Интересно, почему рукопожатие SSL и аутентификация SASL каждый занимает 10 секунд в Windows!

1 ответ

Я наблюдал ту же проблему, и я мог решить ее, рекламируя брокеров, используя полные доменные имена.

Если брокеры отмечены IP-адресами, это вызывает обратный поиск DNS черезjava.net.InetAddress#getHostName()что медленно в некоторых средах. Соответствующий код находится здесь: https://github.com/apache/kafka/blob/3.3.1/clients/src/main/java/org/apache/kafka/common/network/SaslChannelBuilder.java#L231 .

Другие вопросы по тегам