Microservicios en PHP: arquitectura y práctica de nivel avanzado

Entrenador de Python en Línea para Principiantes

Aprende Python fácilmente sin sobrecargarte de teoría. Resuelve tareas prácticas con verificación automática, recibe pistas y escribe código directamente en el navegador, sin instalar nada.

Start Course

Microservicios en PHP: de la teoría a la producción



La transición de un monolito a una arquitectura de microservicios en PHP no es solo una actualización tecnológica, sino un cambio fundamental en la mentalidad del desarrollador. A nivel avanzado, nos enfrentamos a desafíos reales: transacciones distribuidas, consistencia de datos, latencia de red y complejidad de depuración. En este artículo, analizaremos los patrones clave y las técnicas prácticas que ayudarán a construir un sistema confiable y escalable en PHP.



1. Comunicación entre servicios: síncrona vs asíncrona



La elección del protocolo de comunicación es lo primero que enfrenta un arquitecto. En el ecosistema PHP, existen dos enfoques principales.



Comunicación síncrona mediante REST/gRPC

Ideal para operaciones que requieren una respuesta inmediata (por ejemplo, verificar el saldo de un usuario). Sin embargo, crea dependencias rígidas: si el servicio B falla, el servicio A también caerá. Se recomienda usar el patrón Circuit Breaker.



// Ejemplo de Circuit Breaker en PHP usando la librería Guzzleuse GuzzleHttp\\Client;use GuzzleHttp\\Exception\\ConnectException;

class CircuitBreaker { private int $failureCount = 0; private int $threshold = 3; private int $timeout = 30; // segundos private bool $open = false; private int $lastFailureTime = 0;

public function call(string $url): ?array { if ($this->isOpen()) { return null; // Cierre rápido }

try { $client = new Client(['timeout' => 2.0]); $response = $client->get($url); $this->reset(); return json_decode($response->getBody(), true); } catch (ConnectException $e) { $this->recordFailure(); return null; } }

private function isOpen(): bool { if (!$this->open) return false; if (time() - $this->lastFailureTime > $this->timeout) { $this->open = false; // Estado semiabierto return false; } return true; }

private function recordFailure(): void { $this->failureCount++; $this->lastFailureTime = time(); if ($this->failureCount >= $this->threshold) { $this->open = true; } }

private function reset(): void { $this->failureCount = 0; $this->open = false; }}


Comunicación asíncrona mediante colas (RabbitMQ, Kafka)

Para operaciones que no requieren una respuesta instantánea (enviar correos electrónicos, generar informes). Use la librería php-amqplib.



// Publicación de un evento en RabbitMQuse PhpAmqpLib\\Connection\\AMQPStreamConnection;use PhpAmqpLib\\Message\\AMQPMessage;

$connection = new AMQPStreamConnection('localhost', 5672, 'guest', 'guest');$channel = $connection->channel();

$channel->queue_declare('order_created', false, true, false, false);

$data = json_encode([ 'order_id' => 12345, 'user_id' => 678, 'total' => 1500.00]);$msg = new AMQPMessage($data, ['delivery_mode' => AMQPMessage::DELIVERY_MODE_PERSISTENT]);$channel->basic_publish($msg, '', 'order_created');

$channel->close();$connection->close();


2. Gestión de datos: CQRS y Event Sourcing



En microservicios, cada servicio debe ser dueño de sus datos. Pero, ¿qué hacer si necesita combinar datos de diferentes servicios para un informe? Aquí viene al rescate el patrón CQRS (Command Query Responsibility Segregation).



Implementación de un CQRS simple en PHP

Separamos los comandos (escritura) de las consultas (lectura). Para escritura usamos Doctrine ORM, para lectura usamos consultas SQL directas al modelo de lectura.



// Comando: creación de pedidoclass CreateOrderCommand {    public function __construct(        public readonly int $userId,        public readonly array $items,        public readonly float $total    ) {}}

// Manej

Blogs

Book Recommendations