top of page


Case study
Modernizing Mission-Critical Systems for Smart Aquaculture
Plexteq partnered with a Norwegian aquatech company pioneering hydroacoustic fish monitoring, to overhaul the internal software platform powering their smart feeding systems - rebuilding microservice architecture, stabilizing distributed messaging, and modernizing DevOps practices across a cyber-physical system deployed on active salmon farms.
Project Highlights
Industry
Aquatech / Smart Aquaculture
Market
Norway
Expertise
Software Architecture DevOps & Cloud Backend Engineering
Cooperation
2023 – 2024
Technologies
Python, .NET Core (C#), Akka, RabbitMQ, Docker
Core Product
Hydroacoustic fish monitoring & adaptive feeding systems
Business Challenge
Our client is a Norwegian aquatech innovator that equips salmon and fish farms with hydroacoustic sensors, subsea cameras, and AI-driven analytics to enable real-time monitoring and adaptive, automated feeding.
Their cyber-physical platform operates 24/7 in harsh subsea environments - making system reliability, data throughput, and software quality non-negotiable. As the company scaled its deployment footprint and expanded its product offerings, the internal software platform began to show structural cracks: microservices communicated unreliably, crashes disrupted field operations, deployments were manual and error-prone, and debugging across distributed services was painfully slow due to fragmented logging.
The client engaged Plexteq - an experienced software engineering partner with a track record in complex domain-driven systems - to carry out a deep architectural overhaul and elevate engineering practices across the entire stack.
Key Challenges
Architecture &
Code Quality
↳ Ad-hoc microservice boundaries led to tight coupling and brittle integrations
↳ Inconsistent code structure across Python and C# services made onboarding slow
↳ Limited separation of concerns made features difficult to test or extend
↳ No standardized API design conventions across services
Messaging & Reliability
↳ RabbitMQ message flows were poorly structured, causing missed or duplicate events
↳ Akka actor supervision strategies were misconfigured, leading to silent failures
↳ No dead-letter queue handling, causing data loss during transient failures
↳ Recurring production crashes with no fast-recovery mechanisms
DevOps & Observability
↳ No centralized logging — debugging required SSH access across multiple nodes
↳ Dependency management was inconsistent, causing environment-specific failures
↳ No structured alerting or monitoring dashboards for operations teams
Scalability Constraints
↳ Processing pipelines blocked under high sensor data throughput
↳ Services lacked horizontal scaling capability
↳ No async processing patterns for compute-intensive acoustic signal tasks
↳ Config management was environment-specific and manually maintained
Solution Delivered
​
↳ Architectural Redesign & Code Restructuring
Plexteq's architect began with a comprehensive audit of all services, producing detailed architecture diagrams and an actionable improvement roadmap. Domain-Driven Design principles were applied to redefine service boundaries, creating clean separation between acoustic data ingestion, feeding decision logic, sensor telemetry, and UI-facing APIs. Both the Python and C# codebases were refactored around consistent layered architecture patterns, standardizing naming conventions, dependency injection, error handling, and module organization across the full stack.
​
↳ Messaging Infrastructure Overhaul
​
The RabbitMQ topology was redesigned from the ground up. Exchange and queue naming conventions were standardized, routing strategies were formalized, and dead-letter queues were introduced across all critical message flows to guarantee delivery semantics. Akka actor hierarchies were restructured with proper supervision strategies, enabling fine-grained failure isolation and automatic restart policies. Message schemas were versioned and documented, eliminating the silent schema drift that had caused data integrity issues in production.
​
↳ Reliability Engineering & Crash Elimination
Plexteq applied fail-fast and circuit-breaker patterns throughout the services to convert unhandled exceptions into observable, recoverable events rather than silent crashes. Health-check endpoints were implemented on all services and integrated with automated restart policies. Retry logic with exponential backoff was introduced for transient failures in network and messaging layers. Critical subsystems - including feeding command execution and sensor data ingestion - were given redundancy and state recovery mechanisms to maintain operation continuity during partial failures.
​
↳ Centralized Logging & Observability
A centralized structured logging infrastructure was established, aggregating logs from all Python and C# services into a single queryable system with consistent log levels, correlation IDs, and contextual metadata. This transformed incident response from hours of manual SSH triage to seconds of filtered log queries. Operational dashboards were built to surface service health metrics, queue depths, and message throughput in real time, enabling the engineering team to proactively address bottlenecks before they affected fish farm operations.
↳ Dependency Management & Build Standardization
Python dependency management was standardized using Poetry with pinned lockfiles, eliminating the environment inconsistency that had caused intermittent failures. C# projects were migrated to consistent NuGet package versions with central package management. CI pipeline steps were introduced to audit dependencies for known vulnerabilities and flag version drift. This brought the development-to-production environment gap from a chronic pain point to a non-issue.
Technology & Approach
Business Outcome
For a company whose revenue depends on continuous, fault-tolerant operation across active fish farms - where a system crash means missed feeding cycles, wasted feed, and direct impact on fish welfare and yield - software reliability is not a technical concern. It is a business imperative.
Prior to the engagement, recurring production crashes and fragmented infrastructure created compounding operational risk: field deployments were unstable, engineering velocity was constrained by technical debt, and the team lacked the observability tools needed to diagnose and resolve incidents quickly. These were not isolated engineering problems - they were factors limiting the client's ability to scale its customer base, confidently onboard new farms, and maintain the service quality standards that enterprise aquaculture operators demand.
99.9%
message delivery reliability reached
90%
less production crash incidents
hours to minutes
mean time to debug production incidents dropped
3x
improved inter-service messaging throughput
The collaboration between Plexteq and the client delivered measurable improvements across every dimension of the platform:
Measurable gains from the engagement
​
-
​​Production crash incidents were reduced by approximately 90%, directly improving fish farm operational continuity
-
Message delivery reliability reached near-100% through RabbitMQ topology redesign and dead-letter queue handling
-
Inter-service messaging throughput improved 3× after actor hierarchy restructuring and async processing adoption
-
Mean time to debug production incidents dropped from hours to minutes following centralized logging implementation
-
Development team onboarding time shortened significantly due to clean code structure, documentation, and architectural diagrams
-
Dependency issues became a solved problem, with locked environments in both Python and .NET services
bottom of page
