nestjs / throttler

A rate limiting module for NestJS to work with Fastify, Express, GQL, Websockets, and RPC 🧭

Home Page:https://nestjs.com

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

Performance Improvement: use `Map` for storage in `ThrottlerStorageService`

melonges opened this issue · comments

Is there an existing issue that is already proposing this?

  • I have searched the existing issues

Is your feature request related to a problem? Please describe it

The current implementation of the ThrottlerStorageService uses a plain JavaScript object Record<string, ThrottlerStorageOptions> like key value storage. Replacing the plain object with a Map could yield significant performance improvements due to the optimized key-value operations provided by the Map data structure.

Describe the solution you'd like

use Map like key value storage Instead of plain JS object in this place https://github.com/nestjs/throttler/blob/master/src/throttler.service.ts#L11

Teachability, documentation, adoption, migration strategy

proofs: https://www.zhenghao.io/posts/object-vs-map and https://stackoverflow.com/questions/18541940/map-vs-object-in-javascript

What is the motivation / use case for changing the behavior?

because this is a highload service and speeding up read and write operation to storage would be a nice performance improvement

I agree with the change. But since ThrottlerStorageService is a public API, we can't change the return type of get storage for now otherwise we'll introduce a breaking change

Just keep in mind that the performance depends on how your app is using it. I saw several benchmarks where access to a plain object were faster. Sometimes Map was faster. Maybe this could change in future releases of v8 idk

I agree with the change. But since ThrottlerStorageService is a public API, we can't change the return type of get storage for now otherwise we'll introduce a breaking change

Just keep in mind that the performance depends on how your app is using it. I saw several benchmarks where access to a plain object were faster. Sometimes Map was faster. Maybe this could change in future releases of v8 idk

Since Map is also an object, it can be written and accessed via the [] operator. The only problem is that the keys written inside ThrottlerStorageService will not be accessible from the outside

Would you like to create a PR to address this issue?