Challenges of a microservice architecture

July 25, 2024

Challenges of a microservice architecture

Ready to start?

What is a Microservice Architecture?

As the name suggests, microservices break up an application (called a monolith) into many smaller parts. Each of these microservices are then deployed and run separately. This practice originated at Amazon where the idea was to break a large monolithic application into what Amazon’s CTO Werner Vogels called “mini services”. The reason for this was to make development cycles faster, letting teams choose their tools and infrastructure, with the thought smaller teams will be more agile and that if there are well-designed interfaces between the microservices, it will all work well. 

The rise of microservices, along with the devops, came with the promise of agility, but had also created a lot of complexity, lost productivity, cognitive load and inefficiencies. These are where the promise of microservices also creates many challenges. Before we go into the challenges, let’s examine the benefits of a microservice architecture.

What are the benefits of a microservice architecture?

A microservice architecture releases engineering organizations from the lengthy deployment cycles that are part and parcel of having large application monoliths. They allow work in smaller teams with greater flexibility and choice of tools, and as a result, change happens faster.

If done well, the benefits of a microservice architecture are as follows:

  • Faster time to market: microservices architectures are more agile, since it’s easier for a small team to develop and understand a microservice, by virtue of its size and relative simplicity. Microservices are also easier to deploy and manage. As a result, once the move to a microservice architecture is made, teams that they ship software faster.
  • Better engineering resilience: with a microservices architecture it is easier to isolate problems down to a specific microservice, reducing MTTR and making on-call triage much easier.
  • Better engineering practices through reusability of elements and clear stadnards for production readiness, AppSec and how the microservices connect
  • Better scalability, since microservices run separately and scaling can be done in a more efficient manner.
  • Better innovation through agility and speed.

However, microservices also pose some significant challenges that are not trivial. Let’s examine them.

Common challenges of a microservice architecture

In general the fact that microservices are distributed and that teams have autonomy over how they are developers and deployed, poses a set of challenges. There are many potential breaking points, from the inability of other teams to understand which microservices are available and how they are connected, to issues understanding dependencies and interfaces between the microservices, issues related to environments, adherence with standards and more. 

A microservice architecture may be more challenging for developers. 

  • There is a knowledge gap. If developers are required to be aware of more technologies for the delivery of microservices, such as K8s knowledge, an understanding of production readiness, managing cloud costs, feature flags and more, the fact that they don’t know all that and that there are no golden paths leads to loss of productivity.
  • There is a discoverability issue: if developers can’t find microservices, standards, APIs, cloud assets, or know what lies where, they may waste time just understanding what is going on, as well as potentially duplicate work unnecessarily.
  • There is a devops or ticketops issue: If the microservices architecture means that DevOps, SRE or other support is often needed, ad-hoc and that it takes time to be done, developer velocity is adversely impacted. 

In short, microservices architecture challenges can be summarized as follows:

  • Code duplication and redundancies: This issue arises when similar or identical code is scattered across multiple parts of the distributed application, leading to increased maintenance efforts and higher risk of inconsistencies and bugs as well as duplication of wrong or faulty code.
  • Developer cognitive load: Excessive cognitive load occurs when developers are overwhelmed by too many simultaneous demands on their attention and memory, related to navigation of cloud native microservice environments. 
  • Developer lack of knowledge: Developers may struggle with insufficient understanding of the codebase, tools, or technologies they are working with, which can lead to inefficient problem-solving and slower development cycles as well as standards non compliance.
  • Difficulty upholding standards and compliance: Ensuring that all code adheres to organizational standards and regulatory compliance can be challenging, especially in large teams or complex projects, potentially resulting in reliability issues, a poor Appsec posture or cost overruns.
  • Repetitive manual DevOps work: Many DevOps tasks are manual and repetitive, such as setting up environments or deploying applications, which can be time-consuming and prone to human error, reducing overall efficiency.
  • Inability to understand dependencies: Without clear visibility into the dependencies between various components of a system, developers can struggle to predict the impact of changes, leading to integration issues and system failures.
  • Taking too long to understand and search for data: Developers often spend significant time searching for the right information or understanding complex data structures, which slows down their progress and hampers decision-making.
  • Security posture degradation: Security can deteriorate when there is a lack of consistent enforcement of security practices, leaving systems vulnerable to attacks and data breaches.
  • Reliability issues: Maintaining system reliability is challenging when there are frequent outages or performance problems, which can erode user trust and lead to loss of revenue.

Overcoming microservices challenges with internal developer portals

The challenges presented by microservices architectures are prevalent in many engineering organizations. DevOps promised agility that would solve many of these challenges and enable microservice architectures, but in real life, developers can be overwhelmed.

Platform engineering is about creating reusable self-service actions for developers. The core idea around platform engineering is the creation of developer self-service golden paths which are a simple and opinionated way to perform actions such as scaffold a microservice, change it, delete it, create an ephemeral environment, ensure Appsec compliance and more.

The internal developer portal is how developers access the internal developer platform - it’s an interface and central hub for developers and managers, letting them:

  • Perform self-service actions
  • Understand the enterprise architecture
  • Adhere to standards and enforce them
  • Track engineering metrics and standards compliance with dashboards

Here’s a deeper dive of how the different pillars of the internal developer portal help overcome these challenges:

Golden paths

Golden paths: the internal developer portal supports developer self-service, created golden paths for developers that abstract the cognitive load associated with many actions, from setting up temporary environments, asking for database access, scaffolding a microservice and more. A golden path is an opinionated and simple way to perform an action, which will make the action standards compliant and reduce cognitive load. Golden paths are also highly relevant for day-2 operations on microservices too and are even relevant to requesting just in time permissions.

Microservice catalog

The Microservice catalog is at the center of the internal developer portal. It essentially consolidates all the microservice architecture information, from services, through CI/CD, AppSec and cost data, cloud resources, databases and more. Since it usually contains much more than just microservice data, it is really a software catalog. To make the microservice catalog useful for developers it’s important to not dump all the aforementioned data into the portal’s catalog, since it won’t relieve cognitive load but rather increase it. The idea of abstracting the data for developers is important, since we need to show them what they need in a way they can use, from showing them API catalog data to kubernetes standards compliance and more. 

Scorecards and standards compliance

One of the big issues around microservices architecture is standards compliance. If we let developers run loose they may be quick but standards won’t be met. On the other hand, if we force developers to wait for SREs, AppSec reviews etc, they will be slowed down. The internal developer portal - and the software catalog at its center - are uniquely positioned to solve this conundrum. Not only do developers set up software catalog entities with golden paths, which have baked-in standards, but they can also track standards over time, using scorecards, which can be set for any software catalog entity, not just services. The result is an ability for managing standards for microservices. The result is that instead of tracking standards manually, a system for alerting on standards degradation and setting up initiatives can be set up quickly, saving time and frustration. 

Observability and dashboards

Internal developer portals also include dashboards that serve different personas, from SREs through DevSecOps, FinOps and engineering management. This provides personalized experience that show metrics, relevant self-service actions, context, standards and more. 

Engineering metrics

Dashboards can also be used to track engineering metrics, containing both the classic software engineering metrics made available in software engineering intelligence platforms as well as DORA metrics and SPACE. Additional metrics can be associated with understanding developer workflows as well as general standards and productivity metrics.

Internal developer portals are the mainstay of platform engineering and are set to be the future of how developers work. Our live demo can show you more use cases of how to use portals and benefit from them.

{{cta_1}}

Check out Port's pre-populated demo and see what it's all about.

Check live demo

No email required

{{cta_2}}

Contact sales for a technical product walkthrough

Let’s start
{{cta_3}}

Open a free Port account. No credit card required

Let’s start
{{cta_4}}

Watch Port live coding videos - setting up an internal developer portal & platform

Let’s start
{{cta_5}}

Check out Port's pre-populated demo and see what it's all about.

(no email required)

Let’s start
{{cta_6}}

Contact sales for a technical product walkthrough

Let’s start
{{cta_7}}

Open a free Port account. No credit card required

Let’s start
{{cta_8}}

Watch Port live coding videos - setting up an internal developer portal & platform

Let’s start
{{cta-demo}}
{{reading-box-backstage-vs-port}}

Example JSON block

{
  "foo": "bar"
}

Order Domain

{
  "properties": {},
  "relations": {},
  "title": "Orders",
  "identifier": "Orders"
}

Cart System

{
  "properties": {},
  "relations": {
    "domain": "Orders"
  },
  "identifier": "Cart",
  "title": "Cart"
}

Products System

{
  "properties": {},
  "relations": {
    "domain": "Orders"
  },
  "identifier": "Products",
  "title": "Products"
}

Cart Resource

{
  "properties": {
    "type": "postgress"
  },
  "relations": {},
  "icon": "GPU",
  "title": "Cart SQL database",
  "identifier": "cart-sql-sb"
}

Cart API

{
 "identifier": "CartAPI",
 "title": "Cart API",
 "blueprint": "API",
 "properties": {
   "type": "Open API"
 },
 "relations": {
   "provider": "CartService"
 },
 "icon": "Link"
}

Core Kafka Library

{
  "properties": {
    "type": "library"
  },
  "relations": {
    "system": "Cart"
  },
  "title": "Core Kafka Library",
  "identifier": "CoreKafkaLibrary"
}

Core Payment Library

{
  "properties": {
    "type": "library"
  },
  "relations": {
    "system": "Cart"
  },
  "title": "Core Payment Library",
  "identifier": "CorePaymentLibrary"
}

Cart Service JSON

{
 "identifier": "CartService",
 "title": "Cart Service",
 "blueprint": "Component",
 "properties": {
   "type": "service"
 },
 "relations": {
   "system": "Cart",
   "resources": [
     "cart-sql-sb"
   ],
   "consumesApi": [],
   "components": [
     "CorePaymentLibrary",
     "CoreKafkaLibrary"
   ]
 },
 "icon": "Cloud"
}

Products Service JSON

{
  "identifier": "ProductsService",
  "title": "Products Service",
  "blueprint": "Component",
  "properties": {
    "type": "service"
  },
  "relations": {
    "system": "Products",
    "consumesApi": [
      "CartAPI"
    ],
    "components": []
  }
}

Component Blueprint

{
 "identifier": "Component",
 "title": "Component",
 "icon": "Cloud",
 "schema": {
   "properties": {
     "type": {
       "enum": [
         "service",
         "library"
       ],
       "icon": "Docs",
       "type": "string",
       "enumColors": {
         "service": "blue",
         "library": "green"
       }
     }
   },
   "required": []
 },
 "mirrorProperties": {},
 "formulaProperties": {},
 "calculationProperties": {},
 "relations": {
   "system": {
     "target": "System",
     "required": false,
     "many": false
   },
   "resources": {
     "target": "Resource",
     "required": false,
     "many": true
   },
   "consumesApi": {
     "target": "API",
     "required": false,
     "many": true
   },
   "components": {
     "target": "Component",
     "required": false,
     "many": true
   },
   "providesApi": {
     "target": "API",
     "required": false,
     "many": false
   }
 }
}

Resource Blueprint

{
 “identifier”: “Resource”,
 “title”: “Resource”,
 “icon”: “DevopsTool”,
 “schema”: {
   “properties”: {
     “type”: {
       “enum”: [
         “postgress”,
         “kafka-topic”,
         “rabbit-queue”,
         “s3-bucket”
       ],
       “icon”: “Docs”,
       “type”: “string”
     }
   },
   “required”: []
 },
 “mirrorProperties”: {},
 “formulaProperties”: {},
 “calculationProperties”: {},
 “relations”: {}
}

API Blueprint

{
 "identifier": "API",
 "title": "API",
 "icon": "Link",
 "schema": {
   "properties": {
     "type": {
       "type": "string",
       "enum": [
         "Open API",
         "grpc"
       ]
     }
   },
   "required": []
 },
 "mirrorProperties": {},
 "formulaProperties": {},
 "calculationProperties": {},
 "relations": {
   "provider": {
     "target": "Component",
     "required": true,
     "many": false
   }
 }
}

Domain Blueprint

{
 "identifier": "Domain",
 "title": "Domain",
 "icon": "Server",
 "schema": {
   "properties": {},
   "required": []
 },
 "mirrorProperties": {},
 "formulaProperties": {},
 "calculationProperties": {},
 "relations": {}
}

System Blueprint

{
 "identifier": "System",
 "title": "System",
 "icon": "DevopsTool",
 "schema": {
   "properties": {},
   "required": []
 },
 "mirrorProperties": {},
 "formulaProperties": {},
 "calculationProperties": {},
 "relations": {
   "domain": {
     "target": "Domain",
     "required": true,
     "many": false
   }
 }
}
{{tabel-1}}

Microservices SDLC

  • Scaffold a new microservice

  • Deploy (canary or blue-green)

  • Feature flagging

  • Revert

  • Lock deployments

  • Add Secret

  • Force merge pull request (skip tests on crises)

  • Add environment variable to service

  • Add IaC to the service

  • Upgrade package version

Development environments

  • Spin up a developer environment for 5 days

  • ETL mock data to environment

  • Invite developer to the environment

  • Extend TTL by 3 days

Cloud resources

  • Provision a cloud resource

  • Modify a cloud resource

  • Get permissions to access cloud resource

SRE actions

  • Update pod count

  • Update auto-scaling group

  • Execute incident response runbook automation

Data Engineering

  • Add / Remove / Update Column to table

  • Run Airflow DAG

  • Duplicate table

Backoffice

  • Change customer configuration

  • Update customer software version

  • Upgrade - Downgrade plan tier

  • Create - Delete customer

Machine learning actions

  • Train model

  • Pre-process dataset

  • Deploy

  • A/B testing traffic route

  • Revert

  • Spin up remote Jupyter notebook

{{tabel-2}}

Engineering tools

  • Observability

  • Tasks management

  • CI/CD

  • On-Call management

  • Troubleshooting tools

  • DevSecOps

  • Runbooks

Infrastructure

  • Cloud Resources

  • K8S

  • Containers & Serverless

  • IaC

  • Databases

  • Environments

  • Regions

Software and more

  • Microservices

  • Docker Images

  • Docs

  • APIs

  • 3rd parties

  • Runbooks

  • Cron jobs

Starting with Port is simple, fast and free.

Let’s start