La pregunta que una flota te obliga a responder pronto: cuando api-domain necesita algo que api-license sabe, ¿llama a api-license directamente o le pregunta al servicio que ya habla con los dos?
Esta flota lo responde una vez, para todos: por el concentrador. api-server es el único orquestador por el que pasa toda acción multipaso entre servicios. api-license, api-git, api-domain y api-ai son hojas. Una hoja habla con su único proveedor externo y habla de vuelta con api-server. No habla con otra hoja, nunca, por ninguna razón.
Haz la aritmética de por qué esa regla se gana el sueldo. Deja que cinco servicios se llamen libremente y estarás gestionando hasta 5 × 4 = 20 caminos de llamada posibles: veinte sitios donde un contrato puede desviarse, veinte sitios donde un tiempo de espera puede propagarse. Enruta todas esas llamadas por un único concentrador y se reduce a 5 × 2 = 10, cinco hojas hacia dentro y cinco hacia fuera, y todas esas aristas son idénticas: una hoja hablando con el concentrador, con la misma forma de cliente, la misma cabecera de autenticación, la misma lógica de reintentos. Eso no es una victoria menor de orden. Es la diferencia entre un sistema que alguien nuevo puede dibujar en una pizarra de memoria y uno que tiene que ir a leer el código para entender.
merchants
↓
api-server (the hub)
↓
api-license
↓
Statamic
Una petición crea una licencia. Otra aprovisiona un servidor. Una tercera registra un dominio. Cada una es su propia versión de la misma forma: merchants pregunta al concentrador, el concentrador pregunta a exactamente una hoja, la hoja pregunta a exactamente un proveedor. Ninguna de esas peticiones necesita que api-license sepa que api-domain existe, porque no lo necesita. El concentrador ya sabe de ambos.
El coste de esta forma es la concentración, y el libro no debería fingir lo contrario. Toda petición que toque más de una capacidad tiene ahora que pasar por api-server, lo que significa que api-server caído no es una caída parcial: es toda la flota inalcanzable para cualquier cosa que no sea una hoja sirviendo una petición por su cuenta. Esta flota se apoya en ese hecho en lugar de esconderse de él: api-server ejecuta un cortacircuitos por proveedor, no por hoja, porque el concentrador es el único sitio que de verdad necesita saber cuándo una dependencia no está sana.
DependencyHealth vive en el concentrador, no en ninguna hoja, porque el concentrador es el único servicio situado para ver una dependencia fallando en todos los flujos que la tocan. Una capacidad sólo se reporta sana cuando todas las dependencias que enumera lo están. El concentrador concentra el radio de explosión a propósito, y luego gasta código real en asegurarse de que se entera cuando ese radio está ardiendo.
Lo que la topología en estrella descarta es que una hoja se estire de lado buscando un atajo:
// Bad: a leaf reaching sideways into another leaf instead of through the hub
final class DomainProvisionJob implements ShouldQueue
{
use Queueable;
public function __construct(
public string $siteId,
) {}
public function handle(): void
{
$license = LicenseAPI::boot(config('services.license.key'))
->getLicenses();
// now api-domain holds its own copy of a license-service token, its
// own idea of that response shape, and a call path nobody drew on
// the topology diagram
}
}
// Good: api-domain never learns api-license exists
final class DomainProvisionJob implements ShouldQueue
{
use Queueable;
public function __construct(
public string $siteId,
public array $licenseContext,
) {}
public function handle(): void
{
// the hub already fetched this before dispatching the job;
// api-domain just uses it
}
}
La diferencia no es una preferencia de estilo. La versión mala significa que api-domain necesita ahora su propia credencial del servicio de licencias, su propia idea de esa forma de respuesta, y se rompe de una manera que nadie que vigile api-server ve venir, porque el fallo ocurrió en una arista que no debería existir. La versión buena significa que el concentrador, que ya habló con api-license para llegar hasta aquí, simplemente le entrega a la hoja lo que necesita. Una credencial menos en el mundo. Un sitio menos donde un contrato puede desviarse por debajo.