O atraso ocorre porque o PHP reinicializa um objeto KafkaProducer a cada envio. Cada inicialização exige conexão com cada broker e busca de metadados do cluster, o que adiciona mais de 100 ms em uma Virtual Private Cloud (VPC) e mais de 500 ms pela Internet.
Causa do problema
Antes de enviar uma mensagem, os produtores do Kafka precisam identificar o broker líder de cada partição. Isso requer uma solicitação de metadados para mapear tópicos em partições e partições em endereços de brokers. Em seguida, o produtor estabelece conexões com os brokers relevantes.
Na maioria das linguagens, cria-se um KafkaProducer apenas uma vez para reutilizá-lo em várias requisições. Um cliente Java, por exemplo, inicializa o produtor na partida, mantém as conexões com os brokers abertas e armazena os metadados em cache. Os envios subsequentes adicionam latência mínima.
O PHP geralmente opera em um modelo share-nothing, com uma requisição por processo. A menos que você gerencie explicitamente o ciclo de vida do produtor, cada requisição cria um novo KafkaProducer e repete toda a sequência de inicialização: busca de metadados, conexões com brokers e descoberta de líderes de partição. Essa reinicialização repetida é a principal causa do atraso.
Latência esperada
|
Rede |
Sobrecarga por inicialização |
|
VPC |
> 100 ms |
|
Internet |
> 500 ms |
Após a inicialização do produtor, os envios seguintes acrescentam latência mínima. Reutilizar o produtor elimina a sobrecarga de inicialização por mensagem.