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 = 8socket.send.buffer.bytes = 102400
socket.receive.buffer.bytes = 102400
socket.request.max.bytes = 104857600
session.timeout.ms = 1000group.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 = SHA1PRNGsasl.enabled.mechanisms = ОБЫЧНАЯ, SCRAM-SHA-256
sasl.mechanism.inter.broker.protocol = РАВНИНАlog.dirs =...
num.partitions = 1
num.recovery.threads.per.data.dir = 1offsets.topic.replication.factor = 1
transaction.state.log.replication.factor = 1
transaction.state.log.min.isr = 1log.retention.hours = 168
log.retention.bytes = 1073741824
log.segment.bytes = 1073741824
log.retention.check.interval.ms = 300000
num.replica.fetchers = 1zookeeper.connect = локальный: 2181
zookeeper.connection.timeout.ms = 6000
group.initial.rebalance.delay.ms = 0consumer.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 подтверждений = 0ssl.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 .