Service matrix
| Service | Primary responsibility | Product scope | Data path | Failure behaviour |
|---|---|---|---|---|
go-sync |
High-performance mobile push/pull, acknowledgements and device health | Campaigns + mobile form payloads | Direct PostgreSQL + Redis processing list | Pull can fall back to Laravel when configured; native push is handled by Go |
go-bulk-import |
Heavy background imports | Campaigns/shared operations | Claims bulk_operations; reads shared disk or S3 |
Disable to use Laravel import path |
go-dashboard |
Campaign decision-dashboard projections | TALA Campaigns | PostgreSQL/outbox to Redis and snapshot/read-model paths | Laravel falls back to cached/live queries for unsupported or stale projections |
go-xlsform |
Streams very large XLSX choice sheets | TALA Flow | Laravel uploads XLSX over private HTTP; receives NDJSON rows/progress | Laravel local reader and PhpSpreadsheet compatibility path remain available |
go-report |
Streaming CSV/XLSX exports | Campaigns, Workforce, Flow | Claims export operations, streams PostgreSQL, writes shared storage | Laravel keeps core pages online and can reject new heavy reports when worker is not ready |
Why these services are separate
They isolate workloads with very different memory and concurrency profiles. A million-row export should not consume PHP-FPM memory needed for login or dashboards. A large XLSForm parser should not share the same failure domain as sync. Campaign sync can be tuned for latency while report generation can be tuned for throughput.
Security boundary
These are private application services. Do not expose their health, metrics, XLSForm or report ports to the public internet. Internal service authentication and shared secrets must be configured through the runtime secret store.