Trabajo con Kafka en PHP: descripción general de bibliotecas y ejemplos prácticos
Apache Kafka es una plataforma distribuida para transmisión de datos en flujo que se ha convertido en el estándar de facto para construir sistemas de mensajería de alta carga. En el ecosistema PHP, la integración con Kafka es posible a través de varias bibliotecas, cada una con sus propias características. En este artículo analizaremos dos bibliotecas principales: php-rdkafka (extensión en C) y longlang/phpkafka (PHP puro), y mostraremos ejemplos de código para productor y consumidor.
1. Biblioteca php-rdkafka
php-rdkafka es una extensión nativa de PHP basada en la biblioteca librdkafka. Ofrece el máximo rendimiento y control total sobre la configuración de Kafka. Es adecuada para proyectos en producción con alta carga.
Instalación
La instalación requiere tener librdkafka y PECL:
# Instalación de librdkafka (Ubuntu/Debian)sudo apt-get install librdkafka-dev
# Instalación de la extensión a través de PECLsudo pecl install rdkafka
# Habilitación en php.iniextension=rdkafka.soEjemplo: productor (Producer)
El productor envía mensajes a un tópico de Kafka. Es importante configurar correctamente el envío asíncrono y el manejo de errores:
<?phpuse RdKafka\\Producer;use RdKafka\\Conf;
$conf = new Conf();$conf->set('bootstrap.servers', 'localhost:9092');$conf->set('acks', 'all'); // esperar confirmación de todas las réplicas
$producer = new Producer($conf);$topic = $producer->newTopic('test-topic');
// Envío del mensaje$topic->produce(RD_KAFKA_PARTITION_UA, 0, '¡Hola Kafka!');$producer->flush(1000); // esperar entrega (1 seg)
echo "Mensaje enviado";Ejemplo: consumidor (Consumer)
El consumidor lee mensajes de un tópico. Se recomienda usar grupos de consumidores para balancear la carga:
<?phpuse RdKafka\\KafkaConsumer;use RdKafka\\Conf;
$conf = new Conf();$conf->set('bootstrap.servers', 'localhost:9092');$conf->set('group.id', 'my-consumer-group');$conf->set('auto.offset.reset', 'earliest');
$consumer = new KafkaConsumer($conf);$consumer->subscribe(['test-topic']);
echo "Esperando mensajes...";while (true) { $message = $consumer->consume(120 * 1000); // tiempo de espera 2 minutos switch ($message->err) { case RD_KAFKA_RESP_ERR_NO_ERROR: echo "Recibido: " . $message->payload . ""; break; case RD_KAFKA_RESP_ERR__PARTITION_EOF: echo "Fin de partición alcanzado"; break; case RD_KAFKA_RESP_ERR__TIMED_OUT: echo "Tiempo de espera agotado"; break; default: echo "Error: " . $message->errstr() . ""; break; }}2. Biblioteca longlang/phpkafka
longlang/phpkafka es una implementación del protocolo Kafka en PHP puro sin dependencias externas. Es más fácil de instalar (no requiere compilación) y es adecuada para desarrollo, pruebas o proyectos con requisitos de rendimiento bajos.
Instalación
Instalación a través de Composer:
composer require longlang/phpkafkaEjemplo: productor
<?phpuse longlang\\phpkafka\\Producer\\Producer;use longlang\\phpkafka\\Producer\\ProducerConfig;
$config = new ProducerConfig();$config->setBootstrapServer('localhost:9092');$config->setUpdateBrokers(true);
$producer = new Producer($config);$producer->send('test-topic', '¡Hola Kafka desde PHP puro!', 'key-1');echo "Mensaje enviado";Ejemplo: consumidor
<?phpuse longlang\\phpkafka\\Consumer\\Consumer;use longlang\\phpkafka\\Consumer\\ConsumerConfig;
$config = new ConsumerConfig();$config->setBootstrapServer('localhost:9092');$config->setGroupId('my-group');$config->setTopic('te