Skip to main content


Showing posts from December, 2023

Case study: Design a solution for long-running requests

Greetings As developers, we often aim to deliver APIs with minimal latency, typically in just a few milliseconds. However, it's important to acknowledge that not all customer requirements are alike. There are scenarios where we must tackle intricate computations that can extend over many minutes. Let's explore solutions for addressing such use cases. Problem statement The user expects to view the outcome of a complex computation, which requires more than 5 minutes to complete. Initial design We can outline our initial architecture by offering either a REST or GraphQL API that waits for the computation to conclude. The primary limitation of this design is that it blocks the server thread, which can lead to the exhaustion of server resources. Additionally, the user remains uninformed about the ongoing process. Improving with an Async Job and Polling Rather than waiting for the calculation to complete, we can utilize a separate thread and promptly return from the initial request.

Enhancing Node.js Microservices Performance through Connection Keep-Alive

Greetings! Efficient performance is a crucial non-functional requirement in modern applications. Customers can become easily frustrated and may seek alternative solutions if performance falls short. As developers, it is our responsibility to ensure that performance meets the required standards. I'd like to highlight a common mistake that developers might make if they are not familiar with the underlying theory. While the focus here is primarily on Node.js, the principles apply more broadly. Microservices leverage diverse technologies, and Node.js is a good candidate for API Gateways/ Proxy servers. These gateways play a key role in routing traffic to the underlying downstream microservices. Understanding this dynamic is both interesting and essential when working with Node.js. Note: In Node.js 19, agent keep-alive is now enabled by default. The Problem When incorporating libraries, developers often stick to default configurations or modify only the apparent settings. This approac