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

速率限制-将CouchDB与Redis或CouchDB单独使用,couchdb,redis,rate-limiting,Couchdb,Redis,Rate Limiting,我已经用CouchDB后端编写了一个应用程序。我在CouchDB上投入了大量时间,因此我不愿意将所有内容都转移到不同的NoSQL数据库(如Redis) 问题是我现在需要实现一个速率限制(基于IP地址)特性 关于Redis在这类任务中有多好,还有很多争论,但是因为我不想在其他任务中删除CouchDB,这意味着我将运行(并支持)两个数据库(一个用于大多数数据,一个用于速率限制),所以 CouchDB与Redis协同运行是否闻所未闻 CouchDB本身是否适合处理速率限制 是否将CouchDB与Red

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

问题是我现在需要实现一个速率限制(基于IP地址)特性

关于Redis在这类任务中有多好,还有很多争论,但是因为我不想在其他任务中删除CouchDB,这意味着我将运行(并支持)两个数据库(一个用于大多数数据,一个用于速率限制),所以

  • CouchDB与Redis协同运行是否闻所未闻
  • CouchDB本身是否适合处理速率限制

  • 是否将CouchDB与Redis联合运行,这是前所未闻的?

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

    因此,Redis是一个很好的团队合作伙伴,通常很容易集成到现有的基础架构中

    这是

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

    CouchDB有许多有用的特性来实现Chris O'Hara文章中描述的速率限制策略。例如,它支持多个文档(可选原子性)。“bucket span”可以存储在单个文档中。计数器的就地增量可以通过使用来实现

    在我看来,主要缺少的功能是自动物品过期(CouchDB不提供AFAIK)。因此,您必须设计一种聪明的机制,在CouchDB之上消除过时的数据

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

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


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

    与Redis一起运行CouchDB,这是闻所未闻的?

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

    因此,Redis是一个很好的团队合作伙伴,通常很容易集成到现有的基础架构中

    这是

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

    CouchDB有许多有用的特性来实现Chris O'Hara文章中描述的速率限制策略。例如,它支持多个文档(可选原子性)。“bucket span”可以存储在单个文档中。计数器的就地增量可以通过使用来实现

    在我看来,主要缺少的功能是自动物品过期(CouchDB不提供AFAIK)。因此,您必须设计一种聪明的机制,在CouchDB之上消除过时的数据

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

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


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

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

    您可以很容易地将memcached添加到自己的设置中,也可以调查CouchBase,其当前服务器产品将CouchDB派生数据库与memcached兼容:


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

    您可以使用Memcached进行速率限制-正如您所提到的,它有一个很好的计数器增量命令,并且过时的数据会在适当的时候自动从缓存中清除,因此,它拥有Redis在该应用程序中的所有好处,而无需烦人的功能复制