Overview
Walle is built on NestJS and follows a modular architecture designed for high-volume AVL (Automatic Vehicle Location) telemetry data processing. The system uses a dual-database approach to optimize for different data access patterns.Multi-Database Architecture
PostgreSQL with PostGIS
Handles time-series telemetry data (tracking points) with:- Time-series partitioning for efficient querying of large datasets
- PostGIS extension for geospatial operations and queries
- Optimized for write-heavy workloads with high-volume telemetry ingestion
- Daily table partitions to maintain query performance
MongoDB
Manages user and application data with:- DeltaDispatch database for user profiles and authentication data
- AuthSoftware database for additional authentication services
- Optimized for flexible schemas and user data retrieval
NestJS Module Structure
Walle’s application is organized into specialized modules defined insrc/app.module.ts:
Core Modules
DatabaseModule
Provides database connectivity for both PostgreSQL and MongoDB:- PostgreSQL connection via TypeORM for time-series telemetry data
- MongoDB connections via Mongoose for user data
- Dynamic module configuration for multiple database connections
- Located in
src/app/database/database.module.ts
AuthModule
Handles JWT-based authentication:- Passport JWT strategy for token validation
- 8-hour token expiration configured via JwtModule
- Integrates with UserModule for user lookup and validation
- Located in
src/app/auth/auth.module.ts
UserModule
Manages user data from MongoDB:- Mongoose schemas for user documents
- User lookup by DNI for authentication
- Connects to DeltaDispatch database
- Located in
src/app/user/user.module.ts
PointsModule
Handles telemetry tracking points:- TypeORM entities for PostgreSQL time-series data
- PartitionManagerService for automated partition management
- ScheduleModule for cron-based partition creation
- REST endpoints for point ingestion and retrieval
- Located in
src/app/points/points.module.ts
Data Flow for Tracking Points
Incoming Telemetry Data
- HTTP Request arrives at PointsController
- Authentication validated via JWT strategy
- PointsService processes the tracking data
- Point entity contains rich telemetry including:
- GPS coordinates (latitude, longitude, altitude)
- PostGIS geometry for spatial queries
- Speed, angle, and movement data
- Device status (ignition, battery, GSM signal)
- Geofence and sector tracking
- Trip and alarm information
- TypeORM inserts data into the appropriate daily partition
- Automatic partition routing based on timestamp
Partition Management
- Bootstrap: Parent partitioned table created if it doesn’t exist
- Daily Cron Job: Runs at 23:50 to create next day’s partition
- Automatic Indexing: Each partition gets optimized indexes for:
- Timestamp queries
- IMEI + timestamp lookups
- Trip tracking queries
- Geospatial queries (GIST index)
Component Interaction
The dual-database architecture allows Walle to optimize for both high-volume time-series writes (PostgreSQL) and flexible user data queries (MongoDB).
Key Design Patterns
Separation of Concerns
- Time-series data isolated in PostgreSQL partitions
- User/authentication data in MongoDB for flexibility
- Clear module boundaries with defined responsibilities
Scalability
- Horizontal partition scaling via daily table partitioning
- Index optimization per partition for query performance
- Automatic partition management prevents manual operations
Maintainability
- TypeORM entities provide type-safe database operations
- Mongoose schemas for flexible MongoDB documents
- Modular architecture enables independent module updates
- Configuration management via environment variables