couchdb - 速率限制 - 将 CouchDB 与 Redis 一起使用或单独使用 CouchDB

标签 couchdb redis rate-limiting

我编写了一个带有 CouchDB 后端的应用程序。我在 CouchDB 上投入了大量时间,所以我不愿意将所有内容都转移到不同的 NoSQL 数据库(如 Redis)。

问题是我现在需要实现速率限制(基于 IP 地址)功能。

plenty of examples关于 Redis 对于这种任务有多好,但是因为我不想为其他任务放弃 CouchDB 这意味着我基本上会运行(并支持)两个数据库(1 个用于大多数数据,1 个用于速率限制)等等...

  1. 将 CouchDB 与 Redis 结合使用是否闻所未闻?
  2. CouchDB 本身适合处理速率限制吗?

最佳答案

将 CouchDB 与 Redis 结合使用是否闻所未闻?

Redis 通常用于补充其他存储解决方案(MySQL、PostgreSQL、MongoDB、CouchDB 等...)。与许多其他 NoSQL 解决方案一样,Redis 并不适用于所有 类型的工作负载或情况。 Redis 的作者是务实和开放的人,当他们更适应这种情况时,他们通常会建议使用其他解决方案而不是 Redis。

因此,Redis 是一个很好的团队成员,并且通常很容易集成到现有的基础架构中。

这里是 an example of usage of Redis with CouchDB .

CouchDB 本身适合处理速率限制吗?

CouchDB 有许多有用的功能来实现 Chris O'Hara 的文章中描述的速率限制策略。例如,它支持 bulk operations在几个文档上(具有可选的原子性)。 “桶跨度”可以存储在单个文档中。使用 update handlers 可以覆盖计数器的就地增量.

IMO,主要缺少的功能是自动项目过期(CouchDB 不提供 AFAIK)。因此,您必须设计一种巧妙的机制来清除 CouchDB 上的过时数据。

主要问题是 CouchDB 并不是真正为这种工作负载设计的:它是一个面向日志结构文档的数据库。每次必须增加计数器时,它会涉及 JSON 解包/打包操作、要执行的一些 Javascript 代码以及在仅附加文件中编写整个文档的新修订版。您可以找到一篇描述 CouchDB 如何存储其数据的好文章 here .

我怀疑在 CouchDB 之上实现的速率限制策略不会很好地扩展(太多的 I/O、太多的 CPU 消耗、低效的网络协议(protocol))。例如,CouchDB 是一个 RESTful 服务器;我不愿意启动客户端 HTTP 操作(对 CouchDB 的 REST 查询)来限制我系统的每个传入 HTTP 查询的速率。

Redis 更适合这种工作负载(快速、内存中、无 I/O、高效的客户端协议(protocol)、无 JSON 解析/格式化、增量是 native 原子操作等......)

关于couchdb - 速率限制 - 将 CouchDB 与 Redis 一起使用或单独使用 CouchDB,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10919625/

相关文章:

python - Redis Python - 如何在python中根据特定模式删除所有键,无需python迭代

node.js - Nginx - 源服务器响应代码为 401 时的速率限制

amazon-ec2 - boto ElasticMapReduce throttle 和速率限制

couchdb - PouchDB 和 SvelteKit

mongodb - 何时使用主-主复制 VS 主-从复制

CouchDB 简单查找

Go:通过 channel 传递函数

couchdb - 向 couchdb 设计文档添加注释

.net - Redis 副本处理失败的连接字符串

django - celery celerybeat 不滴答作响