Architecture choices are rarely about fashion. They are about constraints.
A monolith can be the fastest route to a stable product. Microservices can unlock independent delivery at scale. Serverless can remove operational burden for the right workloads. Event-driven systems can decouple teams and processes, but they can also make debugging harder if observability and ownership are weak.
The mistake is treating architecture as a maturity ladder: start with a monolith, graduate to microservices, then become cloud native. Real systems do not work that neatly. The right architecture depends on your domain, team structure, delivery model, operational maturity, security requirements, cost profile, and tolerance for distributed complexity.
For CIOs, CTOs, and engineering leaders, the question is not which architecture is modern. It is which architecture gives the organisation the best operating model for the business it actually runs.
Architecture is an operating decision
Application architecture shapes far more than code. It affects how teams collaborate, how releases are planned, how incidents are diagnosed, how security boundaries are enforced, how costs scale, and how quickly the business can change direction.
This is why architecture decisions should not sit only inside engineering. They sit at the intersection of product strategy, delivery governance, risk, finance, and operations.
At Westpoint, we often see architecture choices become expensive when they are made too early, too abstractly, or too far away from delivery reality. A system can look elegant on a diagram and still create daily friction for teams trying to release, observe, secure, and support it.
Our cloud consultancy work starts from that practical view: architecture has to produce measurable outcomes, not just technical alignment.
The monolith is not the enemy
A monolithic application packages core functionality into a single deployable unit. That does not automatically mean it is badly designed.
A well-structured monolith can have clear modules, strong domain boundaries, clean interfaces, automated tests, and a disciplined release process. For many organisations, that is a better starting point than a distributed architecture with weak ownership and immature operations.
A monolith is often a strong fit when:
- the product domain is still changing quickly
- the team is small or centralised
- transaction boundaries are tightly coupled
- deployment frequency is moderate
- operational simplicity matters more than independent scaling
- the organisation has not yet invested in platform engineering, observability, and DevOps maturity
The main advantage is cognitive and operational simplicity. Developers can reason about the system in one place. Local development is easier. Testing is usually simpler. Transaction management is less fragmented. Deployment is more direct.
The risk is that the monolith becomes a big ball of mud. This happens when internal boundaries are weak, domain concepts are poorly modelled, and teams treat the application as a shared dumping ground. Over time, releases slow down because everything depends on everything else.
The right response is not always to split the system. Often, the first move is to modularise the monolith: separate domains, clean up dependencies, strengthen test coverage, and introduce clearer ownership before introducing network boundaries.
A poorly structured monolith does not become a good architecture simply by being distributed.
Microservices solve team and scaling problems, not general complexity
Microservices split an application into independently deployable services aligned to business capabilities. Martin Fowler's microservices guide remains useful because it frames microservices as an architectural style, not a product you install.
Microservices can be valuable when the organisation genuinely needs independent change.
They are often a good fit when:
- different domains change at different speeds
- teams need independent deployment ownership
- parts of the system have distinct scaling profiles
- reliability isolation is important
- the domain boundaries are well understood
- the organisation can support distributed operations
The benefits are real. A payments team can release without waiting for a catalogue team. A high-volume ingestion service can scale independently from an admin portal. A failing recommendation service can be isolated from the checkout path.
But those benefits come with operational cost.
Microservices introduce distributed failure modes, network latency, API versioning, service discovery, data consistency challenges, observability requirements, deployment orchestration, contract testing, and more complicated incident response. They require strong engineering discipline. Without that foundation, they often slow teams down.
The failure mode is familiar: an organisation decomposes a monolith into services, but keeps the same centralised decision-making, the same shared database mindset, the same manual release process, and the same limited observability. The result is not agility. It is a distributed monolith with higher cloud spend.
This is why architecture has to match operating maturity. Microservices are not just a code structure. They are a delivery model.
The modular monolith deserves more attention
Between the traditional monolith and microservices sits a valuable option: the modular monolith.
A modular monolith keeps one deployable application but enforces strong internal boundaries. Each module owns a domain capability. Dependencies are controlled. Data access patterns are explicit. Interfaces between modules are treated seriously, even though calls happen in process rather than over the network.
This pattern is often underused because it sounds less exciting than microservices. In practice, it can be one of the best architectures for organisations that need speed without distributed overhead.
A modular monolith can provide:
- clearer domain ownership
- simpler deployment
- easier local development
- lower operational overhead
- a cleaner path to future service extraction
- better control over transactions and consistency
It is especially useful when the organisation knows it may eventually need microservices but does not yet have enough domain stability to split safely.
Think of it as architectural optionality. You avoid premature distribution while still designing boundaries that can become service boundaries later.
Serverless changes the unit of ownership
Serverless architecture moves more operational responsibility to the cloud provider. Functions, managed databases, queues, event buses, object storage, workflow engines, and API gateways can combine to form highly scalable systems with less infrastructure management.
This does not remove architecture work. It changes where the architecture work sits.
Serverless systems require careful thinking about event flows, permissions, cold starts, retries, idempotency, observability, cost per execution, regional resilience, and local development. They can be extremely effective for event-driven workflows, APIs with variable traffic, data processing, automation, and integration-heavy workloads.
They are less suitable when workloads require long-running compute, highly specialised runtime control, predictable always-on capacity, or complex low-latency interactions across many functions.
Serverless is often a good fit when:
- traffic is bursty or unpredictable
- the workload is event-driven
- teams want to reduce infrastructure management
- speed of delivery matters
- managed services fit the compliance and operational model
- cost can be monitored at workload level
Westpoint has written separately about the difference between serverless architecture and microservices. The important point is that serverless is not a replacement for architecture. It is a different set of trade-offs.
Event-driven architecture is powerful, but harder to see
Event-driven architecture uses events to communicate that something has happened: an order was placed, a payment was authorised, a vehicle inspection was completed, a document was uploaded.
This can reduce coupling between systems. Producers do not need to know exactly who consumes the event. Consumers can react independently. New capabilities can be added without changing the original transaction path.
Event-driven architecture is useful for:
- workflow automation
- integration between systems
- audit trails
- asynchronous processing
- IoT and telemetry
- analytics pipelines
- decoupling high-volume workloads
The trade-off is visibility. Event-driven systems can become difficult to understand if events are poorly named, schemas are not governed, retries are inconsistent, and tracing is weak. Business users may ask where a customer record is, and the answer may involve five services, two queues, a stream processor, and a dead-letter queue.
That is manageable with the right controls. It is painful without them.
Event-driven architecture should be designed with schema governance, event ownership, replay strategy, observability, and failure handling from the start.
A practical decision framework
The best architecture choice usually comes from asking grounded questions:
- Is the domain stable enough to split?
- Do teams genuinely need independent deployment?
- Is operational maturity strong enough for distributed systems?
- Do different parts of the system have different scaling or resilience needs?
- Can services own their own data?
- Can the organisation support the architecture in production?
This prevents the most common mistake: choosing an architecture before understanding the forces acting on the system.
Start with domain boundaries
Good architecture follows the business domain. If teams cannot describe the business capabilities clearly, service boundaries will be arbitrary.
Before splitting anything, map the domain:
- What are the core business concepts?
- Which capabilities change independently?
- Where are the natural ownership lines?
- Which processes require strong consistency?
- Which workflows can be asynchronous?
- Which systems are sources of truth?
Domain modelling is often a better first investment than infrastructure change. It reveals whether the problem is architectural or simply organisational confusion expressed in code.
Match architecture to team topology
Architecture and team structure are connected. If five teams deploy to one application with constant merge conflicts, a modular or service-based structure may help. If one small team owns the whole product, microservices may add overhead without improving delivery.
Ask:
- Can teams own services end to end?
- Do they have production support responsibility?
- Can they make local decisions without central approval?
- Are platform capabilities available?
- Is there a clear service catalogue and ownership model?
If the answer is no, microservices may expose organisational weaknesses rather than solve them.
Be honest about operational maturity
Distributed systems need strong foundations. At minimum, teams need automated CI/CD, infrastructure as code, centralised logging, metrics and tracing, alerting tied to service-level objectives, secrets management, automated testing, API contract discipline, incident response processes, and cost visibility by workload or team.
The AWS Well-Architected Framework is useful here because it pushes teams to examine operational excellence, security, reliability, performance efficiency, cost optimisation, and sustainability as part of architecture.
The framework is not only for AWS workloads. The questions behind it are relevant to most cloud architectures.
Consider data before compute
Many architecture debates focus on services, containers, and functions. The harder issue is usually data.
Can each service own its own data? Do teams understand eventual consistency? Are reporting needs dependent on cross-domain joins? How will data be reconciled? What happens when an event is processed twice? What is the recovery model?
Microservices with a shared database rarely deliver true independence. Serverless workflows without idempotency can create duplicated side effects. Event streams without schema governance become fragile integration points.
Data ownership should be decided early because it determines how much independence the architecture can really provide.
Model cost as architecture
Architecture creates cost behaviour.
A monolith may be cheaper to run but harder to scale selectively. Microservices may improve scaling precision but increase platform, observability, and network costs. Serverless may be cost-effective for variable workloads but expensive for high-volume, always-on processing if poorly designed.
Cost should not be bolted on after launch. It should be part of architecture review:
- What are the cost drivers?
- Which workloads scale with users, transactions, data, or time?
- Can costs be attributed to teams or products?
- What happens at 10x traffic?
- Which managed services introduce lock-in or premium pricing?
- How will unused capacity be detected?
In our cloud architecture and development work, we treat cost, security, resilience, and operability as design constraints from the start.
Common failure modes
The wrong architecture usually fails in predictable ways.
Premature microservices
Teams split too early, before domain boundaries are stable. Every feature requires changes across multiple services. The organisation gets the cost of distribution without the benefit of autonomy.
The distributed monolith
Services exist, but they share databases, release together, rely on synchronous chains, and require coordinated changes. The system looks modern but behaves like a monolith with more failure modes.
Platform afterthought
Teams adopt microservices or serverless before investing in CI/CD, observability, infrastructure as code, security automation, and developer experience. Delivery slows because every team solves the same operational problems differently.
Security boundary confusion
Service boundaries are mistaken for security boundaries. Authentication, authorisation, secrets, network controls, and audit trails are added inconsistently. This becomes painful during compliance reviews or incidents.
Ignoring legacy integration
New architecture is designed as if legacy systems do not exist. In reality, the value often depends on integrating with ERP, CRM, identity, finance, operational, or field systems. Integration constraints can dominate the architecture.
The Belron case study is a useful example of modern platform delivery shaped around operational reality rather than abstract architecture preference.
Choosing what to do next
For many organisations, the best next step is not a grand re-platforming programme. It is a structured architecture assessment tied to delivery outcomes.
A practical roadmap might look like this:
- Map the current system boundaries, data flows, and deployment process.
- Identify the real bottlenecks: release risk, cost, scaling, reliability, team ownership, or integration friction.
- Define target business capabilities and ownership lines.
- Decide which parts should remain monolithic, become modular, move to managed services, or be extracted.
- Strengthen platform foundations before increasing distribution.
- Migrate incrementally using strangler patterns, event bridges, APIs, or parallel run models.
- Measure outcomes through deployment frequency, lead time, incident rate, cost per workload, and business cycle time.
The right architecture is usually hybrid. A single organisation may run a modular core platform, a few microservices around high-change domains, serverless workflows for automation, and event streams for integration.
That is not inconsistency. It is architecture matching workload reality.
Final thought
The best architecture is the one your organisation can build, operate, secure, and evolve with confidence.
A monolith is not a failure. Microservices are not a badge of maturity. Serverless is not a shortcut around design. Event-driven architecture is not free decoupling.
Each option gives you something and asks for something in return. The work is to understand that exchange before committing to it.
For leaders, the goal should be architectural optionality: create systems with clear boundaries, strong operational foundations, measurable cost behaviour, and enough flexibility to change direction as the business learns. That is what turns architecture from a technical preference into a business capability.



