nestjs / throttler

A rate limiting module for NestJS to work with Fastify, Express, GQL, Websockets, and RPC 🧭
https://nestjs.com
MIT License
600 stars 56 forks source link

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

Open melonges opened 2 weeks ago

melonges commented 2 weeks ago

Is there an existing issue that is already proposing this?

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

micalevisk commented 2 weeks ago

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

melonges commented 1 week ago

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

micalevisk commented 1 week ago

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