El retraso se produce porque PHP reinicializa un objeto KafkaProducer en cada envío. Cada inicialización requiere conectarse a cada broker y obtener los metadatos del clúster, lo que añade más de 100 ms en una Virtual Private Cloud (VPC) y más de 500 ms a través de Internet.
Causa del comportamiento
Los productores de Kafka deben identificar el broker líder de cada partición antes de enviar un mensaje. Para ello, se requiere una solicitud de metadatos que asocie los topics con las particiones y estas con las direcciones de los brokers. Posteriormente, el productor establece conexiones con los brokers correspondientes.
En la mayoría de los lenguajes, un KafkaProducer se crea una sola vez y se reutiliza en múltiples solicitudes. Un cliente de Java, por ejemplo, inicializa el productor al arrancar, mantiene abiertas las conexiones con los brokers y almacena en caché los metadatos. Los envíos posteriores añaden una latencia mínima.
PHP suele ejecutarse bajo un modelo sin estado compartido y con un proceso por solicitud. A menos que gestione explícitamente el ciclo de vida del productor, cada solicitud crea un nuevo KafkaProducer y repite la secuencia completa de inicialización: obtención de metadatos, conexiones con brokers y descubrimiento del líder de partición. Esta reinicialización repetida es la causa principal del retraso.
Latencia esperada
|
Red |
Sobrecarga por inicialización |
|
VPC |
> 100 ms |
|
Internet |
> 500 ms |
Una vez inicializado el productor, los envíos posteriores añaden una latencia mínima. Reutilizar el productor elimina la sobrecarga de inicialización por mensaje.