在高流量期间使用 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 存储状态是个坏主意?