Overview
A major port logistics operator needed to retire a 20–25 year-old platform — a C-based backend monolith with a C# desktop client — and replace it with a modern web platform capable of managing the full naval logistics lifecycle: ship scheduling, voyage planning, passenger and freight bookings, payment processing, and fleet management.
The goal went beyond a technical rewrite. The business required proper role-based access control, full feature parity with the AS-IS system, faster delivery cycles (no more hard recompilation), and reduced regression risk — all while remaining backward-compatible with the existing AS400/DB2 data source that the legacy system continued to use throughout the transition.
Challenge
The fundamental performance challenge was unavoidable: a C application is inherently faster than a Java microservices architecture. The new platform could not beat the raw execution speed of the legacy system — it had to keep up by leveraging parallelism and async processing wherever the domain allowed.
Backward compatibility was the second defining constraint. The legacy system and the new platform shared the same DB2 data source throughout the migration. Every new service had to produce and consume data in a form both systems could understand simultaneously, making retro-compatibility non-negotiable at every step.
Solution
-
Domain boundaries first — before writing a single service, we mapped clear responsibility boundaries across the platform. Without well-defined ownership, introducing async communication between services would have created more coupling, not less.
-
Event-driven choreography — every CRUD operation emitted a domain event via Apache Kafka. Services reacted to those events asynchronously, decoupling lifecycles without tight runtime dependencies between them.
-
RBAC via Azure AD — user roles and group membership were managed through Azure Active Directory, providing fine-grained access control fully integrated with the client’s existing identity infrastructure.
-
Azure-native integration — the platform was built around Azure services throughout: Service Bus for reliable messaging, Blob Storage for document management, API Gateway for routing and rate-limiting, and Azure Monitor for centralised log aggregation.
-
React micro-frontend — the new web interface was composed of independently deployable React micro-frontends, replacing the C# desktop client without requiring a big-bang release.
-
Blue/green deployment — zero-downtime rollouts were achieved through a blue/green deployment strategy, allowing traffic to shift progressively between versions with instant rollback capability.
Outcome
- 99.98% uptime maintained under production load — a direct result of the quality assurance processes and monitoring infrastructure built from the ground up
- 3× reduction in average monthly production incidents since modernisation, with the trend still declining as the new architecture matures
- Incident isolation by design — the modular service boundary means a failure in one component stays contained; no single failure can cascade across the platform
- Teams ship features independently without coordinating monolithic releases or running full regression cycles
- Zero downtime maintained across the entire migration via blue/green deployment
- Full observability with Dynatrace: distributed traces, metrics collection, and custom alerts for any unexpected production behaviour