Back Arrow
From the blog

Performance Issues in Web Services: A Practical Guide to Identification and Resolution

Performance is not a feature to add later, but a core requirement as vital as security. This guide provides a structured approach to building performance into your web services from the start, ensuring they are fast and scalable by design.

Dmitry Bastron

Head of Development / Kentico MVP

In the realm of web development, performance is frequently treated as an afterthought—a quality to be optimised after core functionality is delivered. This approach, however, is fundamentally flawed. Performance is not a feature; it is a foundational requirement, as critical as security, accessibility, or functional correctness. Clients may not explicitly demand a response time of ‘X milliseconds,’ but they will undoubtedly express dissatisfaction if a site feels sluggish or unresponsive. This guide provides a structured approach to integrating performance thinking into the development lifecycle, ensuring that web services are robust, efficient, and scalable from the outset.

1. Integrating Performance from the Initial Stages

The most effective method for ensuring high performance is to consider it during the initial architecture and design phases. Proactive planning is exponentially more effective than reactive optimisation. When performance is an afterthought, developers often encounter deeply embedded inefficiencies that are costly and time-consuming to rectify. Common issues include components that generate excessive database queries, a lack of caching strategy, and architecture that cannot scale under load.

Treating performance as a core skill involves cultivating a mindset of constant vigilance. Developers should not engage in premature optimisation but should instead learn to identify potential bottlenecks during the design and implementation phases. This includes questioning the necessity of each database call, considering the weight of third-party scripts, and planning for caching strategies before writing the first line of code.

2. Defining Clear Performance Objectives

Vague expectations like “it should be fast” are insufficient for guiding development. Teams must establish clear, measurable performance goals. For front-end performance, metrics such as Largest Contentful Paint (LCP), Interaction to Next Paint (INP) and Cumulative Layout Shift (CLS) (collectively known as Core Web Vitals) provide a user-centric benchmark for quality.

LCP_INP_CLS
Core Web Vitals

For server-side performance, a widely accepted standard is that the backend should deliver HTML content in under 200 milliseconds for the vast majority of requests, even under typical load. This target allows sufficient time for the browser to download assets, render the page, and become interactive without frustrating the user. Establishing these benchmarks early creates a shared understanding with clients and provides a clear target for the development team.

3. Estimating and Planning for Load

A critical yet often overlooked step is estimating the expected traffic a service must handle. For existing businesses, historical data from analytics platforms (e.g., Google Analytics) is invaluable. Key metrics to analyse include:

  • The busiest month and day in terms of traffic.
  • The peak hour of activity.
  • The number of concurrent users during these peaks.

For new projects without historical data, estimation requires a dialogue with the client. Essential questions include:

  • Who is the target audience?
  • What is the expected number of daily and monthly active users?
  • What are the conversion goals (e.g., sales, sign-ups)?
  • Are there anticipated periods of high traffic, such as seasonal promotions or marketing campaigns?

With these numbers, you can build a simple chain: if the site needs to generate 10,000 enquiries per month, and the conversion rate, according to the client, is 1%, then you need about 1,000,000 sessions per month. Dividing this by days and estimating the average duration of one session is enough to roughly understand how many people might be on the site simultaneously.

For example, if there are ~33,000 sessions per day, and each lasts an average of 1 minute, then at any given time, approximately 20–30 people could be on the site concurrently. These are concurrent users—the number of sessions happening in parallel.

There's nothing complicated about this model. But if you don't build it at all, it will be difficult to explain later why the site went down during an advertising campaign or crashed on launch day. Crucially, these assumptions must be documented and discussed with the client to ensure alignment and manage expectations.

4. Proactive Identification of Bottlenecks

Waiting for a quality assurance team to discover performance issues is a high-risk strategy. Developers should adopt tools and practices for self-testing during development.

  • Local Profiling: Simple checks during development can reveal significant problems, such as pages taking tens of seconds to load or components making redundant API calls.
  • Load Testing Tools: Frameworks like K6, Gatling, or Locust allow developers to simulate virtual users and measure a system’s behaviour under load. Writing a basic test script is straightforward and can be accomplished quickly, often with the help of AI assistants.
  • Synthetic Monitoring: Running a script to crawl a site’s main pages (via its sitemap) on a “cold” startup can uncover issues with slow database queries or missing caches before they impact real users.

The goal is not to become a performance engineer but to develop a habit of verifying that one’s code behaves efficiently under expected conditions.

5. Common Sources of Performance Issues

Performance bottlenecks often originate in common, site-wide components. Identifying these early is key:

  • Global Components (Header, Footer, Navigation): Fetching this rarely changing data from a CMS or database on every page request is inefficient. This content should be heavily cached or statically generated.
  • Dynamic Elements (Breadcrumbs, User Data): Building breadcrumb trails through sequential database queries or rendering user-specific data (e.g., cart items) on the server can cripple performance. These should be optimised with pre-computation or moved to the client side where possible.
  • Search and Filtering: Implementing complex filters and search functionality with direct SQL queries is a common mistake. This is a solved problem; dedicated search engines like Elasticsearch or Algolia are designed for this purpose and offer superior performance.
  • Metadata and Redirects: Generating meta tags (e.g., for multi-language support) and processing large redirect lists on every request adds significant overhead that can be mitigated through caching.
  • Asset Optimisation: Serving unoptimised images or processing them “on-the-fly” consumes substantial resources. Images should be optimised, resized, and served in modern formats (WebP, AVIF) as part of the build process.

All these things are simply a consequence of no one thinking during implementation about how the component would behave under load. And later, it becomes a common problem. But almost always, the reason is the same: an element that should have been light turned out to be heavy, and it wasn't cached. And since it appears on many pages, everything starts to slow down.

6. Implementing a Strategic Caching Layer

Caching is the most powerful tool for improving performance and should be architectured into an application, not bolted on later.

  • CDN (Content Delivery Network): Used to cache static assets (JS, CSS, images) and even entire HTML pages at geographically distributed edge servers.
  • Output Cache: Caches the fully rendered HTML output of a page, allowing the server to bypass the entire application logic for subsequent requests. This is highly effective for pages that are the same for many users.
  • Data-Layer Cache: Stores the results of expensive database or API queries in a fast in-memory data store (like Redis), preventing repeated calls to the primary database.

A well-designed caching strategy dramatically reduces server load, decreases response times, and improves scalability. While cache invalidation can be complex, most modern web frameworks provide robust tools to manage it effectively.

7. Fostering a Culture of Performance

Ultimately, ensuring performance is not the sole responsibility of a team lead or architect; it is a collective responsibility shared by every developer. Cultivating a “performance mindset” involves:

  • Education: Ensuring all team members understand common pitfalls and best practices.
  • Tooling: Providing integrated tools for profiling and testing.

Accountability: Encouraging developers to take ownership of their code’s efficiency by asking simple questions before committing: “Are there unnecessary queries?” “Can this be cached?” “How will this behave with 100 concurrent users?”

Conclusion

Building high-performance web services is an achievable goal that requires a deliberate and proactive approach. By integrating performance considerations from the very beginning, defining clear metrics, estimating load, proactively testing for bottlenecks, and implementing a strategic caching layer, teams can deliver experiences that are not only functional but also fast and reliable. This shift from reactive fixing to proactive building is what separates adequate services from exceptional ones. In today’s competitive digital landscape, performance is not just a technical concern—it is a fundamental business imperative.

It's easy to start working with us. Just fill the brief or call us.

Find out more
White Arrow
From the blog
Related articles

Setting SMART Goals for Digital Product Success

Andrey Stepanov

This quick guide helps you define clear objectives and track progress effectively—ensuring every milestone counts.

Development

Building Teams for Digital Products: Essential Roles, Methods, and Real-World Advice

Andrey Stepanov

A digital product isn’t just about features or design—it’s about teamwork. In this article, we break down the essential roles in digital product development.

Development

Goals in Digital Development: How to Launch a Digital Product Without Failure

Andrey Stepanov

Essential tips for creating a development team that works toward product goals, not just tasks.

Development

How to Become a Kentico MVP

Dmitry Bastron

Hi, my name is Dmitry Bastron and I am The Head of Development at ByteMinds. Today I’d like to share how I achieved Kentico MVP status, why I chose this CMS, and what it takes to follow the same path and earn the coveted MVP badge.

Kentico

How can a team lead figure out a new project when nothing is clear?

Maria Serebrovskaya

Hello! My name is Maria, and I am a team lead and backend developer at ByteMinds. In this article, I will share my experience: I’ll explain how to understand a complex project, establish processes, and make it feel like "your own".

Development

How I Started Writing Unit Tests for Vue Components

Dmitry Simonov

In this article, we’ll take a look at how you can start testing Vue components.

Vue
vuejs

Inspecting raw database data in Xperience by Kentico

Dmitry Bastron

This article is a cheat sheet to inspect what's going on with the imported data by Xperience by Kentico Migration Toolkit, resolve some CI/CD issues and on many other occasions!

Kentico

Learnings from using Sitecore ADM

Anna Bastron

Let's try to understand how the ADM module works, its limitations and tactics for optimising its performance.

Sitecore

Your last migration to Xperience by Kentico

Dmitry Bastron

The more mature Xperience by Kentico product becomes, the more often I hear "How can we migrate there?”

Kentico

5 Key Software Architecture Principles for Starting Your Next Project

Andrey Stepanov

In this article, we will touch on where to start designing the architecture and how to make sure that you don’t have to redo it during the process.

Architecture
Software development

Assessing Algorithm Complexity in C#: Memory and Time Examples

Anton Vorotyncev

Today, we will talk about assessing algorithm complexity and clearly demonstrate how this complexity affects the performance of the code.

.NET

Top 8 B2B Client Service Trends to Watch in 2024

Tatiana Golovacheva

The development market today feels like a race - each lap is quicker, and one wrong move can cost you. In this race, excellent client service can either add extra points or lead to a loss dot to high competition.

Customer Service
Client Service

8 Non-Obvious Vulnerabilities in E-Commerce Projects Built with NextJS

Dmitry Bastron

Ensuring security during development is crucial, especially as online and e-commerce services become more complex. To mitigate risks, we train developers in web security basics and regularly perform third-party penetration testing before launch.

Next.js
Development

How personalisation works in Sitecore XM Cloud

Anna Bastron

In my previous article, I shared a comprehensive troubleshooting guide for Sitecore XM Cloud tracking and personalisation. This article visualises what happens behind the scenes when you enable personalisation and tracking in your Sitecore XM Cloud applications.

Sitecore

Server and client components in Next.js: when, how and why?

Sergei Pestov

All the text and examples in this article refer to Next.js 13.4 and newer versions, in which React Server Components have gained stable status and became the recommended approach for developing applications using Next.js.

Next.js

How to properly measure code speed in .NET

Anton Vorotyncev

Imagine you have a solution to a problem or a task, and now you need to evaluate the optimality of this solution from a performance perspective.

.NET

Formalizing API Workflow in .NET Microservices

Artyom Chernenko

Let's talk about how to organize the interaction of microservices in a large, long-lived product, both synchronously and asynchronously.

.NET

Hidden Aspects of TypeScript and How to Resolve Them

Dmitry Berdnikov

We suggest using a special editor to immediately check each example while reading the article. This editor is convenient because you can switch the TypeScript version in it.

TypeScript

Troubleshooting tracking and personalisation in Sitecore XM Cloud

Anna Gevel

One of the first things I tested in Sitecore XM Cloud was embedded tracking and personalisation capabilities. It has been really interesting to see what is available out-of-the-box, how much flexibility XM Cloud offers to marketing teams and what is required from developers to set it up.

Sitecore

Mastering advanced tracking with Kentico Xperience

Dmitry Bastron

We will take you on a journey through a real-life scenario of implementing advanced tracking and analytics using Kentico Xperience 13 DXP.

Kentico
Devtools

Why is Kentico of such significance to us?

Anastasia Medvedeva

Kentico stands as one of our principal development tools, we believe it would be fitting to address why we opt to work with Kentico and why we allocate substantial time to cultivating our experts in this DXP.

Kentico

Where to start learning Sitecore - An interview with Sitecore MVP Anna Gevel

Anna Gevel

As a software development company, we at Byteminds truly believe that learning and sharing knowledge is one of the best ways of growing technical expertise.

Sitecore

Sitecore replatforming and upgrades

Anastasia Medvedeva

Our expertise spans full-scale builds and support to upgrades and replatforming.

Sitecore

How we improved page load speed for Next.js ecommerce website by 50%

Sergei Pestov

How to stop declining of the performance indicators of your ecommerce website and perform optimising page load performance.

Next.js

Sitecore integration with Azure Active Directory B2C

Dmitry Bastron

We would like to share our experience of integrating Sitecore 9.3 with the Azure AD B2C (Azure Active Directory Business to Consumer) user management system.

Sitecore
Azure

Dynamic URL routing with Kontent.ai

We'll consider the top-to-bottom approach for modeling content relationships, as it is more user-friendly for content editors working in the Kontent.ai admin interface.

Kontent Ai

Headless CMS. Identifying Ideal Use Cases and Speeding Up Time-to-Market

Andrey Stepanov

All you need to know about Headless CMS. We also share the knowledge about benefits of Headless CMS, its pros and cons.

Headless CMS

Enterprise projects: what does a developer need to know?

Fedor Kiselev

Let's talk about what enterprise development is, what nuance enterprise projects may have, and which skills you need to acquire to successfully work within the .NET stack.

Development

Fixed Price, Time & Materials, and Retainer: How to Choose the Right Agreement for Your Project with Us

Andrey Stepanov

We will explain how these agreements differ from one another and what projects they are suitable for.

Customer success

Sitecore Personalize: tips & tricks for decision models and programmable nodes

Anna Gevel

We've collected various findings around decision models and programmable nodes working with Sitecore Personalize.

Sitecore

Umbraco replatforming and upgrades

Anastasia Medvedeva

Our team boasts several developers experienced in working with Umbraco, specialising in development, upgrading, and replatforming from other CMS to Umbraco.

Umbraco

Kentico replatforming and upgrades

Anastasia Medvedeva

Since 2015, we've been harnessing Kentico's capabilities well beyond its core CMS functions.

Kentico

Interesting features of devtools for QA

Egor Yaroslavcev

Chrome DevTools serves as a developer console, offering an array of in-browser tools for constructing and debugging websites and applications.

Devtools
QA

Activity logging with Xperience by Kentico

Dmitry Bastron

We'll dive into practical implementation in your Xperience by Kentico project. We'll guide you through setting up a custom activity type and show you how to log visitor activities effectively.

Kentico
This website uses cookies. View Privacy Policy.