@sitapati/ratelimiter
TypeScript icon, indicating that this package has built-in type declarations

1.0.3 • Public • Published

Rate Limiter

A functional rate limiter to avoid saturating external resources.

Install

npm i @sitapati/ratelimiter

Usage

The following example executes ten REST calls with 500ms between each call.

import { RateLimiter } from "@sitapati/ratelimiter"

const limit = new RateLimiter(500)

for (let i = 0; i < 10; i++) { 
    limit.runRateLimited({ 
        task: () => RESTcall(req)
    })
    .catch(console.error)
    .then(console.log)
}

You can mark a task as preemptible. This is useful when you have some calls that should take a higher priority - for example, tasks that impact user feedback. In this case, you would mark your low-priority (like async service calls for the backend) as preemptible:

limit.runRateLimited({
    task: () => backgroundTask(req),
    preemptible: true
})

limit.runRateLimited({
    task: () => foregroundTask(req)
})

Preventing preemptible queue starvation

To prevent preemptible queue starvation - where only priority queue tasks are processed and no preemptible tasks ever get serviced under load - there is an optional second parameter to the constructor.

This is the ratio - it is 3 by default. Under load, three priority tasks will be processed, then a task will be processed from the preemptible task queue.

Readme

Keywords

none

Package Sidebar

Install

npm i @sitapati/ratelimiter

Weekly Downloads

2

Version

1.0.3

License

none

Unpacked Size

18.1 kB

Total Files

10

Last publish

Collaborators

  • sitapati