基于客观信息的新闻源缓存解决方案?

时间:2014-07-21 03:45:44

标签: ruby-on-rails mongodb caching redis memcached

我需要一些有关缓存可更新新闻源的建议。

请,不," Fanboy"或者回答 - 不要寻找关于"最佳"的主观意见。系统,只是寻求符合以下要求的技术建议。所以,请分享您在现实世界中使用的内容,即使您更喜欢其他解决方案。

我有一个基于rails的新闻源(Neo4j数据库),虽然性能很好,但我希望将其缓存,以免服务器因服务于实时源而陷入困境。

要求:

  • 易于碎片更新:我想轻松更新部分用户的新闻源 基于特定触发器的缓存,例如,当用户编辑时 他们的状态更新 - 我不想重新生成用户的全部内容 缓存中的新闻提要,而不是我只想更新那个 "片段",或者如果您愿意,可以选择特定用户的Feed。而且我不想跳过篮球试图这样做。

  • 删除:如果有人删除某项活动,我只想删除该活动 在系统最终刷新该用户的整个Feed之前,从他们的新闻Feed中获取。

  • EASY RETRIEVAL:我想以这样的方式检索缓存 控制器/模型可以轻松读取它们并将其移交给视图而不需要 任何修改意见。

  • PERSISTENCE:如果我需要重新启动缓存,它应该加载 从磁盘缓存。这意味着它应该将缓存的条目保存到磁盘。

  • SPEED:鉴于它必须能够更新缓存的片段 新闻提要,将会出现某种性能影响。但 我需要速度..

哪些缓存技术提供此类功能? Redis,MongoDB,Memcached会满足这些要求吗?还有哪些其他选择? (CouchDB,东京文件柜等)..

在Stack Overflow的精神中,我并没有要求对你更喜欢什么以及为什么要求主观意见,我只是要求你可能在生产中实际使用的候选系统来完成缓存和更新缓存的新闻源(或类似的东西)。

1 个答案:

答案 0 :(得分:4)

由于它主要是基于意见的主题,因此这个答案将是主观的。但无论如何我都会尝试保持事实。

要注意的第一点是您的要求往往是相互排斥的。正如我们在法国所说,你想要黄油,黄油的钱和农夫的妻子(好吧,这可能是一个糟糕的翻译)。

例如,要支持简单的片段更新和正确删除,您需要在缓存中使用某种数据结构。我对Rails没有任何了解,但我想它会对数据访问模式以及控制器/模型的定义产生影响。换句话说,它将增加数据检索的复杂性。您需要速度,但与此同时,您还需要持久性,以及非平凡的数据访问模式。好吧,你无法同时获得所有东西,你必须做出选择,并优先考虑这些要求。

我的第二点是缓存仅在缓存和底层存储引擎之间的性能方面存在显着差异时才有用。由于您已经使用了相当高效的NoSQL引擎(Neo4j),因此您只需要考虑真正为原始性能设计的引擎(即低延迟存储):memcachedredis,{{ 3}},couchbase,用来命名成熟的开源产品。如果您感觉更冒险,您还可以考虑其他项目,例如aerospiketarantool

还有许多商业产品,但我不确定它们是否提供Ruby客户端(TIBCO ActiveSpaces,Gigaspaces,Red-Hat Infinispan等......)

其他NoSQL引擎(MongoDB,Cassandra,CouchDB等)还有其他有趣的属性,但是对于混合的r / w工作负载,它们不会在原始性能上击败这些解决方案。在这里,我只讨论原始性能(即高吞吐量时的低延迟),而不是可扩展性。

实际上,可以排除memcached,因为它不支持持久性。我想说你可以用Redis,Couchbase或Aerospike实现你想要的东西,但是Aerospike 3似乎还没有正式支持的Ruby客户端。

Redis和Aerospike比Couchbase更容易支持多个数据访问路径(即一致的索引数据结构)。使用Couchbase或Aerospike比使用Redis更容易实现高可用性。使用Redis和Couchbase实现缓存行为比使用Aerospike更容易。

一些一般性建议:

  • 在添加额外图层的复杂性之前,请确保Neo4j确实存在性能或可伸缩性问题。复杂性就像牙膏一样:一旦它从管中出来,就不能把它放回去。

  • 数据访问模式应在设计时列出,并且必须由所选引擎中的相应数据结构支持。

  • 也必须考虑硬件占用空间。如果您只有几个盒子,请选择像Redis这样的轻量级解决方案。

  • 持久性,你还需要考虑HA。如果缓存层丢失会发生什么?实际上,我会说,对于缓存,HA可能比持久性更重要。

最后,您还需要定义所需的确切缓存语义(更新行为,失效行为,缓存未命中管理,TTL策略,如果有的话等等)。我列出的3个NoSQL引擎提供了一些工具来帮助实现各种策略,但它们都不支持现成的策略。这将需要一些编码来实现它。