# Node.js service performance, measured

Source: https://imqueue.org/blog/topics/performance/

Measured performance work on Node.js services: benchmarked queue throughput, what each cache invalidation strategy costs, one GraphQL query that became twenty-six service calls, and autoscaling on backlog rather than CPU.

5 articles tagged `performance`, newest first.

- [Checking an IP against 10,000 networks without comparing it to 10,000 networks](https://imqueue.org/blog/ip-allow-lists-cidr-nodejs/) — 2026-08-28, Mykhailo Stadnyk: Every request asks the same question — is this one of ours? — and the loop you wrote to answer it gets slower every time someone adds a partner range. Here is how to answer it in logarithmic time instead, what an address really is once you stop treating it as a string, and the quiet precondition that a fast implementation must uphold or it will lie to you. — [markdown](https://imqueue.org/blog/ip-allow-lists-cidr-nodejs/index.md)
- [Autoscale on queue depth, not CPU](https://imqueue.org/blog/autoscaling-nodejs-services-on-queue-depth/) — 2026-08-22, Mykhailo Stadnyk: CPU tells you a process is busy, not whether anyone is waiting. An @imqueue service's backlog is a Redis list, so KEDA can scale on it with no exporter, no Prometheus and no code change — and the metrics server covers the case where you need more. — [markdown](https://imqueue.org/blog/autoscaling-nodejs-services-on-queue-depth/index.md)
- [Cache invalidation across services: a TTL, a tag, or the database](https://imqueue.org/blog/cache-invalidation-nodejs-microservices/) — 2026-08-18, Mykhailo Stadnyk: Caching a service method is one decorator. Deciding when the entry dies is the whole job. Here are the three mechanisms measured — a guessed TTL, a tag invalidated by an event, and PostgreSQL dropping the entry 6ms after the row changes — plus the four ways a cache goes on serving data it already knows is stale, and a fifth that got fixed while this was being written. — [markdown](https://imqueue.org/blog/cache-invalidation-nodejs-microservices/index.md)
- [The N+1 problem when GraphQL resolvers call microservices](https://imqueue.org/blog/graphql-n-plus-1-microservices/) — 2026-08-14, Andrii Glushko: A field resolver runs once per parent object. Put a service call inside it and one innocent-looking query becomes twenty-six. Here is the same query measured at 26 calls and at 3, why your latency chart will not show you the difference, and the two ways the fix comes back silently empty. — [markdown](https://imqueue.org/blog/graphql-n-plus-1-microservices/index.md)
- [Benchmarking @imqueue: throughput and delivery modes](https://imqueue.org/blog/benchmarking-imqueue-throughput/) — 2026-06-07, Mykhailo Stadnyk: Real measured throughput for @imqueue's message queue — ~200k msg/sec unreliable, ~120k guaranteed on a 24-core box — what the delivery modes cost, and a reproducible harness to measure the figures that matter: yours. — [markdown](https://imqueue.org/blog/benchmarking-imqueue-throughput/index.md)

## Other topics

- [Message queues](https://imqueue.org/blog/topics/queue/) — 16 articles
- [RPC](https://imqueue.org/blog/topics/rpc/) — 13 articles
- [Architecture](https://imqueue.org/blog/topics/architecture/) — 11 articles
- [Patterns](https://imqueue.org/blog/topics/patterns/) — 10 articles
- [Comparisons](https://imqueue.org/blog/topics/comparison/) — 9 articles
- [Developer experience](https://imqueue.org/blog/topics/dx/) — 8 articles
- [Type safety](https://imqueue.org/blog/topics/types/) — 7 articles
- [Resilience](https://imqueue.org/blog/topics/resilience/) — 6 articles
- [Transports](https://imqueue.org/blog/topics/transport/) — 6 articles
- [Message delivery](https://imqueue.org/blog/topics/delivery/) — 5 articles
- [Typed clients](https://imqueue.org/blog/topics/clients/) — 4 articles
- [Jobs & scheduling](https://imqueue.org/blog/topics/jobs/) — 4 articles

All articles: [https://imqueue.org/blog/](https://imqueue.org/blog/) — [markdown](https://imqueue.org/blog/index.md)

