在高流量期间使用 couchdb 进行缓存和可扩展性

Posted

技术标签:

【中文标题】在高流量期间使用 couchdb 进行缓存和可扩展性【英文标题】:Using couchdb for caching and scalability during high traffic periods 【发布时间】:2014-09-04 16:52:34 【问题描述】:

我们正在开发一个售票电子商务系统。我们经常在促销期间遇到大量请求。

我们使用 couchdb 进行缓存,并使用 SQL 服务器数据库作为我们的数据存储。

我们正在处理的一种情况是,如果某个活动的所有门票都已售出,我们会希望阻止任何用户购买它们。

为了让我们能够做到这一点,我们必须在每次销售时查询数据库,这太糟糕了。

我的想法是最初查询某个活动的门票数量并将其存储在 couchdb 中,并且在每次销售时,我们会减少 couchdb 记录的可用门票。当 couchdb 记录为零时,我们会更新数据库并阻止任何用户购买该活动的任何门票。

您能否验证我的想法,或者如果您有更好的解决方案,请详细说明。

谢谢

【问题讨论】:

为什么在从整数中减去 1 并将其持久存储时,couchdb 会比 mssql 更有效? @IfLoop 我只是询问是否是,以及处理这种情况的最佳方法是什么,如果您有其他方法,请随时发表评论 认为更适合这样的场景是例如Redis 或 Aerospike,两者都可以选择在给定特定键的情况下增加值。 【参考方案1】:

你的方法没有错。您可以按照您在问题中描述的方式进行操作,这将非常好。我个人更喜欢不同的方法。考虑一个事件:


  "_id": 8e23456781b5567890,
  "event":"The rat pack symphony live from New york",
  "tickets" : 6000

我们不会在购买新票时减少此票务计数器,而是添加新票证。


  "_id": 7c665934r8206513,
   "sold_at":1409937545893,
   "event_id": "8e23456781b5567890",
    "sold_to":"some_one"
...other meta data


然后我们创建一个像这样的视图:

地图

function(doc)
if(doc.event_id)
emit(doc.event_id,null);
  

减少

_count

然后使用key="event_id_for_which_you_want_tickets_sold"&reduce=true 查询此视图以获取售出的门票数量。

为什么会这样?

因为它允许您存储有关已售票的更多信息,而不是仅执行counter -1。稍后您可以对实际售出的门票进行某种分析,这可能有助于您更好地了解您的应用程序。

关于缓存

虽然 couchdb 在缓存方面肯定是一个不错的选择,但对于这个特定的用例,我认为像 redis 这样的东西会是一个更好的选择。

【讨论】:

事件溯源/记录是一个不错的概念。不知道“真实”计数在该域中的重要性,但请记住,CouchDB 二级索引最终将保持一致。同意改用 Aerospike 或 Redis 之类的东西。

以上是关于在高流量期间使用 couchdb 进行缓存和可扩展性的主要内容,如果未能解决你的问题,请参考以下文章

在高流量网站中进行规范化或非规范化

关于亿级流量网站架构一书缓存机制的探讨

在 couchdb 从 1.6.1 迁移到 2.3.1 期间,由于内存问题 couchup 实用程序需要大量时间重建视图

为啥在高流量网站中使用 Session 存储状态是个坏主意?

在高流量环境中使用 kafka producer 时的连接管理

在高流量场景中使用 ASP.NET 中的 ThreadPool.QueueUserWorkItem