Repository navigation
Cron Central Filter Tenants By Server
Documentação técnica do filtro de tenants na agenda central (app:cron:run) do submódulo api-platform-common.
A API multi-tenant mantém uma agenda central de jobs (CronJob) no banco master. Jobs com scope = tenant são expandidos para cada tenancy installed com app_host preenchido.
Em ambientes com vários hosts (produção, staging, white-labels em servidores distintos), o mesmo master pode listar tenants cujo banco não é alcançável a partir do host que está rodando o cron. Isso gerava falhas recorrentes (Access denied, Connection timed out) em comandos como tenant:integration:start, tenant:messenger:consume e import:start.
php bin/console app:cron:run [--server=<domínio>] [--dry-run]| Opção | Efeito |
|---|---|
--server=<domínio> |
Limita a expansão de jobs tenant aos tenancies cujo server_id corresponde ao do host informado |
(sem --server) |
Usa APP_DOMAIN do ambiente como filtro implícito (via CronRunCommand::resolveServerFilter) |
--dry-run |
Lista as execuções devidas sem executar os comandos |
O filtro não altera jobs de scope = master (rodam uma vez, sem domínio).
-
CronRunCommandresolve o host (--serverouAPP_DOMAIN). -
CronJobService::getDueJobExecutions($now, $serverHost)passa o host paragetTargetTenants. -
getTargetTenants:- Se
$serverHostvazio → mantém o comportamento anterior (todos os tenantsinstalledcomapp_host). - Se preenchido → busca
server_idemtenanciesondeapp_host = :server_hosteserver_id IS NOT NULL. - Se não achar
server_id→ retorna lista vazia (nenhum job tenant para esse host). - Se achar → adiciona
WHERE server_id = :server_idna seleção de tenants.
- Se
Consultas usam parâmetros tipados (ParameterType::STRING / INTEGER).
- O host de produção com
--server=api.controleonline.com(ouAPP_DOMAINequivalente) não tenta conectar em tenants de outros servidores ou registros locais inválidos (localhost:8081, etc.). - Uma rodada sem filtro explícito ainda herda
APP_DOMAINe, portanto, também fica restrita ao servidor do processo. - Falhas de tenants inalcançáveis deixam de derrubar a rodada inteira por tentativa de conexão indevida.
| Artefato | Papel |
|---|---|
src/Command/CronRunCommand.php |
Entrypoint app:cron:run; resolve --server / APP_DOMAIN; lock de 900s |
src/Service/CronJobService.php |
getDueJobExecutions, getTargetTenants (filtro por server_id) |
src/Service/CronJobRunnerService.php |
Execução efetiva do comando configurado por job |
tests/Service/CronJobServiceTest.php |
testDueTenantJobsAreFilteredByCurrentServer |
flowchart TD
A[app:cron:run] --> B{resolveServerFilter}
B -->|--server ou APP_DOMAIN| C[getDueJobExecutions]
C --> D{job.scope}
D -->|master| E[1 execução sem domain]
D -->|tenant| F[getTargetTenants serverHost]
F -->|serverHost vazio| G[todos installed com app_host]
F -->|serverHost definido| H[resolve server_id do host]
H -->|não encontrado| I[lista vazia]
H -->|encontrado| J[tenants com mesmo server_id]
E --> K[CronJobRunnerService]
G --> K
J --> K
CronJobServiceTest::testDueTenantJobsAreFilteredByCurrentServer monta um job tenant e um tenant com server_id = 7 associado ao host api.controleonline.com, e verifica que a execução devida carrega exatamente esse domínio/serverId.
- Faz: filtrar a expansão de jobs tenant pela identidade de servidor do host que agenda o cron.
-
Não faz: provisionar tenancies, alterar
installation_status, nem expor endpoint HTTP novo. É superfície de console/operacional da API. -
Visão de produto: infraestrutura da API (sem
APP_TYPEde UI). Não há tela no Manager/CRM/POS relacionada a este filtro.
- Home do módulo: Home
- Wiki principal da API: api-community/wiki
- Issue de origem: api-community#85
- Commit:
api-platform-common@7e8f96d— Filter central cron tenants by server
- Qualquer novo job
scope=tenantna tabela central herda o filtro automaticamente. - Ao adicionar hosts/servidores, garantir que o registro em
tenanciesdo próprio host da API tenhaapp_hosteserver_idcoerentes, senão o filtro retorna lista vazia para aquele host.