我的任务是为可大规模扩展的分布式共享内存 (DSM) 应用程序构建原型。原型仅用作概念验证,但我想通过挑选稍后将在实际解决方案中使用的组件来最有效地度过我的时间。
该解决方案的目的是从外部源获取数据输入,将其搅动并使结果可用于多个前端。这些“前端”只会从缓存中获取数据并提供服务,而无需额外处理。对这些数据的前端点击量实际上可以达到每秒数百万。
数据本身非常不稳定;它可以(并且确实)迅速改变。然而,在处理和缓存最新的数据之前,前端应该看到“旧”数据。处理和写入由单个(冗余)节点完成,而其他节点仅读取数据。换句话说:没有通读行为。
我正在研究像memcached这样的解决方案,但是这个特定的解决方案不能满足我们下面列出的所有要求:
- 该解决方案必须至少具有Java 客户端 API,该 API 维护得相当好,因为应用程序的其余部分是用 Java 编写的,而且我们是经验丰富的 Java 开发人员;
- 解决方案必须是完全弹性的:应该可以添加新节点而无需重新启动集群中的其他节点;
- 该解决方案必须能够处理故障转移。是的,我意识到这意味着一些开销,但整体提供的数据大小并不大(最大 1G),所以这应该不是问题。“故障转移”是指无缝执行,无需硬编码/更改服务器 IP 地址,就像在节点出现故障时在 memcached 客户端中一样;
- 理想情况下,应该可以指定数据重叠的程度(例如,在 DSM 集群中应该存储多少相同数据的副本);
- 不需要永久存储所有数据,但可能需要对某些数据进行后处理(例如,序列化到数据库)。
- 价格。显然我们更喜欢免费/开源,但如果解决方案值得,我们很乐意支付合理的金额。无论如何,必须支付 24 小时/天的支持合同。
- 整个事情都必须托管在我们的数据中心中,因此像 Amazon SimpleDB 这样的 SaaS 产品超出了范围。如果没有其他选项可用,我们只会考虑这一点。
- 理想情况下,解决方案将是严格一致的(如在 CAP 中);然而,最终的一致性可以被视为一种选择。
提前感谢您的任何想法。