express-rate-limit vs limiter vs bottleneck vs ratelimiter vs p-limit vs rate-limiter-flexible
Node.js 限流库
express-rate-limitlimiterbottleneckratelimiterp-limitrate-limiter-flexible类似的npm包:

Node.js 限流库

限流库用于控制应用程序的请求速率,以防止过载和滥用。它们通过限制单位时间内的请求数量来保护服务器,确保系统的稳定性和可用性。这些库适用于需要管理请求频率的场景,如 API 访问、爬虫防护和用户行为控制等。

npm下载趋势

3 年

GitHub Stars 排名

统计详情

npm包名称
下载量
Stars
大小
Issues
发布时间
License
express-rate-limit25,144,9563,233141 kB83 天前MIT
limiter11,113,0451,558158 kB141 年前MIT
bottleneck10,649,7181,976-897 年前MIT
ratelimiter178,588725-116 年前MIT
p-limit02,81514.9 kB01 个月前MIT
rate-limiter-flexible03,485198 kB151 个月前ISC

功能对比: express-rate-limit vs limiter vs bottleneck vs ratelimiter vs p-limit vs rate-limiter-flexible

功能丰富性

  • express-rate-limit:

    express-rate-limit 提供了基本的速率限制功能,适合快速集成到 Express 应用中,但功能相对简单。

  • limiter:

    Limiter 是一个轻量级的库,功能简单,主要提供基本的速率限制。

  • bottleneck:

    Bottleneck 提供了多种限流策略,包括速率限制、并发限制和任务调度,适合复杂的应用场景。

  • ratelimiter:

    ratelimiter 提供了基本的限流功能,适合小型项目,功能较为简单。

  • p-limit:

    p-limit 专注于控制并发操作的数量,适合 Promise 处理场景,功能相对单一。

  • rate-limiter-flexible:

    rate-limiter-flexible 提供了灵活的配置选项,支持多种存储后端,功能非常强大。

易用性

  • express-rate-limit:

    express-rate-limit 的集成非常简单,几乎不需要额外的配置,适合快速上手。

  • limiter:

    Limiter 的使用非常简单,适合不需要复杂配置的用户。

  • bottleneck:

    Bottleneck 的 API 设计直观,易于使用,但由于功能丰富,可能需要一些时间来熟悉其所有选项。

  • ratelimiter:

    ratelimiter 的使用非常直接,适合初学者。

  • p-limit:

    p-limit 的 API 简洁明了,易于理解,适合快速实现并发控制。

  • rate-limiter-flexible:

    rate-limiter-flexible 的配置灵活,可能需要更多的学习和理解,但功能强大。

性能

  • express-rate-limit:

    express-rate-limit 性能良好,但在高并发情况下可能会遇到瓶颈。

  • limiter:

    Limiter 性能优秀,适合小型应用和简单的限流需求。

  • bottleneck:

    Bottleneck 在处理大量请求时表现良好,能够有效控制并发和速率,适合高负载场景。

  • ratelimiter:

    ratelimiter 性能一般,适合小型项目。

  • p-limit:

    p-limit 在处理并发请求时非常高效,能够有效控制并发数量。

  • rate-limiter-flexible:

    rate-limiter-flexible 设计用于高性能场景,能够处理大量请求,适合大规模应用。

扩展性

  • express-rate-limit:

    express-rate-limit 的扩展性有限,主要用于基本的速率限制,适合简单需求。

  • limiter:

    Limiter 的扩展性较低,主要用于基本的限流功能。

  • bottleneck:

    Bottleneck 提供了丰富的扩展选项,能够根据需求进行自定义配置,适合复杂的应用场景。

  • ratelimiter:

    ratelimiter 的扩展性较低,适合简单应用。

  • p-limit:

    p-limit 主要用于控制并发,扩展性有限,适合特定场景。

  • rate-limiter-flexible:

    rate-limiter-flexible 提供了高度的扩展性,支持多种存储后端和配置选项,适合复杂需求。

适用场景

  • express-rate-limit:

    适用于基于 Express 的 API 限流,快速集成和使用。

  • limiter:

    适用于简单的速率限制需求,轻量级应用。

  • bottleneck:

    适用于需要复杂限流策略的场景,如任务调度和高并发请求控制。

  • ratelimiter:

    适用于小型项目或简单的限流需求。

  • p-limit:

    适用于需要控制 Promise 并发的场景。

  • rate-limiter-flexible:

    适用于需要高性能和灵活配置的复杂应用场景。

如何选择: express-rate-limit vs limiter vs bottleneck vs ratelimiter vs p-limit vs rate-limiter-flexible

  • express-rate-limit:

    选择 express-rate-limit 如果你在使用 Express 框架,并且需要一个简单易用的中间件来限制 API 请求速率,适合快速集成和使用。

  • limiter:

    选择 Limiter 如果你需要一个轻量级的限流库,适合简单的速率限制需求,且不需要复杂的配置和功能。

  • bottleneck:

    选择 Bottleneck 如果你需要一个功能丰富且灵活的限流解决方案,支持多种限流策略(如并发限制和速率限制),并且能够处理复杂的任务调度。

  • ratelimiter:

    选择 ratelimiter 如果你需要一个简单的限流实现,适合小型项目或不需要复杂功能的应用。

  • p-limit:

    选择 p-limit 如果你需要控制并发操作的数量,特别是在处理 Promise 时,适合需要限制并发请求的场景。

  • rate-limiter-flexible:

    选择 rate-limiter-flexible 如果你需要一个灵活的限流解决方案,支持多种存储后端(如 Redis 和 MongoDB),并且需要高性能和高可配置性的限流策略。

express-rate-limit的README

express-rate-limit

tests npm version npm downloads license

Basic rate-limiting middleware for Express. Use to limit repeated requests to public APIs and/or endpoints such as password reset. Plays nice with express-slow-down and ratelimit-header-parser.

Usage

The full documentation is available on-line.

import { rateLimit } from 'express-rate-limit'

const limiter = rateLimit({
	windowMs: 15 * 60 * 1000, // 15 minutes
	limit: 100, // Limit each IP to 100 requests per `window` (here, per 15 minutes).
	standardHeaders: 'draft-8', // draft-6: `RateLimit-*` headers; draft-7 & draft-8: combined `RateLimit` header
	legacyHeaders: false, // Disable the `X-RateLimit-*` headers.
	ipv6Subnet: 56, // Set to 60 or 64 to be less aggressive, or 52 or 48 to be more aggressive
	// store: ... , // Redis, Memcached, etc. See below.
})

// Apply the rate limiting middleware to all requests.
app.use(limiter)

Data Stores

The rate limiter comes with a built-in memory store, and supports a variety of external data stores.

Configuration

All function options may be async. Click the name for additional info and default values.

OptionTypeRemarks
windowMsnumberHow long to remember requests for, in milliseconds.
limitnumber | functionHow many requests to allow.
messagestring | json | functionResponse to return after limit is reached.
statusCodenumberHTTP status code after limit is reached (default is 429).
handlerfunctionFunction to run after limit is reached (overrides message and statusCode settings, if set).
legacyHeadersbooleanEnable the X-Rate-Limit header.
standardHeaders'draft-6' | 'draft-7' | 'draft-8'Enable the Ratelimit header.
identifierstring | functionName associated with the quota policy enforced by this rate limiter.
storeStoreUse a custom store to share hit counts across multiple nodes.
passOnStoreErrorbooleanAllow (true) or block (false, default) traffic if the store becomes unavailable.
keyGeneratorfunctionIdentify users (defaults to IP address).
ipv6Subnetnumber (32-64) | function | falseHow many bits of IPv6 addresses to use in default keyGenerator
requestPropertyNamestringAdd rate limit info to the req object.
skipfunctionReturn true to bypass the limiter for the given request.
skipSuccessfulRequestsbooleanUncount 1xx/2xx/3xx responses.
skipFailedRequestsbooleanUncount 4xx/5xx responses.
requestWasSuccessfulfunctionUsed by skipSuccessfulRequests and skipFailedRequests.
validateboolean | objectEnable or disable built-in validation checks.

Thank You

Sponsored by Zuplo a fully-managed API Gateway for developers. Add dynamic rate-limiting, authentication and more to any API in minutes. Learn more at zuplo.com

zuplo-logo


Thanks to Mintlify for hosting the documentation at express-rate-limit.mintlify.app

Create your docs today


Finally, thank you to everyone who's contributed to this project in any way! 🫶

Issues and Contributing

If you encounter a bug or want to see something added/changed, please go ahead and open an issue! If you need help with something, feel free to start a discussion!

If you wish to contribute to the library, thanks! First, please read the contributing guide. Then you can pick up any issue and fix/implement it!

License

MIT © Nathan Friedly, Vedant K