ETA Notifier - Project Overview
Solution Structure
| Project |
Type |
Framework |
Description |
| TELS.ContractedServices.ETANotifier |
Console App (Batch) |
.NET 8.0 |
Scheduled batch job — publishes upcoming ETA reminders to customers |
| TELS.ContractedServices.ETANotifier.Tests |
xUnit (.NET 8.0) |
.NET 8.0 |
Unit tests (Moq, xUnit, FluentAssertions) |
Architecture
Purpose
ETA Notifier is a scheduled Nomad batch job that sends notification commands reminding customers of upcoming ETAs for contracted services. It is a satellite service to the main Contracted Services system.
How It Works
- Runs every weekday at 8:37 AM via Nomad scheduler
- Retrieves contacts with contracted service locations from the Contracted Services API (paginated)
- Publishes an
UpcomingETAReminderCommand per contact via BusProxy
- The main Contracted Services subscriber consumes these commands and sends actual notifications
Published Messages
| Message Type |
Consumed By |
UpcomingETAReminderCommand |
Contracted Services subscriber |
Schema:
{
"personId": 500
}
Published via BusProxy (TELS.BusProxy.Client 3.0.0 with S3 fallback, 45s timeout).
Key Technology Stack
| Category |
Technology |
| Runtime |
.NET 8.0 |
| Orchestration |
Nomad (Platypus framework) |
| Event Publishing |
TELS.BusProxy.Client 3.0.0 + S3 fallback |
| Auth |
JWT token refresh via Auth Service (5-minute cache) |
| Resilience |
Polly 8.6.0 (HTTP retry) |
| Configuration |
Vault (secrets) + Consul (config) via envconsul |
| Monitoring |
New Relic + PagerDuty alerting |
| Logging |
JSON to AWS CloudWatch (platypus log group) |
| Testing |
xUnit 2.9.3, Moq 4.20.72, FluentAssertions 6.12.0 |
External Dependencies
| Integration |
Mechanism |
Description |
| Contracted Services API |
HTTP (TELS.WebServiceClients.ContractedServices.V2 2.6.1) |
Retrieves contacts with contract locations |
| Auth Service |
HTTP |
Token refresh (5-minute cache) |
| BusProxy |
HTTP + S3 fallback |
Message publishing (45s timeout) |
Deployment
Infrastructure
- Platform: Nomad batch job on AWS (us-east-1)
- Container:
tels/contracted-services/etanotifier
- Schedule:
37 8 * * 1-5 (8:37 AM weekdays, overlap prohibited)
- Resources: 100 MHz CPU, 300 MB memory
- IaC: Terraform (nomad-batch module)
- Secrets: HashiCorp Vault (
secrets/tels/eta-notifier)
- Config: Consul (
tels/eta-notifier)
Environments
| Environment |
Nomad Dashboard |
| DEV |
https://nomad.directsupply-sandbox.cloud/ui/jobs/tels-eta-notifier |
| QA |
https://nomad.directsupply-testing.cloud/ui/jobs/tels-eta-notifier |
| PROD |
https://nomad.directsupply.cloud/ui/jobs/tels-eta-notifier |
Notes
- No database: Purely API-driven batch job with no direct database access.
- No API endpoints: Console application only — not a web service.
- No MQ consumers: Publishes messages only — does not consume any.
- Simpler than ServiceProviderJobNotifier: Single message type, single schedule, no business day validation or blacklist filtering.
- Generated from template: Created via
generator-nomad v1.0.293 scaffolding tool.
- Owner: TechFightingMongoosesEngineers@directsupply.com