【发布时间】:2012-02-28 06:34:00
【问题描述】:
仅供参考 - 我是新成员,相当新的程序员,这是我在 stackoverflow 上的第一篇文章。
对于我的网络应用程序,我一直在编写自己的数据缓存层;这样做时,应用程序已设置为仅在缓存中未找到数据时才从数据库中获取数据。随着时间的推移,该应用程序会从缓存中删除陈旧的数据,以尽量减少 RAM 中保存的数据量。如果我的 webapp 驻留在单个服务器上,这对我来说可以很好地限制对数据库服务器发出的只读请求的数量。现在我正在考虑在许多节点上对我的 webapp 进行负载平衡,并且我想保持缓存实现不变。我要解决的问题是如何使不同的 webapp 节点缓存层保持同步。
问题场景可能是典型的:
- 人员 A 读取节点 #1 上记录 #1 的版本 #1;缓存在节点 #1 上更新。
- 人员 B 读取节点 #2 上记录 #1 的版本 #1;缓存在节点 #2 上更新。
- 人员 A 更新节点 #1 上的记录 #1;
- 没有从 db 读取数据,因为它在缓存中。
- 缓存已更新为记录 #1 的版本 #2。
- 版本 #2 数据写入发送到 db。
- 人员 B 在节点 #2 上读取记录 #1;
- 未从 db 读取数据,因为它在缓存中,导致版本 #1,该版本现已过时。
所以我想到了一些想法。
- 我可以放弃缓存,每次读/写都来自 db(显然我不同意)。
- 我可以实现某种形式的一致散列。即我可以将所有记录#1 项目发送到节点#1。但是我发现有需要在每个节点之间共享的数据,例如用户配置文件数据(即当记录#1 更新时,用户配置文件也需要更新,所以这需要进入其他节点缓存以及让我在配置文件记录方面遇到同样的问题)。
- 我可以对记录使用一致的哈希,并以某种方式拆分用户数据,这样数据层就不会被缓存(仍然不理想)。
- 我可以学习 erlang 并开始在缓存层之间发送消息,但是我尝试了 erlang,但它从未真正使用过(可能是理想的技术解决方案,但我宁愿不学习 erlang - 哈哈)。
所以这是我第一次考虑这么多。像我这样一个隐士般的爱好程序员应该知道的众所周知的策略吗?想法、解决方案?
注意事项: - 我的主要语言是 Clojure,尽管这不一定与手头的问题相关。 - 我已经在使用 NoSQL 数据库了。
谢谢。
【问题讨论】:
标签: caching scalability