【问题标题】:How to cache over multiple nodes for scalability如何在多个节点上缓存以实现可扩展性
【发布时间】:2012-02-28 06:34:00
【问题描述】:

仅供参考 - 我是新成员,相当新的程序员,这是我在 stackoverflow 上的第一篇文章。

对于我的网络应用程序,我一直在编写自己的数据缓存层;这样做时,应用程序已设置为仅在缓存中未找到数据时才从数据库中获取数据。随着时间的推移,该应用程序会从缓存中删除陈旧的数据,以尽量减少 RAM 中保存的数据量。如果我的 webapp 驻留在单个服务器上,这对我来说可以很好地限制对数据库服务器发出的只读请求的数量。现在我正在考虑在许多节点上对我的 webapp 进行负载平衡,并且我想保持缓存实现不变。我要解决的问题是如何使不同的 webapp 节点缓存层保持同步。

问题场景可能是典型的:

  1. 人员 A 读取节点 #1 上记录 #1 的版本 #1;缓存在节点 #1 上更新。
  2. 人员 B 读取节点 #2 上记录 #1 的版本 #1;缓存在节点 #2 上更新。
  3. 人员 A 更新节点 #1 上的记录 #1;
    • 没有从 db 读取数据,因为它在缓存中。
    • 缓存已更新为记录 #1 的版本 #2。
    • 版本 #2 数据写入发送到 db。
  4. 人员 B 在节点 #2 上读取记录 #1;
    • 未从 db 读取数据,因为它在缓存中,导致版本 #1,该版本现已过时。

所以我想到了一些想法。

  1. 我可以放弃缓存,每次读/写都来自 db(显然我不同意)。
  2. 我可以实现某种形式的一致散列。即我可以将所有记录#1 项目发送到节点#1。但是我发现有需要在每个节点之间共享的数据,例如用户配置文件数据(即当记录#1 更新时,用户配置文件也需要更新,所以这需要进入其他节点缓存以及让我在配置文件记录方面遇到同样的问题)。
  3. 我可以对记录使用一致的哈希,并以某种方式拆分用户数据,这样数据层就不会被缓存(仍然不理想)。
  4. 我可以学习 erlang 并开始在缓存层之间发送消息,但是我尝试了 erlang,但它从未真正使用过(可能是理想的技术解决方案,但我宁愿不学习 erlang - 哈哈)。

所以这是我第一次考虑这么多。像我这样一个隐士般的爱好程序员应该知道的众所周知的策略吗?想法、解决方案?

注意事项: - 我的主要语言是 Clojure,尽管这不一定与手头的问题相关。 - 我已经在使用 NoSQL 数据库了。

谢谢。

【问题讨论】:

    标签: caching scalability


    【解决方案1】:

    如果您真的对实现自己的缓存解决方案感兴趣并希望保持节点同步,那么您可能希望向您的系统添加一些外部缓存失效接口。

    例如,如果您的 NoSQL 数据库支持更新后挂钩,它可以向所有节点发出 multicast UDP 命令,使某些值不再有效。或者,您可以为此使用某种消息队列(例如 ActiveMQRabbitMQ),但这可能有点过头了。

    由于 Clojure 是一种基于 JVM 的语言,您可以只使用一些现有的 JVM 缓存解决方案,例如 Ehcache。如果您不是出于教育目的实施此缓存系统,那么这样做可以为您节省大量时间和精力。

    顺便说一句,学习 Erlang 是有趣和有用的经验的完美结合。我从不后悔我花了我生命中的一部分时间来适应它。在你的情况下,它也一定会得到回报。

    【讨论】:

      猜你喜欢
      • 2021-09-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-11-28
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多