Objective:
Our client is a global leader in mobility technology, specializing in automated fare collection (AFC), payments (cEMV), and real-time information systems. Established and headquartered in Tallinn, this company provides top-tier solutions employed by over 120 public transport authorities across 26 countries. Their product suite includes advanced transit management systems (CAD/AVL) and a highly accurate ETA prediction engine.
Challenge:
The client approached us with the need for a team of engineers to build a crucial part of their extensive system for a specific customer. The requirement was for a backend proxy application that would facilitate the connection between data providers and the frontend system.
Initially, the team attempted to implement multitenancy with a single running backend application, which led to several complications. The approach was revised to run a separate application for each tenant, ensuring better isolation and management of tenant-specific data.
Solution:
We developed a backend proxy application aimed at connecting various data providers with the front end. The project was initiated in the early stages, with some initial configurations in place. Our team built upon this foundation to develop a robust and efficient backend solution.
Converting from HTTP API to a Socket-based approach to handle real-time data was challenging. The REST API was required to provide updates every few seconds. Our team implemented a caching mechanism to store responses from the REST API and updated the data in the socket only when changes were detected, ensuring real-time data delivery without excessive API calls.
Our team consisted of 8 members:
- 5 Backend Developers,
- 3 Frontend Developers.
Technologies:
Backend:
- Java 17: Chosen for its performance, stability, and compatibility with enterprise systems.
- Spring Boot 3: Utilized for its rapid application development capabilities and robust ecosystem.
- Swagger V3: Implemented for API documentation and ease of integration.
- KeyCloak: Integrated for authentication and authorization.
- Infinispan: Used for distributed caching.
- Guava: Incorporated for additional utilities and collections.
- MapStruct: Used for object mapping.
- Pulsar: Chosen for its real-time messaging capabilities.
- Grafana: Utilized for monitoring and visualization of application metrics.
- Lombok: Implemented to reduce boilerplate code.
- Database:
- PostgreSQL: Selected for its reliability and performance.
- Flyway: Used for database migrations.
Deployment:
- Kubernetes (K8s): Used for container orchestration.
- Octopus, Skaffold, Helm, Ingress: Tools used for managing deployments and configurations.
Testing:
- JUnit, Testcontainers, Wiremock, Mockito: Employed for comprehensive testing and ensuring application stability.
- 3rd-party Services
- Twilio, SendGrid: Integrated for communication services.
Build Tools:
- Gradle: Used for build automation.
CI/CD:
- BitBucket Pipelines: Implemented for continuous integration and deployment.
- Repository Management: BitBucket
Results:
We provided a robust solution to connect data providers with the front end efficiently; the implementation supported the early-stage project, adding significant value and functionality; the multitenancy and real-time data handling solutions ensured the system's scalability and reliability.
Despite the technical challenges, our team successfully developed a reliable and efficient backend proxy application for the client. The project, completed within seven months, showcased our ability to adapt and innovate, ensuring the client's specific needs were met. We developed a scalable and maintainable solution that seamlessly integrates with the client’s existing systems and enhances their service offerings.