1

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

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

很多例子说明 Redis 对这类任务有多好,但是因为我不想为其他任务放弃 CouchDB,这意味着我基本上将运行(并支持)两个数据库(1 个用于大多数数据,1 个用于速率限制)等等......

  1. 与 Redis 一起运行 CouchDB 是否闻所未闻?
  2. CouchDB 本身是否适合处理速率限制?
4

2 回答 2

6

与 Redis 一起运行 CouchDB 是否闻所未闻?

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

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

这是Redis 与 CouchDB 一起使用的示例

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

CouchDB 有许多有用的特性来实现 Chris O'Hara 的文章中描述的速率限制策略。例如,它支持对多个文档的批量操作(具有可选的原子性)。“桶跨度”可以存储在单个文档中。可以使用更新处理程序来覆盖计数器的就地增量。

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

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

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

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

于 2012-06-06T19:59:27.053 回答
0

您可以使用 Memcached 进行速率限制 - 正如您所提到的,它有一个很好的计数器增量命令,而且过时的数据会在适当的时候自动从缓存中清除,因此它具有 Redis 对这个应用程序的所有好处,而没有烦人的功能重复(和复杂性)在 CouchDB 之上运行 Redis 会带来。

http://simonwillison.net/2009/jan/7/ratelimitcache/

您可以很容易地将 memcached 添加到您自己的设置中,或者您可以调查 CouchBase,其当前的服务器产品集成了 CouchDB 派生数据库和 Memcached 兼容性:

http://www.couchbase.com/memcached

就我个人而言,我不喜欢 Couchbase 从 CouchDB 分叉的方式,但对于您的应用程序来说,它可能是一个完美的选择。

于 2012-06-12T05:02:52.997 回答